Merge branch 'main' into settings

This commit is contained in:
Anthony Stirling 2025-07-28 16:03:21 +01:00 committed by GitHub
commit a0445cebfe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 460 additions and 378 deletions

View File

@ -7,6 +7,18 @@ on:
pull_request: pull_request:
branches: ["main"] branches: ["main"]
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -6,6 +6,18 @@ on:
paths: paths:
- "app/core/src/main/resources/messages_*.properties" - "app/core/src/main/resources/messages_*.properties"
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read # Allow read access to repository content contents: read # Allow read access to repository content

View File

@ -7,6 +7,18 @@ on:
paths: paths:
- "build.gradle" - "build.gradle"
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -7,6 +7,18 @@ on:
- master - master
- main - main
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -9,6 +9,18 @@ on:
- main - main
workflow_dispatch: workflow_dispatch:
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
pull-requests: read pull-requests: read
actions: read actions: read

View File

@ -6,6 +6,18 @@ on:
branches: branches:
- master - master
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -12,6 +12,18 @@ on:
- "app/core/src/main/resources/static/3rdPartyLicenses.json" - "app/core/src/main/resources/static/3rdPartyLicenses.json"
- "scripts/ignore_translation.toml" - "scripts/ignore_translation.toml"
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -4,6 +4,18 @@ on:
push: push:
branches: ["master", "UITest", "testdriver"] branches: ["master", "UITest", "testdriver"]
# cancel in-progress jobs if a new job is triggered
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
# or a pull request is updated.
# It helps to save resources and time by ensuring that only the latest commit is built and tested
# This is particularly useful for long-running jobs that may take a while to complete.
# The `group` is set to a combination of the workflow name, event name, and branch name.
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }}
cancel-in-progress: true
permissions: permissions:
contents: read contents: read

View File

@ -25,12 +25,12 @@ class CustomHtmlSanitizerTest {
SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class); SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class);
stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class); stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class);
stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class); stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class);
// Allow all URLs by default for basic tests // Allow all URLs by default for basic tests
when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true); when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true);
when(mockApplicationProperties.getSystem()).thenReturn(mockSystem); when(mockApplicationProperties.getSystem()).thenReturn(mockSystem);
when(mockSystem.getDisableSanitize()).thenReturn(false); // Enable sanitization for tests when(mockSystem.getDisableSanitize()).thenReturn(false); // Enable sanitization for tests
customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties); customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties);
} }

View File

@ -47,11 +47,11 @@ class EmlToPdfTest {
SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class); SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class);
stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class); stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class);
stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class); stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class);
when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true); when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true);
when(mockApplicationProperties.getSystem()).thenReturn(mockSystem); when(mockApplicationProperties.getSystem()).thenReturn(mockSystem);
when(mockSystem.getDisableSanitize()).thenReturn(false); when(mockSystem.getDisableSanitize()).thenReturn(false);
customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties); customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties);
} }
@ -588,7 +588,7 @@ class EmlToPdfTest {
} }
@Test @Test
@Disabled("Complex static mocking - temporarily disabled while refactoring") @Disabled("Complex static mocking - temporarily disabled while refactoring")
@DisplayName("Should convert EML to PDF with attachments when requested") @DisplayName("Should convert EML to PDF with attachments when requested")
void convertEmlToPdfWithAttachments() throws Exception { void convertEmlToPdfWithAttachments() throws Exception {
String boundary = "----=_Part_1234567890"; String boundary = "----=_Part_1234567890";
@ -671,7 +671,7 @@ class EmlToPdfTest {
@Test @Test
@Disabled("Complex static mocking - temporarily disabled while refactoring") @Disabled("Complex static mocking - temporarily disabled while refactoring")
@DisplayName("Should handle errors during EML to PDF conversion") @DisplayName("Should handle errors during EML to PDF conversion")
void handleErrorsDuringConversion() { void handleErrorsDuringConversion() {
String emlContent = String emlContent =
createSimpleTextEmail("from@test.com", "to@test.com", "Subject", "Body"); createSimpleTextEmail("from@test.com", "to@test.com", "Subject", "Body");

View File

@ -26,11 +26,11 @@ public class FileToPdfTest {
SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class); SsrfProtectionService mockSsrfProtectionService = mock(SsrfProtectionService.class);
stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class); stirling.software.common.model.ApplicationProperties mockApplicationProperties = mock(stirling.software.common.model.ApplicationProperties.class);
stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class); stirling.software.common.model.ApplicationProperties.System mockSystem = mock(stirling.software.common.model.ApplicationProperties.System.class);
when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true); when(mockSsrfProtectionService.isUrlAllowed(org.mockito.ArgumentMatchers.anyString())).thenReturn(true);
when(mockApplicationProperties.getSystem()).thenReturn(mockSystem); when(mockApplicationProperties.getSystem()).thenReturn(mockSystem);
when(mockSystem.getDisableSanitize()).thenReturn(false); when(mockSystem.getDisableSanitize()).thenReturn(false);
customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties); customHtmlSanitizer = new CustomHtmlSanitizer(mockSsrfProtectionService, mockApplicationProperties);
} }

View File

@ -5,135 +5,135 @@
language.direction=ltr language.direction=ltr
# Language names for reuse throughout the application # Language names for reuse throughout the application
lang.afr=Afrikaans lang.afr=南非荷蘭語
lang.amh=Amharic lang.amh=阿姆哈拉語
lang.ara=Arabic lang.ara=阿拉伯文
lang.asm=Assamese lang.asm=阿薩姆語
lang.aze=Azerbaijani lang.aze=亞塞拜然語
lang.aze_cyrl=Azerbaijani (Cyrillic) lang.aze_cyrl=亞塞拜然語(西里爾字母)
lang.bel=Belarusian lang.bel=白俄羅斯語
lang.ben=Bengali lang.ben=孟加拉語
lang.bod=Tibetan lang.bod=藏文
lang.bos=Bosnian lang.bos=波士尼亞語
lang.bre=Breton lang.bre=布列塔尼語
lang.bul=Bulgarian lang.bul=保加利亞語
lang.cat=Catalan lang.cat=加泰隆尼亞語
lang.ceb=Cebuano lang.ceb=宿霧語
lang.ces=Czech lang.ces=捷克語
lang.chi_sim=Chinese (Simplified) lang.chi_sim=簡體中文
lang.chi_sim_vert=Chinese (Simplified, Vertical) lang.chi_sim_vert=簡體中文(直書)
lang.chi_tra=Chinese (Traditional) lang.chi_tra=繁體中文
lang.chi_tra_vert=Chinese (Traditional, Vertical) lang.chi_tra_vert=繁體中文(直書)
lang.chr=Cherokee lang.chr=切羅基語
lang.cos=Corsican lang.cos=科西嘉語
lang.cym=Welsh lang.cym=威爾斯語
lang.dan=Danish lang.dan=丹麥文
lang.dan_frak=Danish (Fraktur) lang.dan_frak=丹麥文(德文尖角體)
lang.deu=German lang.deu=德文
lang.deu_frak=German (Fraktur) lang.deu_frak=德文(德文尖角體)
lang.div=Divehi lang.div=迪維希語
lang.dzo=Dzongkha lang.dzo=宗卡文(不丹語)
lang.ell=Greek lang.ell=希臘文
lang.eng=English lang.eng=英文
lang.enm=English, Middle (1100-1500) lang.enm=中古英文(約西元 1100-1500 年)
lang.epo=Esperanto lang.epo=世界語
lang.equ=Math / equation detection module lang.equ=數學/方程式偵測模組
lang.est=Estonian lang.est=愛沙尼亞語
lang.eus=Basque lang.eus=巴斯克語
lang.fao=Faroese lang.fao=法羅語
lang.fas=Persian lang.fas=波斯文
lang.fil=Filipino lang.fil=菲律賓語
lang.fin=Finnish lang.fin=芬蘭文
lang.fra=French lang.fra=法文
lang.frk=Frankish lang.frk=法蘭克語
lang.frm=French, Middle (ca.1400-1600) lang.frm=中古法文(約西元 1400-1600 年)
lang.fry=Western Frisian lang.fry=西弗里斯蘭語
lang.gla=Scottish Gaelic lang.gla=蘇格蘭蓋爾語
lang.gle=Irish lang.gle=愛爾蘭語
lang.glg=Galician lang.glg=加利西亞語
lang.grc=Ancient Greek lang.grc=古希臘文
lang.guj=Gujarati lang.guj=古吉拉特語
lang.hat=Haitian, Haitian Creole lang.hat=海地克里奧爾語
lang.heb=Hebrew lang.heb=希伯來文
lang.hin=Hindi lang.hin=印地語
lang.hrv=Croatian lang.hrv=克羅埃西亞語
lang.hun=Hungarian lang.hun=匈牙利文
lang.hye=Armenian lang.hye=亞美尼亞文
lang.iku=Inuktitut lang.iku=伊努克提圖特語
lang.ind=Indonesian lang.ind=印尼文
lang.isl=Icelandic lang.isl=冰島文
lang.ita=Italian lang.ita=義大利文
lang.ita_old=Italian (Old) lang.ita_old=古義大利文
lang.jav=Javanese lang.jav=爪哇語
lang.jpn=Japanese lang.jpn=日文
lang.jpn_vert=Japanese (Vertical) lang.jpn_vert=日文(直書)
lang.kan=Kannada lang.kan=卡納達語
lang.kat=Georgian lang.kat=喬治亞語
lang.kat_old=Georgian (Old) lang.kat_old=古喬治亞語
lang.kaz=Kazakh lang.kaz=哈薩克語
lang.khm=Central Khmer lang.khm=高棉語
lang.kir=Kirghiz, Kyrgyz lang.kir=吉爾吉斯語
lang.kmr=Northern Kurdish lang.kmr=北庫德語(庫爾曼吉語)
lang.kor=Korean lang.kor=韓文
lang.kor_vert=Korean (Vertical) lang.kor_vert=韓文(直書)
lang.lao=Lao lang.lao=寮文
lang.lat=Latin lang.lat=拉丁文
lang.lav=Latvian lang.lav=拉脫維亞語
lang.lit=Lithuanian lang.lit=立陶宛語
lang.ltz=Luxembourgish lang.ltz=盧森堡語
lang.mal=Malayalam lang.mal=馬拉雅拉姆語
lang.mar=Marathi lang.mar=馬拉地語
lang.mkd=Macedonian lang.mkd=馬其頓語
lang.mlt=Maltese lang.mlt=馬爾他語
lang.mon=Mongolian lang.mon=蒙古文
lang.mri=Maori lang.mri=毛利語
lang.msa=Malay lang.msa=馬來文
lang.mya=Burmese lang.mya=緬甸文
lang.nep=Nepali lang.nep=尼泊爾語
lang.nld=Dutch; Flemish lang.nld=荷蘭文;佛萊明語
lang.nor=Norwegian lang.nor=挪威文
lang.oci=Occitan (post 1500) lang.oci=奧克西坦語(西元 1500 年後)
lang.ori=Oriya lang.ori=奧里亞語
lang.osd=Orientation and script detection module lang.osd=文字方向與書寫系統偵測模組
lang.pan=Panjabi, Punjabi lang.pan=旁遮普語
lang.pol=Polish lang.pol=波蘭文
lang.por=Portuguese lang.por=葡萄牙文
lang.pus=Pushto, Pashto lang.pus=普什圖語
lang.que=Quechua lang.que=克丘亞語
lang.ron=Romanian, Moldavian, Moldovan lang.ron=羅馬尼亞語;摩爾多瓦語
lang.rus=Russian lang.rus=俄文
lang.san=Sanskrit lang.san=梵文
lang.sin=Sinhala, Sinhalese lang.sin=僧伽羅語
lang.slk=Slovak lang.slk=斯洛伐克語
lang.slk_frak=Slovak (Fraktur) lang.slk_frak=斯洛伐克語(德文尖角體)
lang.slv=Slovenian lang.slv=斯洛維尼亞語
lang.snd=Sindhi lang.snd=信德語
lang.spa=Spanish lang.spa=西班牙文
lang.spa_old=Spanish (Old) lang.spa_old=古西班牙文
lang.sqi=Albanian lang.sqi=阿爾巴尼亞語
lang.srp=Serbian lang.srp=塞爾維亞語
lang.srp_latn=Serbian (Latin) lang.srp_latn=塞爾維亞語(拉丁字母)
lang.sun=Sundanese lang.sun=巽他語
lang.swa=Swahili lang.swa=斯瓦希里語
lang.swe=Swedish lang.swe=瑞典文
lang.syr=Syriac lang.syr=敘利亞語
lang.tam=Tamil lang.tam=坦米爾文
lang.tat=Tatar lang.tat=韃靼語
lang.tel=Telugu lang.tel=泰盧固語
lang.tgk=Tajik lang.tgk=塔吉克語
lang.tgl=Tagalog lang.tgl=他加祿語
lang.tha=Thai lang.tha=泰文
lang.tir=Tigrinya lang.tir=提格利尼亞語
lang.ton=Tonga (Tonga Islands) lang.ton=東加語(東加群島)
lang.tur=Turkish lang.tur=土耳其文
lang.uig=Uighur, Uyghur lang.uig=維吾爾語
lang.ukr=Ukrainian lang.ukr=烏克蘭文
lang.urd=Urdu lang.urd=烏爾都語
lang.uzb=Uzbek lang.uzb=烏茲別克語
lang.uzb_cyrl=Uzbek (Cyrillic) lang.uzb_cyrl=烏茲別克語(西里爾字母)
lang.vie=Vietnamese lang.vie=越南文
lang.yid=Yiddish lang.yid=意第緒語
lang.yor=Yoruba lang.yor=約魯巴語
addPageNumbers.fontSize=字型大小 addPageNumbers.fontSize=字型大小
addPageNumbers.fontName=字型名稱 addPageNumbers.fontName=字型名稱
@ -170,67 +170,67 @@ sizes.medium=中
sizes.large= sizes.large=
sizes.x-large=特大 sizes.x-large=特大
error.pdfPassword=PDF 檔案已加密,但未提供密碼或密碼不正確 error.pdfPassword=PDF 檔案已加密,但未提供密碼或密碼不正確
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation. error.pdfCorrupted=PDF 檔案似乎已毀損或遭到破壞。請先嘗試使用「修復 PDF」功能來修復檔案然後再繼續此操作。
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them. error.pdfCorruptedMultiple=一個或多個 PDF 檔案似乎已毀損或遭到破壞。請先嘗試對每個檔案使用「修復 PDF」功能然後再嘗試合併它們。
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation. error.pdfCorruptedDuring=錯誤 {0}PDF 檔案似乎已毀損或遭到破壞。請先嘗試使用「修復 PDF」功能來修復檔案然後再繼續此操作。
# Frontend corruption error messages # Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding. error.pdfInvalid=PDF 檔案「{0}」似乎已損毀或結構無效。請先嘗試使用「修復 PDF」功能來修復檔案然後再繼續。
error.tryRepair=Try using the Repair PDF feature to fix corrupted files. error.tryRepair=請嘗試使用「修復 PDF」功能來修復損毀的檔案。
# Additional error messages # Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy. error.pdfEncryption=此 PDF 的加密資料似乎已損毀。這可能是因為 PDF 是使用不相容的加密方法建立的。請先嘗試使用「修復 PDF」功能或聯絡文件建立者以取得新副本。
error.fileProcessing=An error occurred while processing the file during {0} operation: {1} error.fileProcessing=在 {0} 操作期間處理檔案時發生錯誤:{1}
# Generic error message templates # Generic error message templates
error.toolNotInstalled={0} is not installed error.toolNotInstalled=未安裝 {0}
error.toolRequired={0} is required for {1} error.toolRequired={1} 需要 {0}
error.conversionFailed={0} conversion failed error.conversionFailed={0} 轉換失敗
error.commandFailed={0} command failed error.commandFailed={0} 指令失敗
error.algorithmNotAvailable={0} algorithm not available error.algorithmNotAvailable=無法使用 {0} 演算法
error.optionsNotSpecified={0} options are not specified error.optionsNotSpecified=未指定 {0} 選項
error.fileFormatRequired=File must be in {0} format error.fileFormatRequired=檔案必須為 {0} 格式
error.invalidFormat=Invalid {0} format: {1} error.invalidFormat=無效的 {0} 格式:{1}
error.endpointDisabled=This endpoint has been disabled by the admin error.endpointDisabled=此端點已被管理員停用
error.urlNotReachable=URL is not reachable, please provide a valid URL error.urlNotReachable=無法連線至 URL請提供有效的 URL
# DPI and image rendering messages - used by frontend for dynamic translation # DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message # Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys # Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value. error.dpiExceedsLimit=DPI 值 {0} 超出最大安全限制 {1}。高 DPI 值可能導致記憶體問題和當機。請使用較低的 DPI 值。
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less). error.pageTooBigForDpi=PDF 頁面 {0} 太大,無法以 {1} DPI 進行渲染。請嘗試較低的 DPI 值建議150 或更低)。
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less). error.pageTooBigExceedsArray=PDF 頁面 {0} 太大,無法以 {1} DPI 進行渲染。產生的影像將超出 Java 的最大陣列大小。請嘗試較低的 DPI 值建議150 或更低)。
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion. error.pageTooBigFor300Dpi=PDF 頁面 {0} 太大,無法以 300 DPI 進行渲染。產生的影像將超出 Java 的最大陣列大小。請在 PDF 轉影像時使用較低的 DPI 值。
# URL and website conversion messages # URL and website conversion messages
# System requirements messages # System requirements messages
# Authentication and security messages # Authentication and security messages
error.apiKeyInvalid=API key is not valid. error.apiKeyInvalid=API 金鑰無效。
error.userNotFound=User not found. error.userNotFound=找不到使用者。
error.passwordRequired=Password must not be null. error.passwordRequired=密碼不得為空。
error.accountLocked=Your account has been locked due to too many failed login attempts. error.accountLocked=由於登入失敗次數過多,您的帳號已被鎖定。
error.invalidEmail=Invalid email addresses provided. error.invalidEmail=提供了無效的電子郵件地址。
error.emailAttachmentRequired=An attachment is required to send the email. error.emailAttachmentRequired=需要附件才能傳送電子郵件。
error.signatureNotFound=Signature file not found. error.signatureNotFound=找不到簽章檔案。
# File processing messages # File processing messages
error.fileNotFound=File not found with ID: {0} error.fileNotFound=找不到 ID 為 {0} 的檔案
# Database and configuration messages # Database and configuration messages
error.noBackupScripts=No backup scripts were found. error.noBackupScripts=找不到任何備份指令稿。
error.unsupportedProvider={0} is not currently supported. error.unsupportedProvider=目前不支援 {0}。
error.pathTraversalDetected=Path traversal detected for security reasons. error.pathTraversalDetected=因安全因素偵測到路徑遍歷。
# Validation messages # Validation messages
error.invalidArgument=Invalid argument: {0} error.invalidArgument=無效的參數:{0}
error.argumentRequired={0} must not be null error.argumentRequired={0} 不得為空
error.operationFailed=Operation failed: {0} error.operationFailed=操作失敗:{0}
error.angleNotMultipleOf90=Angle must be a multiple of 90 error.angleNotMultipleOf90=角度必須是 90 的倍數
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document error.pdfBookmarksNotFound=在文件中找不到 PDF 書籤/大綱
error.fontLoadingFailed=Error processing font file error.fontLoadingFailed=處理字型檔案時發生錯誤
error.fontDirectoryReadFailed=Failed to read font directory error.fontDirectoryReadFailed=讀取字型目錄失敗
delete=刪除 delete=刪除
username=使用者名稱 username=使用者名稱
password=密碼 password=密碼
@ -281,12 +281,12 @@ addToDoc=新增至文件
reset=重設 reset=重設
apply=套用 apply=套用
noFileSelected=未選擇檔案,請上傳一個。 noFileSelected=未選擇檔案,請上傳一個。
view=View view=檢視
cancel=Cancel cancel=取消
back.toSettings=Back to Settings back.toSettings=返回設定
back.toHome=Back to Home back.toHome=返回首頁
back.toAdmin=Back to Admin back.toAdmin=返回管理員頁面
legal.privacy=隱私權政策 legal.privacy=隱私權政策
legal.terms=使用條款 legal.terms=使用條款
@ -327,7 +327,7 @@ enterpriseEdition.button=升級至專業版
enterpriseEdition.warning=此功能僅提供給專業版使用者使用。 enterpriseEdition.warning=此功能僅提供給專業版使用者使用。
enterpriseEdition.yamlAdvert=Stirling PDF 專業版支援 YAML 設定檔和其他單一登入 (SSO) 功能。 enterpriseEdition.yamlAdvert=Stirling PDF 專業版支援 YAML 設定檔和其他單一登入 (SSO) 功能。
enterpriseEdition.ssoAdvert=需要更多使用者管理功能嗎?請參考 Stirling PDF 專業版 enterpriseEdition.ssoAdvert=需要更多使用者管理功能嗎?請參考 Stirling PDF 專業版
enterpriseEdition.proTeamFeatureDisabled=Team management features require a Pro licence or higher enterpriseEdition.proTeamFeatureDisabled=團隊管理功能需要專業版或更進階的授權
################# #################
@ -408,8 +408,8 @@ account.property=屬性
account.webBrowserSettings=網頁瀏覽器設定 account.webBrowserSettings=網頁瀏覽器設定
account.syncToBrowser=同步帳號 → 瀏覽器 account.syncToBrowser=同步帳號 → 瀏覽器
account.syncToAccount=同步帳號 ← 瀏覽器 account.syncToAccount=同步帳號 ← 瀏覽器
account.adminTitle=Administrator Tools account.adminTitle=管理員工具
account.adminNotif=You have admin privileges. Access system settings and user management. account.adminNotif=您具有管理員權限,可存取系統設定和使用者管理。
adminUserSettings.title=使用者控制設定 adminUserSettings.title=使用者控制設定
@ -440,48 +440,48 @@ adminUserSettings.disabledUsers=已停用的使用者:
adminUserSettings.totalUsers=使用者總數: adminUserSettings.totalUsers=使用者總數:
adminUserSettings.lastRequest=最後請求時間 adminUserSettings.lastRequest=最後請求時間
adminUserSettings.usage=檢視使用情況 adminUserSettings.usage=檢視使用情況
adminUserSettings.teams=View/Edit Teams adminUserSettings.teams=檢視/編輯團隊
adminUserSettings.team=Team adminUserSettings.team=團隊
adminUserSettings.manageTeams=Manage Teams adminUserSettings.manageTeams=管理團隊
adminUserSettings.createTeam=Create Team adminUserSettings.createTeam=建立團隊
adminUserSettings.viewTeam=View Team adminUserSettings.viewTeam=檢視團隊
adminUserSettings.deleteTeam=Delete Team adminUserSettings.deleteTeam=刪除團隊
adminUserSettings.teamName=Team Name adminUserSettings.teamName=團隊名稱
adminUserSettings.teamExists=Team already exists adminUserSettings.teamExists=團隊已存在
adminUserSettings.teamCreated=Team created successfully adminUserSettings.teamCreated=團隊建立成功
adminUserSettings.teamChanged=User's team was updated adminUserSettings.teamChanged=使用者的團隊已更新
adminUserSettings.teamHidden=Hidden adminUserSettings.teamHidden=隱藏
adminUserSettings.totalMembers=Total Members adminUserSettings.totalMembers=成員總數
adminUserSettings.confirmDeleteTeam=Are you sure you want to delete this team? adminUserSettings.confirmDeleteTeam=您確定要刪除此團隊嗎?
teamCreated=Team created successfully teamCreated=團隊建立成功
teamExists=A team with that name already exists teamExists=該名稱的團隊已存在
teamNameExists=Another team with that name already exists teamNameExists=已有同名的團隊存在
teamNotFound=Team not found teamNotFound=找不到團隊
teamDeleted=Team deleted teamDeleted=團隊已刪除
teamHasUsers=Cannot delete a team with users assigned teamHasUsers=無法刪除已有指派使用者的團隊
teamRenamed=Team renamed successfully teamRenamed=團隊重新命名成功
# Team user management # Team user management
team.addUser=Add User to Team team.addUser=新增使用者至團隊
team.selectUser=Select User team.selectUser=選擇使用者
team.warning.moveUser=Warning: This will move the user from "{0}" team to "{1}" team. Are you sure? team.warning.moveUser=警告:此操作會將使用者從「{0}」團隊移至「{1}」團隊。您確定嗎?
team.confirm.moveUser=Are you sure you want to move this user from "{0}" team to "{1}" team? team.confirm.moveUser=您確定要將此使用者從「{0}」團隊移至「{1}」團隊嗎?
team.userAdded=User successfully added to team team.userAdded=已成功將使用者新增至團隊
team.back=Back to Teams team.back=返回團隊
team.internal=Internal Team team.internal=內部團隊
team.internalTeamNotAccessible=The Internal team is a system team and cannot be accessed team.internalTeamNotAccessible=內部團隊為系統團隊,無法存取
team.cannotMoveInternalUsers=Users in the Internal team cannot be moved to other teams team.cannotMoveInternalUsers=無法將內部團隊中的使用者移動到其他團隊
team.hidden=Hidden team.hidden=隱藏
team.name=Team Name team.name=團隊名稱
team.totalMembers=Total Members team.totalMembers=成員總數
team.members=Members team.members=成員
team.username=Username team.username=使用者名稱
team.role=Role team.role=角色
team.status=Status team.status=狀態
team.enabled=Enabled team.enabled=已啟用
team.disabled=Disabled team.disabled=已停用
team.noMembers=This team has no members yet. team.noMembers=此團隊尚無成員。
@ -585,9 +585,9 @@ home.addImage.title=新增圖片
home.addImage.desc=在 PDF 的指定位置新增圖片 home.addImage.desc=在 PDF 的指定位置新增圖片
addImage.tags=img,jpg,圖片,照片 addImage.tags=img,jpg,圖片,照片
home.attachments.title=Add Attachments home.attachments.title=新增附件
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF home.attachments.desc=將檔案(附件)新增或移除至/從 PDF
attachments.tags=embed,attach,file,attachment,attachments attachments.tags=嵌入,附件,檔案,附加,附件管理
home.watermark.title=新增浮水印 home.watermark.title=新增浮水印
home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。 home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。
@ -715,8 +715,8 @@ home.auto-rename.title=自動重新命名 PDF 檔案
home.auto-rename.desc=根據其偵測到的標頭自動重新命名 PDF 檔案 home.auto-rename.desc=根據其偵測到的標頭自動重新命名 PDF 檔案
auto-rename.tags=自動偵測,基於標頭,組織,重新標籤 auto-rename.tags=自動偵測,基於標頭,組織,重新標籤
home.adjust-contrast.title=調整顏色/對比 home.adjust-contrast.title=調整顏色/對比
home.adjust-contrast.desc=調整 PDF 的對比、飽和度和亮度 home.adjust-contrast.desc=調整 PDF 的對比、飽和度和亮度
adjust-contrast.tags=色彩校正,調整,修改,增強 adjust-contrast.tags=色彩校正,調整,修改,增強
home.crop.title=裁剪 PDF home.crop.title=裁剪 PDF
@ -834,10 +834,10 @@ home.replaceColorPdf.title=取代與反轉顏色
home.replaceColorPdf.desc=取代 PDF 中文字和背景的顏色,並反轉整個 PDF 的顏色以減少檔案大小 home.replaceColorPdf.desc=取代 PDF 中文字和背景的顏色,並反轉整個 PDF 的顏色以減少檔案大小
replaceColorPdf.tags=取代顏色,頁面操作,後端,伺服器端 replaceColorPdf.tags=取代顏色,頁面操作,後端,伺服器端
replace-color.selectText.1=取代或反轉顏色選項 replace-color.selectText.1=取代或反轉顏色選項
replace-color.selectText.2=預設(預設高對比顏色) replace-color.selectText.2=預設(預設高對比顏色)
replace-color.selectText.3=自訂(自訂顏色) replace-color.selectText.3=自訂(自訂顏色)
replace-color.selectText.4=全部反轉(反轉所有顏色) replace-color.selectText.4=全部反轉(反轉所有顏色)
replace-color.selectText.5=高對比顏色選項 replace-color.selectText.5=高對比顏色選項
replace-color.selectText.6=黑底白字 replace-color.selectText.6=黑底白字
replace-color.selectText.7=白底黑字 replace-color.selectText.7=白底黑字
replace-color.selectText.8=黑底黃字 replace-color.selectText.8=黑底黃字
@ -875,7 +875,7 @@ login.userIsDisabled=使用者已停用,目前此使用者無法登入。請
login.alreadyLoggedIn=您已經登入了 login.alreadyLoggedIn=您已經登入了
login.alreadyLoggedIn2=部裝置。請先從這些裝置登出後再試一次。 login.alreadyLoggedIn2=部裝置。請先從這些裝置登出後再試一次。
login.toManySessions=您有太多使用中的工作階段 login.toManySessions=您有太多使用中的工作階段
login.logoutMessage=You have been logged out. login.logoutMessage=您已登出。
#auto-redact #auto-redact
autoRedact.title=自動塗黑 autoRedact.title=自動塗黑
@ -1059,9 +1059,9 @@ auto-rename.submit=自動重新命名
#adjustContrast #adjustContrast
adjustContrast.title=調整對比 adjustContrast.title=調整對比
adjustContrast.header=調整對比 adjustContrast.header=調整對比
adjustContrast.contrast=對比 adjustContrast.contrast=對比
adjustContrast.brightness=亮度: adjustContrast.brightness=亮度:
adjustContrast.saturation=飽和度: adjustContrast.saturation=飽和度:
adjustContrast.download=下載 adjustContrast.download=下載
@ -1270,11 +1270,11 @@ addImage.upload=新增圖片
addImage.submit=新增圖片 addImage.submit=新增圖片
#attachments #attachments
attachments.title=Add Attachments attachments.title=新增附件
attachments.header=Add attachments attachments.header=新增附件
attachments.description=Allows you to add attachments to the PDF attachments.description=可將附件新增至 PDF
attachments.descriptionPlaceholder=Enter a description for the attachments... attachments.descriptionPlaceholder=請輸入附件說明...
attachments.addButton=Add Attachments attachments.addButton=新增附件
#merge #merge
merge.title=合併 merge.title=合併
@ -1282,7 +1282,7 @@ merge.header=合併多個 PDF
merge.sortByName=依名稱排序 merge.sortByName=依名稱排序
merge.sortByDate=依日期排序 merge.sortByDate=依日期排序
merge.removeCertSign=是否移除合併後檔案的憑證簽章? merge.removeCertSign=是否移除合併後檔案的憑證簽章?
merge.generateToc=Generate table of contents in the merged file? merge.generateToc=是否在合併後的檔案中產生目錄?
merge.submit=合併 merge.submit=合併
@ -1664,7 +1664,7 @@ fileChooser.dragAndDropPDF=拖放 PDF 檔案
fileChooser.dragAndDropImage=拖放圖片檔案 fileChooser.dragAndDropImage=拖放圖片檔案
fileChooser.hoveredDragAndDrop=將檔案拖放至此 fileChooser.hoveredDragAndDrop=將檔案拖放至此
fileChooser.extractPDF=處理中... fileChooser.extractPDF=處理中...
fileChooser.addAttachments=drag & drop attachments here fileChooser.addAttachments=拖曳附件到此處
#release notes #release notes
releases.footer=版本資訊 releases.footer=版本資訊
@ -1709,157 +1709,157 @@ validateSignature.cert.selfSigned=自我簽署
validateSignature.cert.bits=位元 validateSignature.cert.bits=位元
# Audit Dashboard # Audit Dashboard
audit.dashboard.title=Audit Dashboard audit.dashboard.title=稽核儀表板
audit.dashboard.systemStatus=Audit System Status audit.dashboard.systemStatus=稽核系統狀態
audit.dashboard.status=Status audit.dashboard.status=狀態
audit.dashboard.enabled=Enabled audit.dashboard.enabled=已啟用
audit.dashboard.disabled=Disabled audit.dashboard.disabled=已停用
audit.dashboard.currentLevel=Current Level audit.dashboard.currentLevel=目前層級
audit.dashboard.retentionPeriod=Retention Period audit.dashboard.retentionPeriod=保留期間
audit.dashboard.days=days audit.dashboard.days=
audit.dashboard.totalEvents=Total Events audit.dashboard.totalEvents=事件總數
# Audit Dashboard Tabs # Audit Dashboard Tabs
audit.dashboard.tab.dashboard=Dashboard audit.dashboard.tab.dashboard=儀表板
audit.dashboard.tab.events=Audit Events audit.dashboard.tab.events=稽核事件
audit.dashboard.tab.export=Export audit.dashboard.tab.export=匯出
# Dashboard Charts # Dashboard Charts
audit.dashboard.eventsByType=Events by Type audit.dashboard.eventsByType=依類型分類的事件
audit.dashboard.eventsByUser=Events by User audit.dashboard.eventsByUser=依使用者分類的事件
audit.dashboard.eventsOverTime=Events Over Time audit.dashboard.eventsOverTime=事件時間趨勢
audit.dashboard.period.7days=7 Days audit.dashboard.period.7days=7
audit.dashboard.period.30days=30 Days audit.dashboard.period.30days=30
audit.dashboard.period.90days=90 Days audit.dashboard.period.90days=90
# Events Tab # Events Tab
audit.dashboard.auditEvents=Audit Events audit.dashboard.auditEvents=稽核事件
audit.dashboard.filter.eventType=Event Type audit.dashboard.filter.eventType=事件類型
audit.dashboard.filter.allEventTypes=All event types audit.dashboard.filter.allEventTypes=所有事件類型
audit.dashboard.filter.user=User audit.dashboard.filter.user=使用者
audit.dashboard.filter.userPlaceholder=Filter by user audit.dashboard.filter.userPlaceholder=依使用者篩選
audit.dashboard.filter.startDate=Start Date audit.dashboard.filter.startDate=開始日期
audit.dashboard.filter.endDate=End Date audit.dashboard.filter.endDate=結束日期
audit.dashboard.filter.apply=Apply Filters audit.dashboard.filter.apply=套用篩選器
audit.dashboard.filter.reset=Reset Filters audit.dashboard.filter.reset=重設篩選器
# Table Headers # Table Headers
audit.dashboard.table.id=ID audit.dashboard.table.id=ID
audit.dashboard.table.time=Time audit.dashboard.table.time=時間
audit.dashboard.table.user=User audit.dashboard.table.user=使用者
audit.dashboard.table.type=Type audit.dashboard.table.type=類型
audit.dashboard.table.details=Details audit.dashboard.table.details=詳細資訊
audit.dashboard.table.viewDetails=View Details audit.dashboard.table.viewDetails=檢視詳細資訊
# Pagination # Pagination
audit.dashboard.pagination.show=Show audit.dashboard.pagination.show=顯示
audit.dashboard.pagination.entries=entries audit.dashboard.pagination.entries=個項目
audit.dashboard.pagination.pageInfo1=Page audit.dashboard.pagination.pageInfo1=
audit.dashboard.pagination.pageInfo2=of audit.dashboard.pagination.pageInfo2=頁,共
audit.dashboard.pagination.totalRecords=Total records: audit.dashboard.pagination.totalRecords=總記錄數:
# Modal # Modal
audit.dashboard.modal.eventDetails=Event Details audit.dashboard.modal.eventDetails=事件詳細資訊
audit.dashboard.modal.id=ID audit.dashboard.modal.id=ID
audit.dashboard.modal.user=User audit.dashboard.modal.user=使用者
audit.dashboard.modal.type=Type audit.dashboard.modal.type=類型
audit.dashboard.modal.time=Time audit.dashboard.modal.time=時間
audit.dashboard.modal.data=Data audit.dashboard.modal.data=資料
# Export Tab # Export Tab
audit.dashboard.export.title=Export Audit Data audit.dashboard.export.title=匯出稽核資料
audit.dashboard.export.format=Export Format audit.dashboard.export.format=匯出格式
audit.dashboard.export.csv=CSV (Comma Separated Values) audit.dashboard.export.csv=CSV (逗號分隔值)
audit.dashboard.export.json=JSON (JavaScript Object Notation) audit.dashboard.export.json=JSON (JavaScript 物件表示法)
audit.dashboard.export.button=Export Data audit.dashboard.export.button=匯出資料
audit.dashboard.export.infoTitle=Export Information audit.dashboard.export.infoTitle=匯出資訊
audit.dashboard.export.infoDesc1=The export will include all audit events matching the selected filters. For large datasets, the export may take a few moments to generate. audit.dashboard.export.infoDesc1=匯出的內容將包含所有符合所選篩選條件的稽核事件。若資料量龐大,匯出過程可能需要一些時間。
audit.dashboard.export.infoDesc2=Exported data will include: audit.dashboard.export.infoDesc2=匯出的資料將包含:
audit.dashboard.export.infoItem1=Event ID audit.dashboard.export.infoItem1=事件 ID
audit.dashboard.export.infoItem2=User audit.dashboard.export.infoItem2=使用者
audit.dashboard.export.infoItem3=Event Type audit.dashboard.export.infoItem3=事件類型
audit.dashboard.export.infoItem4=Timestamp audit.dashboard.export.infoItem4=時間戳記
audit.dashboard.export.infoItem5=Event Data audit.dashboard.export.infoItem5=事件資料
# JavaScript i18n keys # JavaScript i18n keys
audit.dashboard.js.noEventsFound=No audit events found matching the current filters audit.dashboard.js.noEventsFound=找不到符合目前篩選條件的稽核事件
audit.dashboard.js.errorLoading=Error loading data: audit.dashboard.js.errorLoading=載入資料時發生錯誤:
audit.dashboard.js.errorRendering=Error rendering table: audit.dashboard.js.errorRendering=呈現表格時發生錯誤:
audit.dashboard.js.loadingPage=Loading page audit.dashboard.js.loadingPage=正在載入頁面
#################### ####################
# Cookie banner # # Cookie banner #
#################### ####################
cookieBanner.popUp.title=我們如何使用 Cookies cookieBanner.popUp.title=我們如何使用 Cookie
cookieBanner.popUp.description.1=我們使用 Cookies 和其他技術來讓 Stirling PDF 變得更好——幫助我們改善工具並繼續創造您會喜愛的新功能 cookieBanner.popUp.description.1=我們使用 Cookie 和其他技術來讓 Stirling PDF 變得更好、協助我們改進並持續打造您會喜愛的新功能。
cookieBanner.popUp.description.2=如果您仍不想,點選「不,謝謝」只會開啟必要的 Cookies 好讓網站功能保持運作 cookieBanner.popUp.description.2=如果您不希望如此,點選「不,謝謝」將只會啟用維持網站正常運作所需的必要 Cookie。
cookieBanner.popUp.acceptAllBtn=接受 cookieBanner.popUp.acceptAllBtn=接受
cookieBanner.popUp.acceptNecessaryBtn=不,謝謝 cookieBanner.popUp.acceptNecessaryBtn=不,謝謝
cookieBanner.popUp.showPreferencesBtn=管理偏好設定 cookieBanner.popUp.showPreferencesBtn=管理偏好設定
cookieBanner.preferencesModal.title=好設定中心 cookieBanner.preferencesModal.title=好設定中心
cookieBanner.preferencesModal.acceptAllBtn=全部接受 cookieBanner.preferencesModal.acceptAllBtn=全部接受
cookieBanner.preferencesModal.acceptNecessaryBtn=全部拒絕 cookieBanner.preferencesModal.acceptNecessaryBtn=全部拒絕
cookieBanner.preferencesModal.savePreferencesBtn=儲存設定 cookieBanner.preferencesModal.savePreferencesBtn=儲存設定
cookieBanner.preferencesModal.closeIconLabel=關閉視窗 cookieBanner.preferencesModal.closeIconLabel=關閉視窗
cookieBanner.preferencesModal.serviceCounterLabel=服務|服務 cookieBanner.preferencesModal.serviceCounterLabel=服務|服務
cookieBanner.preferencesModal.subtitle=Cookies 的用途 cookieBanner.preferencesModal.subtitle=Cookie 的用途
cookieBanner.preferencesModal.description.1=Stirling PDF 使用 Cookies 與其他相似技術去改善您的體驗和分析您如何使用我們的工具。這有助於我們改善效能、開發您注目的功能,和提供使用者協助。 cookieBanner.preferencesModal.description.1=Stirling PDF 使用 Cookie 與其他相似技術去改善您的體驗和分析您如何使用我們的工具。這有助於我們改善效能、開發您注目的功能,和提供使用者協助。
cookieBanner.preferencesModal.description.2=Stirling PDF 不能——且永遠不會——追蹤或存取您的文件。 cookieBanner.preferencesModal.description.2=Stirling PDF 不能——且永遠不會——追蹤或存取您的文件。
cookieBanner.preferencesModal.description.3=您的隱私和信任是我們的核心理念。 cookieBanner.preferencesModal.description.3=您的隱私和信任是我們的核心理念。
cookieBanner.preferencesModal.necessary.title.1=必要的 Cookies cookieBanner.preferencesModal.necessary.title.1=必要的 Cookie
cookieBanner.preferencesModal.necessary.title.2=永遠開啟 cookieBanner.preferencesModal.necessary.title.2=永遠開啟
cookieBanner.preferencesModal.necessary.description=這些 Cookies 對網站正常運作至關重要。它們讓核心功能,像是隱私設定、登入、填入表格能夠運作——這也是為什麼它們不能被關掉。 cookieBanner.preferencesModal.necessary.description=這些 Cookie 對網站正常運作至關重要。它們讓核心功能,像是隱私設定、登入、填入表格能夠運作——這也是為什麼它們不能被關掉。
cookieBanner.preferencesModal.analytics.title=分析 Cookies cookieBanner.preferencesModal.analytics.title=分析 Cookie
cookieBanner.preferencesModal.analytics.description=這些 Cookies 幫助我們分析您如何使用我們的工具,好讓我們能專注在建構社群最重視的功能。儘管放心—— Stirling PDF 不會且永不追蹤您的文件 cookieBanner.preferencesModal.analytics.description=這些 Cookie助我們分析您如何使用我們的工具,好讓我們能專注在建構社群最重視的功能。儘管放心—— Stirling PDF 不會且永不追蹤您的文件
#scannerEffect #scannerEffect
scannerEffect.title=Scanner Effect scannerEffect.title=掃描器效果
scannerEffect.header=Scanner Effect scannerEffect.header=掃描器效果
scannerEffect.description=Create a PDF that looks like it was scanned scannerEffect.description=建立看起來像掃描過的 PDF
scannerEffect.selectPDF=Select PDF: scannerEffect.selectPDF=選擇 PDF
scannerEffect.quality=Scan Quality scannerEffect.quality=掃描品質
scannerEffect.quality.low=Low scannerEffect.quality.low=
scannerEffect.quality.medium=Medium scannerEffect.quality.medium=
scannerEffect.quality.high=High scannerEffect.quality.high=
scannerEffect.rotation=Rotation Angle scannerEffect.rotation=旋轉角度
scannerEffect.rotation.none=None scannerEffect.rotation.none=
scannerEffect.rotation.slight=Slight scannerEffect.rotation.slight=輕微
scannerEffect.rotation.moderate=Moderate scannerEffect.rotation.moderate=中等
scannerEffect.rotation.severe=Severe scannerEffect.rotation.severe=嚴重
scannerEffect.submit=Create Scanner Effect scannerEffect.submit=建立掃描器效果
#home.scannerEffect #home.scannerEffect
home.scannerEffect.title=Scanner Effect home.scannerEffect.title=掃描器效果
home.scannerEffect.desc=Create a PDF that looks like it was scanned home.scannerEffect.desc=建立看起來像掃描過的 PDF
scannerEffect.tags=scan,simulate,realistic,convert scannerEffect.tags=掃描,模擬,逼真,轉換
# ScannerEffect advanced settings (frontend) # ScannerEffect advanced settings (frontend)
scannerEffect.advancedSettings=Enable Advanced Scan Settings scannerEffect.advancedSettings=啟用進階掃描設定
scannerEffect.colorspace=Colorspace scannerEffect.colorspace=色彩空間
scannerEffect.colorspace.grayscale=Grayscale scannerEffect.colorspace.grayscale=灰階
scannerEffect.colorspace.color=Color scannerEffect.colorspace.color=彩色
scannerEffect.border=Border (px) scannerEffect.border=邊框 (px)
scannerEffect.rotate=Base Rotation (degrees) scannerEffect.rotate=基礎旋轉 (度)
scannerEffect.rotateVariance=Rotation Variance (degrees) scannerEffect.rotateVariance=旋轉變異 (度)
scannerEffect.brightness=Brightness scannerEffect.brightness=亮度
scannerEffect.contrast=Contrast scannerEffect.contrast=對比
scannerEffect.blur=Blur scannerEffect.blur=模糊
scannerEffect.noise=Noise scannerEffect.noise=雜訊
scannerEffect.yellowish=Yellowish (simulate old paper) scannerEffect.yellowish=泛黃效果 (模擬舊紙張)
scannerEffect.resolution=Resolution (DPI) scannerEffect.resolution=解析度 (DPI)
# Table of Contents Feature # Table of Contents Feature
home.editTableOfContents.title=Edit Table of Contents home.editTableOfContents.title=編輯目錄
home.editTableOfContents.desc=Add or edit bookmarks and table of contents in PDF documents home.editTableOfContents.desc=在 PDF 文件中新增或編輯書籤和目錄
editTableOfContents.tags=bookmarks,toc,navigation,index,table of contents,chapters,sections,outline editTableOfContents.tags=書籤,toc,導覽,索引,目錄,章節,區段,大綱
editTableOfContents.title=Edit Table of Contents editTableOfContents.title=編輯目錄
editTableOfContents.header=Add or Edit PDF Table of Contents editTableOfContents.header=新增或編輯 PDF 目錄
editTableOfContents.replaceExisting=Replace existing bookmarks (uncheck to append to existing) editTableOfContents.replaceExisting=取代現有書籤 (取消勾選以附加到現有書籤)
editTableOfContents.editorTitle=Bookmark Editor editTableOfContents.editorTitle=書籤編輯器
editTableOfContents.editorDesc=Add and arrange bookmarks below. Click + to add child bookmarks. editTableOfContents.editorDesc=在下方新增和排列書籤。點選 + 新增子書籤。
editTableOfContents.addBookmark=Add New Bookmark editTableOfContents.addBookmark=新增書籤
editTableOfContents.desc.1=This tool allows you to add or edit the table of contents (bookmarks) in a PDF document. editTableOfContents.desc.1=此工具可讓您在 PDF 文件中新增或編輯目錄 (書籤)。
editTableOfContents.desc.2=You can create a hierarchical structure by adding child bookmarks to parent bookmarks. editTableOfContents.desc.2=您可以透過將子書籤新增至父書籤來建立階層式結構。
editTableOfContents.desc.3=Each bookmark requires a title and target page number. editTableOfContents.desc.3=每個書籤都需要標題和目標頁碼。
editTableOfContents.submit=Apply Table of Contents editTableOfContents.submit=套用目錄

View File

@ -91,7 +91,7 @@ mail:
from: '' # sender email address from: '' # sender email address
legal: legal:
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder termsAndConditions: https://www.stirlingpdf.com/terms # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder

View File

@ -85,21 +85,21 @@
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", "moduleName": "com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-base",
"moduleUrl": "https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-base", "moduleUrl": "https://github.com/FasterXML/jackson-jakarta-rs-providers/jackson-jakarta-rs-base",
"moduleVersion": "2.19.1", "moduleVersion": "2.19.1",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider", "moduleName": "com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-json-provider",
"moduleUrl": "https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-json-provider", "moduleUrl": "https://github.com/FasterXML/jackson-jakarta-rs-providers/jackson-jakarta-rs-json-provider",
"moduleVersion": "2.19.1", "moduleVersion": "2.19.1",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", "moduleName": "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations",
"moduleUrl": "https://github.com/FasterXML/jackson-modules-base", "moduleUrl": "https://github.com/FasterXML/jackson-modules-base",
"moduleVersion": "2.19.1", "moduleVersion": "2.19.1",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
@ -358,14 +358,14 @@
{ {
"moduleName": "com.unboundid.product.scim2:scim2-sdk-client", "moduleName": "com.unboundid.product.scim2:scim2-sdk-client",
"moduleUrl": "https://github.com/pingidentity/scim2", "moduleUrl": "https://github.com/pingidentity/scim2",
"moduleVersion": "2.3.5", "moduleVersion": "4.0.0",
"moduleLicense": "UnboundID SCIM2 SDK Free Use License", "moduleLicense": "UnboundID SCIM2 SDK Free Use License",
"moduleLicenseUrl": "https://github.com/pingidentity/scim2" "moduleLicenseUrl": "https://github.com/pingidentity/scim2"
}, },
{ {
"moduleName": "com.unboundid.product.scim2:scim2-sdk-common", "moduleName": "com.unboundid.product.scim2:scim2-sdk-common",
"moduleUrl": "https://github.com/pingidentity/scim2", "moduleUrl": "https://github.com/pingidentity/scim2",
"moduleVersion": "2.3.5", "moduleVersion": "4.0.0",
"moduleLicense": "UnboundID SCIM2 SDK Free Use License", "moduleLicense": "UnboundID SCIM2 SDK Free Use License",
"moduleLicenseUrl": "https://github.com/pingidentity/scim2" "moduleLicenseUrl": "https://github.com/pingidentity/scim2"
}, },
@ -533,7 +533,7 @@
{ {
"moduleName": "commons-io:commons-io", "moduleName": "commons-io:commons-io",
"moduleUrl": "https://commons.apache.org/proper/commons-io/", "moduleUrl": "https://commons.apache.org/proper/commons-io/",
"moduleVersion": "2.19.0", "moduleVersion": "2.20.0",
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@ -752,20 +752,6 @@
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception", "moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html" "moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
}, },
{
"moduleName": "javax.activation:javax.activation-api",
"moduleUrl": "http://www.oracle.com",
"moduleVersion": "1.2.0",
"moduleLicense": "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0",
"moduleLicenseUrl": "https://opensource.org/licenses/CDDL-1.0"
},
{
"moduleName": "javax.xml.bind:jaxb-api",
"moduleUrl": "http://www.oracle.com/",
"moduleVersion": "2.3.1",
"moduleLicense": "GPL2 w/ CPE",
"moduleLicenseUrl": "https://oss.oracle.com/licenses/CDDL+GPL-1.1"
},
{ {
"moduleName": "me.friwi:gluegen-rt", "moduleName": "me.friwi:gluegen-rt",
"moduleUrl": "http://jogamp.org/gluegen/www/", "moduleUrl": "http://jogamp.org/gluegen/www/",
@ -1457,7 +1443,7 @@
{ {
"moduleName": "org.snakeyaml:snakeyaml-engine", "moduleName": "org.snakeyaml:snakeyaml-engine",
"moduleUrl": "https://bitbucket.org/snakeyaml/snakeyaml-engine", "moduleUrl": "https://bitbucket.org/snakeyaml/snakeyaml-engine",
"moduleVersion": "2.9", "moduleVersion": "2.10",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },

View File

@ -91,7 +91,7 @@ mail:
from: '' # sender email address from: '' # sender email address
legal: legal:
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder termsAndConditions: https://www.stirlingpdf.com/terms # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder