diff --git a/README.md b/README.md index 01dd25b3b..91ce00822 100644 --- a/README.md +++ b/README.md @@ -59,14 +59,14 @@ npm run serve | Browser | Compatibility | Known Issues | | ----------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chrome | ≥112 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | -| Firefox | ≥121 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Firefox.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AFirefox) | -| Edge | ≥112 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | -| Safari | ≥18.2 | | -| Opera | ≥98 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | -| iOS | ≥18.2 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/iOS.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AiOS) | -| Android WebView | ≥112 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | -| Chrome Android | ≥112 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | -| Firefox Android | ≥121 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | +| Chrome | ≥122 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | +| Firefox | ≥131 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Firefox.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AFirefox) | +| Edge | ≥122 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | +| Safari | ≥18.4 | | +| Opera | ≥108 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Chromium.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Chromium") | +| iOS | ≥18.4 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/iOS.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AiOS) | +| Android WebView | ≥122 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | +| Chrome Android | ≥122 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | +| Firefox Android | ≥131 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) | | Internet Explorer | Unsupported | | | Opera Mini | Unsupported | | diff --git a/livesplit-core b/livesplit-core index 6b840f0d6..856bf312c 160000 --- a/livesplit-core +++ b/livesplit-core @@ -1 +1 @@ -Subproject commit 6b840f0d647b8e2d1175143030fd3477c9f2768b +Subproject commit 856bf312c59c05ba777acc5e58727eb05514c6b9 diff --git a/package-lock.json b/package-lock.json index 413a7ae92..b981b0fb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "sass-loader": "^16.0.4", "style-loader": "^4.0.0", "ts-loader": "^9.4.2", - "typescript": "^5.7.3", + "typescript": "^5.9.3", "typescript-eslint": "^8.24.0", "webpack": "^5.91.0", "webpack-cli": "^6.0.1", @@ -10922,9 +10922,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 6e82e7d5f..ecd57ccf1 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "sass-loader": "^16.0.4", "style-loader": "^4.0.0", "ts-loader": "^9.4.2", - "typescript": "^5.7.3", + "typescript": "^5.9.3", "typescript-eslint": "^8.24.0", "webpack": "^5.91.0", "webpack-cli": "^6.0.1", diff --git a/src/css/timer.woff b/src/css/timer.woff index 5ca4f422c..aa1899424 100644 Binary files a/src/css/timer.woff and b/src/css/timer.woff differ diff --git a/src/index.tsx b/src/index.tsx index 596f43fc0..4e47a8bf3 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,4 +1,5 @@ import { preloadWasm } from "./livesplit-core/preload"; +import { Label, resolve } from "./localization"; // FIXME: Remove the polyfill later. // https://caniuse.com/mdn-javascript_statements_using @@ -97,17 +98,9 @@ try { ); } catch (e: any) { if (e.name === "InvalidStateError") { - alert(`Couldn't load LiveSplit One. \ -You may be in private browsing mode. \ -LiveSplit One cannot store any splits, layouts, or other settings because of the limitations of the browser's private browsing mode. \ -These limitations may be lifted in the future. \ -To run LiveSplit One for now, please disable private browsing in your settings.\n`); + alert(resolve(Label.LoadFailedPrivateBrowsing, undefined)); } } } catch (_) { - alert(`Couldn't load LiveSplit One. \ -You may be using a browser that is not up to date. \ -Please update your browser or your iOS version and try again. \ -Another reason might be that a browser extension, such as an adblocker, \ -is blocking access to important scripts.`); + alert(resolve(Label.LoadFailedOutdatedBrowser, undefined)); } diff --git a/src/localization/chinese-simplified.ts b/src/localization/chinese-simplified.ts new file mode 100644 index 000000000..43ce26aa2 --- /dev/null +++ b/src/localization/chinese-simplified.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveChineseSimplified(text: Label): string { + switch (text) { + case Label.Ok: return "确定"; + case Label.Cancel: return "取消"; + case Label.Settings: return "设置"; + case Label.Language: return "语言"; + case Label.LanguageDescription: return "设置应用程序使用的语言。"; + case Label.LanguageAuto: return "自动"; + case Label.HotkeysHeading: return "热键"; + case Label.GeneralHeading: return "常规"; + case Label.NetworkHeading: return "网络"; + case Label.FrameRate: return "帧率"; + case Label.FrameRateDescription: return "确定计时器显示的帧率。“电池感知”会尝试根据设备类型和充电状态选择合适的帧率。“匹配屏幕”使计时器与屏幕刷新率一致。"; + case Label.FrameRateBatteryAware: return "电池感知"; + case Label.FrameRateMatchScreen: return "匹配屏幕"; + case Label.SaveOnReset: return "重置时保存"; + case Label.SaveOnResetDescription: return "确定在重置计时器时是否自动保存分段。"; + case Label.ShowControlButtons: return "显示控制按钮"; + case Label.ShowControlButtonsDescription: return "确定是否在计时器下方显示用于控制的按钮。禁用后需要使用热键。"; + case Label.ShowManualGameTimeInput: return "显示手动游戏时间输入"; + case Label.ShowManualGameTimeInputDescription: return "在计时器下方显示一个文本框以手动输入游戏时间。你可以在文本框中按 Enter 键开始计时并进行分段。请确保与“游戏时间”进行比较。"; + case Label.ManualGameTimeMode: return "手动游戏时间模式"; + case Label.ManualGameTimeModeDescription: return "确定将手动游戏时间输入为分段时间还是拆分时间。"; + case Label.ManualGameTimeModeSegmentTimes: return "分段时间"; + case Label.ManualGameTimeModeSplitTimes: return "拆分时间"; + case Label.AlwaysOnTop: return "置顶"; + case Label.AlwaysOnTopDescription: return "使窗口始终位于其他窗口之上。"; + case Label.SpeedrunComIntegration: return "Speedrun.com 集成"; + case Label.SpeedrunComIntegrationDescription: return "从 speedrun.com 查询游戏、类别和排行榜列表。"; + case Label.ServerConnection: return "服务器连接"; + case Label.ServerConnectionDescription: return "允许你连接到 WebSocket 服务器,通过发送各种命令来控制计时器。目前这些命令是原版 LiveSplit 支持命令的子集。"; + case Label.ServerConnectionExperimental: return "此功能为实验性,协议未来可能会更改。"; + case Label.HotkeyAlreadyInUse: return "该热键已被使用。"; + case Label.Start: return "开始"; + case Label.Resume: return "继续"; + case Label.Pause: return "暂停"; + case Label.UndoSplit: return "撤销分段"; + case Label.Reset: return "重置"; + case Label.SkipSplit: return "跳过分段"; + case Label.ManualGameTimePlaceholder: return "手动游戏时间"; + case Label.LiveSplitLogoAlt: return "LiveSplit 标志"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "分段"; + case Label.Layout: return "布局"; + case Label.CompareAgainst: return "对比对象"; + case Label.RealTime: return "实时时间"; + case Label.GameTime: return "游戏时间"; + case Label.PopOut: return "弹出窗口"; + case Label.About: return "关于"; + case Label.Back: return "返回"; + case Label.AboutVersionPrefix: return "版本:"; + case Label.AboutDescription: return "LiveSplit One 是 LiveSplit 的跨平台版本,是为速通玩家打造的简洁且高度可定制的计时器。"; + case Label.AboutViewSource: return "在 GitHub 上查看源代码"; + case Label.AboutRecentChanges: return "近期更改"; + case Label.AboutContributors: return "贡献者"; + case Label.Loading: return "加载中..."; + case Label.Add: return "添加"; + case Label.Import: return "导入"; + case Label.OpenSplits: return "打开分段"; + case Label.EditSplits: return "编辑分段"; + case Label.ExportSplits: return "导出分段"; + case Label.CopySplits: return "复制分段"; + case Label.RemoveSplits: return "删除分段"; + case Label.Untitled: return "未命名"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "放弃更改?"; + case Label.DiscardChangesDescription: return "你当前的分段已被修改且有未保存的更改。是否继续并放弃这些更改?"; + case Label.DeleteSplitsTitle: return "删除分段?"; + case Label.DeleteSplitsDescription: return "确定要删除这些分段吗?此操作无法撤销。"; + case Label.SaveBestTimesTitle: return "保存最佳时间?"; + case Label.SaveBestTimesDescription: return "你打破了一些最佳时间。要更新它们吗?"; + case Label.Yes: return "是"; + case Label.No: return "否"; + case Label.DontReset: return "不重置"; + case Label.FailedToExportSplits: return "导出分段失败。"; + case Label.CantImportEmptySplits: return "不能导入空分段。"; + case Label.FailedToReadFile: return "读取文件失败:"; + case Label.FailedToImportSplits: return "导入分段失败:"; + case Label.CouldNotParseSplits: return "无法解析分段。"; + case Label.LoadedSplitsInvalid: return "加载的分段无效。"; + case Label.NewSegmentName: return "时间"; + case Label.EditWhileRunningError: return "计时器运行时无法编辑分段。"; + case Label.Edit: return "编辑"; + case Label.Save: return "保存"; + case Label.Export: return "导出"; + case Label.FailedToParseTimeSpan: return "无法解析 TimeSpan"; + case Label.Default: return "默认"; + case Label.Game: return "游戏"; + case Label.Category: return "类别"; + case Label.StartTimerAt: return "开始计时于"; + case Label.Attempts: return "尝试次数"; + case Label.SplitsEditor: return "分段编辑器"; + case Label.Variables: return "变量"; + case Label.Rules: return "规则"; + case Label.Leaderboard: return "排行榜"; + case Label.InsertAbove: return "在上方插入"; + case Label.InsertBelow: return "在下方插入"; + case Label.RemoveSegment: return "删除分段"; + case Label.MoveUp: return "上移"; + case Label.MoveDown: return "下移"; + case Label.AddVariable: return "添加变量"; + case Label.OpenPbPage: return "打开个人最佳页面"; + case Label.AssociateRun: return "关联速通"; + case Label.Icon: return "图标"; + case Label.SegmentName: return "分段名称"; + case Label.SplitTime: return "分段时间"; + case Label.SegmentTime: return "段时间"; + case Label.BestSegment: return "最佳分段"; + case Label.SpeedrunComVariableTooltip: return "speedrun.com 上与游戏相关的变量。"; + case Label.Region: return "地区"; + case Label.RegionDescription: return "正在游玩的游戏地区。"; + case Label.Platform: return "平台"; + case Label.PlatformDescription: return "游玩的游戏平台。"; + case Label.UsesEmulator: return "使用模拟器"; + case Label.UsesEmulatorDescription: return "是否使用模拟器进行游戏。"; + case Label.CustomVariableTooltip: return "你自定义的变量,可用于文本组件显示。"; + case Label.NoVariables: return "当前没有此游戏的自定义变量。"; + case Label.NoVariablesWithSpeedrunCom: return "当前没有 speedrun.com 变量或自定义变量。"; + case Label.TimedWithoutLoads: return "计时不含加载时间"; + case Label.TimedWithGameTime: return "以游戏时间计时"; + case Label.RequireVideoProof: return "需要视频证明"; + case Label.RunsOfThisGamePrefix: return "此游戏的跑图"; + case Label.RunsOfThisGameSuffix: return "。"; + case Label.And: return "和"; + case Label.SetIcon: return "设置图标"; + case Label.SetIconDescription: return "选择图像文件作为游戏图标。某些格式可能不被支持。"; + case Label.DownloadBoxArt: return "下载封面"; + case Label.DownloadBoxArtDescription: return "尝试从 speedrun.com 下载封面并设置为游戏图标。"; + case Label.DownloadIcon: return "下载图标"; + case Label.DownloadIconDescription: return "尝试从 speedrun.com 下载图标。"; + case Label.RemoveIcon: return "移除图标"; + case Label.RemoveIconDescription: return "移除游戏图标。"; + case Label.CleaningMenu: return "清理…"; + case Label.ClearOnlyHistory: return "仅清理历史"; + case Label.ClearOnlyHistoryDescription: return "分段保存所有跑图历史(含每段时间)。此操作只清理历史,不影响个人最佳、最佳分段和比较。"; + case Label.ClearAllTimes: return "清除所有时间"; + case Label.ClearAllTimesDescription: return "移除所有时间和历史,使分段如同刚创建。"; + case Label.CleanSumOfBest: return "清理最优总和"; + case Label.CleanSumOfBestDescription: return "允许交互式移除导致最佳分段总和不准确的分段历史问题。"; + case Label.ComparisonsMenu: return "比较…"; + case Label.AddComparison: return "添加比较"; + case Label.AddComparisonDescription: return "添加新的自定义比较,可存放任意时间。"; + case Label.ImportComparison: return "导入比较"; + case Label.ImportComparisonDescription: return "将分段文件的个人最佳作为比较导入。"; + case Label.GenerateGoalComparison: return "生成目标比较"; + case Label.GenerateGoalComparisonDescription: return "根据目标时间生成自定义比较,并根据历史自动平衡分段时间。"; + case Label.CopyComparison: return "复制比较"; + case Label.CopyComparisonDescription: return "复制现有比较(含个人最佳或自动比较)。"; + case Label.SetSegmentIcon: return "设置图标"; + case Label.SetSegmentIconDescription: return "选择图像文件作为分段图标。某些格式可能不被支持。"; + case Label.RemoveSegmentIcon: return "移除图标"; + case Label.RemoveSegmentIconDescription: return "移除分段图标。"; + case Label.Rename: return "重命名"; + case Label.RenameDescription: return "为自定义比较选择新名称。保留名或重复名不可用。"; + case Label.CopyAction: return "复制"; + case Label.CopyDescription: return "创建自定义比较的副本。"; + case Label.ACopy: return "副本"; + case Label.Remove: return "移除"; + case Label.RemoveDescription: return "移除自定义比较。"; + case Label.AnyPercent: return "任意%"; + case Label.LowPercent: return "低%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "请输入要添加的比较名称:"; + case Label.ComparisonAddError: return "无法添加比较,可能重复或为保留名称。"; + case Label.ImportComparisonPrompt: return "请输入要导入的比较名称:"; + case Label.GenerateGoalComparisonPrompt: return "请输入要达到的时间:"; + case Label.Generate: return "生成"; + case Label.GenerateGoalComparisonError: return "生成目标比较失败,请确保时间有效。"; + case Label.CopyComparisonPrompt: return "请输入要复制的比较名称:"; + case Label.CopyComparisonError: return "复制比较失败,比较可能不存在。"; + case Label.NothingToCleanUp: return "没有需要清理的内容。"; + case Label.CleanPrompt: return "清理?"; + case Label.AssociateRunPrompt: return "请输入 speedrun.com 跑图 ID 或 URL:"; + case Label.Associate: return "关联"; + case Label.InvalidSpeedrunUrl: return "speedrun.com ID 或 URL 无效。"; + case Label.AssociateRunError: return "无法关联跑图,ID 可能无效。"; + case Label.AddVariablePrompt: return "请输入要添加的自定义变量名称:"; + case Label.RenameComparison: return "重命名比较"; + case Label.RenameComparisonPrompt: return "请输入新的比较名称:"; + case Label.ComparisonRenameError: return "无法重命名比较,可能重复或为保留名称。"; + case Label.GameNotFound: return "未找到该游戏。"; + case Label.NoBoxArt: return "该游戏没有封面。"; + case Label.DownloadBoxArtError: return "无法下载封面。"; + case Label.NoGameIcon: return "该游戏没有图标。"; + case Label.DownloadIconError: return "无法下载图标。"; + case Label.Rank: return "排名"; + case Label.Player: return "玩家"; + case Label.Time: return "时间"; + case Label.Date: return "日期:"; + case Label.Emulator: return "模拟器"; + case Label.EmulatorTag: return "模拟器"; + case Label.ObsoleteRuns: return "过时记录"; + case Label.Shown: return "显示"; + case Label.Hidden: return "隐藏"; + case Label.OpenLeaderboard: return "打开排行榜"; + case Label.Filters: return "筛选"; + case Label.LayoutEditor: return "布局编辑器"; + case Label.Component: return "组件"; + case Label.AddComponent: return "添加组件"; + case Label.RemoveComponent: return "移除组件"; + case Label.DuplicateComponent: return "复制组件"; + case Label.MoveComponentUp: return "组件上移"; + case Label.MoveComponentDown: return "组件下移"; + case Label.ComponentTitle: return "标题"; + case Label.ComponentTitleDescription: return "显示游戏名称与类别,可显示游戏图标、尝试次数和完成次数。"; + case Label.ComponentGraph: return "图表"; + case Label.ComponentGraphDescription: return "可视化整段跑图相对比较的领先/落后,显示各分段差值点。"; + case Label.ComponentSplitsDescription: return "显示所有分段时间的主要组件,表格展示图标、名称、差值与时间,可滚动。"; + case Label.ComponentDetailedTimer: return "详细计时"; + case Label.ComponentDetailedTimerDescription: return "显示总时间与当前分段时间,还可显示比较时间、分段图标和名称等。"; + case Label.ComponentTimer: return "计时器"; + case Label.ComponentTimerDescription: return "以数字时钟显示总时间,颜色随跑图表现变化。"; + case Label.ComponentCurrentComparison: return "当前比较"; + case Label.ComponentCurrentComparisonDescription: return "显示当前计时器比较对象名称。"; + case Label.ComponentCurrentPace: return "当前配速"; + case Label.ComponentCurrentPaceDescription: return "预测本次跑图最终时间,可基于选定比较(如最佳分段)进行预测。"; + case Label.ComponentDelta: return "差值"; + case Label.ComponentDeltaDescription: return "显示相对比较的领先/落后。"; + case Label.ComponentPbChance: return "PB 概率"; + case Label.ComponentPbChanceDescription: return "显示当前跑图击败个人最佳的概率,跑图中动态变化。"; + case Label.ComponentPossibleTimeSave: return "可节省时间"; + case Label.ComponentPossibleTimeSaveDescription: return "显示当前分段可节省时间,并可显示剩余总可节省时间。"; + case Label.ComponentPreviousSegment: return "上一分段"; + case Label.ComponentPreviousSegmentDescription: return "显示上一分段得失时间,可显示潜在节省时间,并在当前分段落后时显示实时分段。"; + case Label.ComponentSegmentTime: return "分段时间"; + case Label.ComponentSegmentTimeDescription: return "显示当前分段相对选定比较的时间,未指定时使用当前比较。"; + case Label.ComponentSumOfBest: return "最佳分段总和"; + case Label.ComponentSumOfBestDescription: return "基于历史跑图显示完成本类别的最快可能时间。"; + case Label.ComponentText: return "文本"; + case Label.ComponentTextDescription: return "显示指定文本,可单行居中或左右文本,也可显示自定义变量。"; + case Label.ComponentTotalPlaytime: return "总游玩时间"; + case Label.ComponentTotalPlaytimeDescription: return "显示当前类别的总游玩时长。"; + case Label.ComponentVariableDescription: return "创建显示自定义变量“{name}”的文本组件。"; + case Label.ComponentBlankSpace: return "空白"; + case Label.ComponentBlankSpaceDescription: return "仅显示背景的空组件,用作间距。"; + case Label.ComponentSeparator: return "分隔线"; + case Label.ComponentSeparatorDescription: return "在组件之间渲染分隔线。"; + case Label.AccuracySeconds: return "秒"; + case Label.AccuracyTenths: return "十分之一秒"; + case Label.AccuracyHundredths: return "百分之一秒"; + case Label.AccuracyMilliseconds: return "毫秒"; + case Label.FontStyle: return "样式"; + case Label.FontWeight: return "字重"; + case Label.FontStretch: return "拉伸"; + case Label.FontStyleNormal: return "常规"; + case Label.FontStyleItalic: return "斜体"; + case Label.AlignmentAutomatic: return "自动"; + case Label.AlignmentLeft: return "左"; + case Label.AlignmentCenter: return "居中"; + case Label.GradientTransparent: return "透明"; + case Label.GradientPlain: return "纯色"; + case Label.GradientVertical: return "垂直"; + case Label.GradientHorizontal: return "水平"; + case Label.GradientAlternating: return "交替"; + case Label.GradientPlainDelta: return "纯色差值"; + case Label.GradientVerticalDelta: return "垂直差值"; + case Label.GradientHorizontalDelta: return "水平差值"; + case Label.LayoutBackgroundImage: return "图片"; + case Label.LayoutBackgroundBrightness: return "亮度"; + case Label.LayoutBackgroundOpacity: return "不透明度"; + case Label.LayoutBackgroundBlur: return "模糊"; + case Label.LayoutDirectionVertical: return "垂直"; + case Label.LayoutDirectionHorizontal: return "水平"; + case Label.ColumnKindTime: return "时间"; + case Label.ColumnKindVariable: return "变量"; + case Label.ColumnStartWithEmpty: return "空"; + case Label.ColumnStartWithComparisonTime: return "对比时间"; + case Label.ColumnStartWithComparisonSegmentTime: return "对比区间时间"; + case Label.ColumnStartWithPossibleTimeSave: return "可节省时间"; + case Label.ColumnUpdateWithDontUpdate: return "不更新"; + case Label.ColumnUpdateWithSplitTime: return "分段时间"; + case Label.ColumnUpdateWithDelta: return "领先/落后时间"; + case Label.ColumnUpdateWithDeltaWithFallback: return "领先/落后时间(为空则分段时间)"; + case Label.ColumnUpdateWithSegmentTime: return "段时间"; + case Label.ColumnUpdateWithSegmentDelta: return "节省/损失时间"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "节省/损失时间(为空则段时间)"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "开始区间时"; + case Label.ColumnUpdateTriggerContextual: return "上下文"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "结束区间时"; + case Label.ComparisonCurrentComparison: return "当前比较"; + case Label.CustomVariableNoneAvailable: return "没有可用变量"; + case Label.CustomVariableNoneAvailableTooltip: return "可在编辑分段时的变量标签页中定义自定义变量。自动分段器也可自动提供额外的自定义变量。"; + case Label.HotkeyButtonTooltip: return "点击以录制热键。也可以使用手柄按钮。全局热键目前不可用。手柄按钮可全局使用。"; + case Label.ServerConnect: return "连接"; + case Label.ServerDisconnect: return "断开连接"; + case Label.ServerConnecting: return "正在连接..."; + case Label.ServerDisconnecting: return "正在断开连接..."; + case Label.ConnectToServerTitle: return "连接到服务器"; + case Label.ConnectToServerDescription: return "指定 WebSocket URL:"; + case Label.Connect: return "连接"; + case Label.UpdateAvailable: return "LiveSplit One 有新版本可用!点击此处重新加载。"; + case Label.UnsavedChangesBeforeUnload: return "有未保存的更改。确定要关闭 LiveSplit One 吗?"; + case Label.OpenSidebarAriaLabel: return "打开侧边栏"; + case Label.FailedToSaveLayout: return "保存布局失败。"; + case Label.FailedToSaveHotkeys: return "保存热键设置失败。"; + case Label.FailedToSaveGeneralSettings: return "保存常规设置失败。"; + case Label.FailedToSaveSplits: return "保存分段失败。"; + case Label.LayoutCouldNotBeLoaded: return "无法加载布局。这可能不是有效的 LiveSplit 或 LiveSplit One 布局。"; + case Label.EmptySplitsNotSupported: return "不支持空的分段。"; + case Label.BugEncountered: return "你遇到了一个错误:"; + case Label.PleaseReportIssueStart: return "请在"; + case Label.ReportHere: return "此处"; + case Label.PleaseReportIssueEnd: return "报告此问题。"; + case Label.BugReportInstructions: return "为帮助我们修复此问题,请提供复现步骤,并附上问题发生时你使用的分段和布局。"; + case Label.LoadFailedPrivateBrowsing: return "无法加载 LiveSplit One。\n你可能处于无痕/隐私浏览模式。\n由于浏览器隐私模式的限制,LiveSplit One 无法存储分段、布局或其他设置。\n这些限制可能会在未来解除。\n要继续使用 LiveSplit One,请在设置中关闭隐私浏览。"; + case Label.LoadFailedOutdatedBrowser: return "无法加载 LiveSplit One。\n你的浏览器可能不是最新版本。\n请更新浏览器或 iOS 版本后重试。\n另一种可能是浏览器扩展(如广告拦截器)阻止了重要脚本的访问。"; + } +} diff --git a/src/localization/chinese-traditional.ts b/src/localization/chinese-traditional.ts new file mode 100644 index 000000000..84f3cf248 --- /dev/null +++ b/src/localization/chinese-traditional.ts @@ -0,0 +1,107 @@ +import { Label } from "."; +import { resolveChineseSimplified } from "./chinese-simplified"; + +export function resolveChineseTraditional(text: Label): string { + return toTraditional(resolveChineseSimplified(text)); +} + +const TRADITIONAL_REPLACEMENTS: [string, string][] = [ + ["游戏时间", "遊戲時間"], + ["实时时间", "實時時間"], + ["计时器", "計時器"], + ["导入", "導入"], + ["导出", "導出"], + ["复制", "複製"], + ["删除", "刪除"], + ["编辑", "編輯"], + ["加载", "載入"], + ["页面", "頁面"], + ["列表", "清單"], + ["筛选", "篩選"], + ["过滤", "過濾"], + ["组件", "元件"], + ["文本", "文字"], + ["标题", "標題"], + ["时间", "時間"], + ["次数", "次數"], + ["变量", "變數"], + ["区域", "區域"], + ["地区", "地區"], + ["网络", "網路"], + ["选项", "選項"], + ["比较", "比較"], + ["对比", "對比"], + ["自动", "自動"], + ["设置", "設定"], + ["语言", "語言"], + ["热键", "熱鍵"], + ["帧率", "幀率"], + ["电池", "電池"], + ["显示", "顯示"], + ["按钮", "按鈕"], + ["开始", "開始"], + ["继续", "繼續"], + ["暂停", "暫停"], + ["撤销", "撤銷"], + ["重置", "重設"], + ["跳过", "跳過"], + ["图标", "圖示"], + ["图表", "圖表"], + ["图", "圖"], + ["标", "標"], + ["导", "導"], + ["选", "選"], + ["项", "項"], + ["开", "開"], + ["关", "關"], + ["线", "線"], + ["数", "數"], + ["确", "確"], + ["类", "類"], + ["统", "統"], + ["换", "換"], + ["页", "頁"], + ["后", "後"], + ["为", "為"], + ["并", "並"], + ["发", "發"], + ["试", "試"], + ["验", "驗"], + ["证", "證"], + ["节", "節"], + ["录", "錄"], + ["输", "輸"], + ["这里", "這裡"], + ["简", "簡"], + ["体", "體"], + ["预", "預"], + ["测", "測"], + ["样", "樣"], + ["总", "總"], + ["优", "優"], + ["胜", "勝"], + ["环", "環"], + ["连", "連"], + ["应", "應"], + ["尽", "盡"], + ["边", "邊"], + ["构", "構"], + ["态", "態"], + ["宽", "寬"], + ["缩", "縮"], + ["释", "釋"], + ["压", "壓"], + ["频", "頻"], + ["与", "與"], + ["内", "內"], + ["参", "參"], + ["历", "歷"], +]; + +function toTraditional(value: string): string { + let result = value; + for (const [from, to] of TRADITIONAL_REPLACEMENTS) { + result = result.replaceAll(from, to); + } + return result; +} diff --git a/src/localization/dutch.ts b/src/localization/dutch.ts new file mode 100644 index 000000000..eb8296628 --- /dev/null +++ b/src/localization/dutch.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveDutch(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Annuleren"; + case Label.Settings: return "Instellingen"; + case Label.Language: return "Taal"; + case Label.LanguageDescription: return "Stelt de taal in die in de applicatie wordt gebruikt."; + case Label.LanguageAuto: return "Automatisch"; + case Label.HotkeysHeading: return "Sneltoetsen"; + case Label.GeneralHeading: return "Algemeen"; + case Label.NetworkHeading: return "Netwerk"; + case Label.FrameRate: return "Framesnelheid"; + case Label.FrameRateDescription: return "Bepaalt de framesnelheid waarmee de timer wordt weergegeven. “Batterijbewust” probeert op basis van apparaattype en laadstatus een goede framesnelheid te kiezen. “Scherm overeenkomen” laat de timer overeenkomen met de verversingssnelheid van het scherm."; + case Label.FrameRateBatteryAware: return "Batterijbewust"; + case Label.FrameRateMatchScreen: return "Scherm overeenkomen"; + case Label.SaveOnReset: return "Opslaan bij reset"; + case Label.SaveOnResetDescription: return "Bepaalt of de splits automatisch worden opgeslagen bij het resetten van de timer."; + case Label.ShowControlButtons: return "Bedieningsknoppen tonen"; + case Label.ShowControlButtonsDescription: return "Bepaalt of er knoppen onder de timer worden getoond om deze te bedienen. Als dit is uitgeschakeld, moet je de sneltoetsen gebruiken."; + case Label.ShowManualGameTimeInput: return "Handmatige speltijdinvoer tonen"; + case Label.ShowManualGameTimeInputDescription: return "Toont een tekstvak onder de timer waarmee je de speltijd handmatig kunt invoeren. Je start de timer en splitst door op Enter in het tekstvak te drukken. Zorg dat je vergelijkt met “Game Time”."; + case Label.ManualGameTimeMode: return "Handmatige speltijdmodus"; + case Label.ManualGameTimeModeDescription: return "Bepaalt of de handmatige speltijd wordt ingevoerd als segmenttijden of split tijden."; + case Label.ManualGameTimeModeSegmentTimes: return "Segmenttijden"; + case Label.ManualGameTimeModeSplitTimes: return "Split tijden"; + case Label.AlwaysOnTop: return "Altijd bovenaan"; + case Label.AlwaysOnTopDescription: return "Houdt het venster altijd boven andere vensters."; + case Label.SpeedrunComIntegration: return "Speedrun.com-integratie"; + case Label.SpeedrunComIntegrationDescription: return "Vraagt de lijst met games, categorieën en ranglijsten op van speedrun.com."; + case Label.ServerConnection: return "Serververbinding"; + case Label.ServerConnectionDescription: return "Staat toe om verbinding te maken met een WebSocket-server die de timer kan besturen door verschillende opdrachten te verzenden. De opdrachten zijn momenteel een subset van de opdrachten die de originele LiveSplit ondersteunt."; + case Label.ServerConnectionExperimental: return "Deze functie is experimenteel en het protocol zal waarschijnlijk in de toekomst veranderen."; + case Label.HotkeyAlreadyInUse: return "De sneltoets is al in gebruik."; + case Label.Start: return "Start"; + case Label.Resume: return "Hervatten"; + case Label.Pause: return "Pauze"; + case Label.UndoSplit: return "Split ongedaan maken"; + case Label.Reset: return "Reset"; + case Label.SkipSplit: return "Split overslaan"; + case Label.ManualGameTimePlaceholder: return "Handmatige speltijd"; + case Label.LiveSplitLogoAlt: return "LiveSplit‑logo"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Lay‑out"; + case Label.CompareAgainst: return "Vergelijken met"; + case Label.RealTime: return "Realtime"; + case Label.GameTime: return "Speltijd"; + case Label.PopOut: return "Pop‑out"; + case Label.About: return "Over"; + case Label.Back: return "Terug"; + case Label.AboutVersionPrefix: return "Versie:"; + case Label.AboutDescription: return "LiveSplit One is een multiplatform‑versie van LiveSplit, de strakke en zeer aanpasbare timer voor speedrunners."; + case Label.AboutViewSource: return "Bekijk de broncode op GitHub"; + case Label.AboutRecentChanges: return "Recente wijzigingen"; + case Label.AboutContributors: return "Bijdragers"; + case Label.Loading: return "Laden..."; + case Label.Add: return "Toevoegen"; + case Label.Import: return "Importeren"; + case Label.OpenSplits: return "Splits openen"; + case Label.EditSplits: return "Splits bewerken"; + case Label.ExportSplits: return "Splits exporteren"; + case Label.CopySplits: return "Splits kopiëren"; + case Label.RemoveSplits: return "Splits verwijderen"; + case Label.Untitled: return "Naamloos"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Wijzigingen verwerpen?"; + case Label.DiscardChangesDescription: return "Je huidige splits zijn gewijzigd en hebben niet-opgeslagen wijzigingen. Wil je doorgaan en die wijzigingen verwerpen?"; + case Label.DeleteSplitsTitle: return "Splits verwijderen?"; + case Label.DeleteSplitsDescription: return "Weet je zeker dat je de splits wilt verwijderen? Deze bewerking kan niet ongedaan worden gemaakt."; + case Label.SaveBestTimesTitle: return "Beste tijden opslaan?"; + case Label.SaveBestTimesDescription: return "Je hebt enkele van je beste tijden verbeterd. Wil je ze bijwerken?"; + case Label.Yes: return "Ja"; + case Label.No: return "Nee"; + case Label.DontReset: return "Niet resetten"; + case Label.FailedToExportSplits: return "Exporteren van de splits is mislukt."; + case Label.CantImportEmptySplits: return "Kan geen lege splits importeren."; + case Label.FailedToReadFile: return "Bestand lezen mislukt:"; + case Label.FailedToImportSplits: return "Splits importeren mislukt:"; + case Label.CouldNotParseSplits: return "Kon de splits niet parseren."; + case Label.LoadedSplitsInvalid: return "De geladen splits zijn ongeldig."; + case Label.NewSegmentName: return "Tijd"; + case Label.EditWhileRunningError: return "Je kunt je splits niet bewerken terwijl de timer loopt."; + case Label.Edit: return "Bewerken"; + case Label.Save: return "Opslaan"; + case Label.Export: return "Exporteren"; + case Label.FailedToParseTimeSpan: return "TimeSpan kon niet worden geparseerd"; + case Label.Default: return "Standaard"; + case Label.Game: return "Game"; + case Label.Category: return "Categorie"; + case Label.StartTimerAt: return "Timer starten op"; + case Label.Attempts: return "Pogingen"; + case Label.SplitsEditor: return "Splits‑editor"; + case Label.Variables: return "Variabelen"; + case Label.Rules: return "Regels"; + case Label.Leaderboard: return "Leaderboard"; + case Label.InsertAbove: return "Boven invoegen"; + case Label.InsertBelow: return "Onder invoegen"; + case Label.RemoveSegment: return "Segment verwijderen"; + case Label.MoveUp: return "Omhoog"; + case Label.MoveDown: return "Omlaag"; + case Label.AddVariable: return "Variabele toevoegen"; + case Label.OpenPbPage: return "PB‑pagina openen"; + case Label.AssociateRun: return "Run koppelen"; + case Label.Icon: return "Pictogram"; + case Label.SegmentName: return "Segmentnaam"; + case Label.SplitTime: return "Split‑tijd"; + case Label.SegmentTime: return "Segmenttijd"; + case Label.BestSegment: return "Beste segment"; + case Label.SpeedrunComVariableTooltip: return "Een speedrun.com‑variabele specifiek voor de game."; + case Label.Region: return "Regio"; + case Label.RegionDescription: return "De regio van de game die wordt gespeeld."; + case Label.Platform: return "Platform"; + case Label.PlatformDescription: return "Het platform waarop de game wordt gespeeld."; + case Label.UsesEmulator: return "Emulator gebruikt"; + case Label.UsesEmulatorDescription: return "Of er een emulator wordt gebruikt om te spelen."; + case Label.CustomVariableTooltip: return "Een door jou opgegeven variabele. Deze kan worden weergegeven met de tekstcomponent."; + case Label.NoVariables: return "Er zijn momenteel geen aangepaste variabelen voor deze game."; + case Label.NoVariablesWithSpeedrunCom: return "Er zijn momenteel geen speedrun.com‑variabelen of aangepaste variabelen voor deze game."; + case Label.TimedWithoutLoads: return "worden getimed zonder laadtijden"; + case Label.TimedWithGameTime: return "worden getimed met Game Time"; + case Label.RequireVideoProof: return "vereisen videobewijs"; + case Label.RunsOfThisGamePrefix: return "Runs van deze game "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "en"; + case Label.SetIcon: return "Pictogram instellen"; + case Label.SetIconDescription: return "Kies een afbeeldingsbestand als game‑pictogram. Bepaalde bestandsindelingen werken mogelijk niet overal."; + case Label.DownloadBoxArt: return "Box‑art downloaden"; + case Label.DownloadBoxArtDescription: return "Probeert box‑art van speedrun.com te downloaden en als game‑pictogram in te stellen."; + case Label.DownloadIcon: return "Pictogram downloaden"; + case Label.DownloadIconDescription: return "Probeert het pictogram van de game te downloaden van speedrun.com."; + case Label.RemoveIcon: return "Pictogram verwijderen"; + case Label.RemoveIconDescription: return "Verwijdert het game‑pictogram."; + case Label.CleaningMenu: return "Opschonen…"; + case Label.ClearOnlyHistory: return "Alleen geschiedenis wissen"; + case Label.ClearOnlyHistoryDescription: return "Splits bewaren de volledige geschiedenis van alle runs, inclusief elke segmenttijd. Je kunt hiermee de geschiedenis wissen. Personal best, beste segmenttijden en vergelijkingen blijven intact."; + case Label.ClearAllTimes: return "Alle tijden wissen"; + case Label.ClearAllTimesDescription: return "Verwijdert alle tijden uit de splits, inclusief de geschiedenis, zodat de splits volledig leeg zijn."; + case Label.CleanSumOfBest: return "Som van beste opschonen"; + case Label.CleanSumOfBestDescription: return "Laat je interactief problemen in de segmentgeschiedenis verwijderen die tot een onjuiste som van beste segmenten leiden."; + case Label.ComparisonsMenu: return "Vergelijkingen…"; + case Label.AddComparison: return "Vergelijking toevoegen"; + case Label.AddComparisonDescription: return "Voegt een nieuwe aangepaste vergelijking toe waarin je tijden kunt opslaan."; + case Label.ImportComparison: return "Vergelijking importeren"; + case Label.ImportComparisonDescription: return "Importeert de Personal Best van een splits‑bestand als vergelijking."; + case Label.GenerateGoalComparison: return "Doelvergelijking genereren"; + case Label.GenerateGoalComparisonDescription: return "Genereert een aangepaste doelvergelijking op basis van een doel‑tijd die je opgeeft."; + case Label.CopyComparison: return "Vergelijking kopiëren"; + case Label.CopyComparisonDescription: return "Maakt een kopie van een bestaande vergelijking."; + case Label.SetSegmentIcon: return "Pictogram instellen"; + case Label.SetSegmentIconDescription: return "Kies een afbeeldingsbestand als segment‑pictogram. Bepaalde indelingen werken mogelijk niet overal."; + case Label.RemoveSegmentIcon: return "Pictogram verwijderen"; + case Label.RemoveSegmentIconDescription: return "Verwijdert het segment‑pictogram."; + case Label.Rename: return "Hernoemen"; + case Label.RenameDescription: return "Kies een nieuwe naam voor de aangepaste vergelijking. Gereserveerde namen of duplicaten zijn niet toegestaan."; + case Label.CopyAction: return "Kopiëren"; + case Label.CopyDescription: return "Maakt een kopie van de aangepaste vergelijking."; + case Label.ACopy: return "Kopie"; + case Label.Remove: return "Verwijderen"; + case Label.RemoveDescription: return "Verwijdert de aangepaste vergelijking."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Geef de naam van de vergelijking op die je wilt toevoegen:"; + case Label.ComparisonAddError: return "De vergelijking kon niet worden toegevoegd. Mogelijk is de naam duplicaat of gereserveerd."; + case Label.ImportComparisonPrompt: return "Geef de naam van de vergelijking op die je wilt importeren:"; + case Label.GenerateGoalComparisonPrompt: return "Geef de tijd op die je wilt behalen:"; + case Label.Generate: return "Genereren"; + case Label.GenerateGoalComparisonError: return "Doelvergelijking genereren mislukt. Controleer of de tijd geldig is."; + case Label.CopyComparisonPrompt: return "Geef de naam van de vergelijking op die je wilt kopiëren:"; + case Label.CopyComparisonError: return "Kopiëren van de vergelijking mislukt. Mogelijk bestaat de vergelijking niet."; + case Label.NothingToCleanUp: return "Er is niets op te schonen."; + case Label.CleanPrompt: return "Opschonen?"; + case Label.AssociateRunPrompt: return "Geef de speedrun.com‑ID of URL van de run op:"; + case Label.Associate: return "Koppelen"; + case Label.InvalidSpeedrunUrl: return "Ongeldige speedrun.com‑ID of URL."; + case Label.AssociateRunError: return "Run koppelen mislukt. De ID is mogelijk ongeldig."; + case Label.AddVariablePrompt: return "Geef de naam van de aangepaste variabele op die je wilt toevoegen:"; + case Label.RenameComparison: return "Vergelijking hernoemen"; + case Label.RenameComparisonPrompt: return "Geef de nieuwe naam van de vergelijking op:"; + case Label.ComparisonRenameError: return "De vergelijking kon niet worden hernoemd. Mogelijk duplicaat of gereserveerde naam."; + case Label.GameNotFound: return "Game niet gevonden."; + case Label.NoBoxArt: return "De game heeft geen box‑art."; + case Label.DownloadBoxArtError: return "Box‑art downloaden mislukt."; + case Label.NoGameIcon: return "De game heeft geen pictogram."; + case Label.DownloadIconError: return "Pictogram downloaden mislukt."; + case Label.Rank: return "Rang"; + case Label.Player: return "Speler"; + case Label.Time: return "Tijd"; + case Label.Date: return "Datum:"; + case Label.Emulator: return "Emulator"; + case Label.EmulatorTag: return "Emulator"; + case Label.ObsoleteRuns: return "Verouderde runs"; + case Label.Shown: return "Getoond"; + case Label.Hidden: return "Verborgen"; + case Label.OpenLeaderboard: return "Leaderboard openen"; + case Label.Filters: return "Filters"; + case Label.LayoutEditor: return "Lay‑outeditor"; + case Label.Component: return "Component"; + case Label.AddComponent: return "Component toevoegen"; + case Label.RemoveComponent: return "Component verwijderen"; + case Label.DuplicateComponent: return "Component dupliceren"; + case Label.MoveComponentUp: return "Component omhoog"; + case Label.MoveComponentDown: return "Component omlaag"; + case Label.ComponentTitle: return "Titel"; + case Label.ComponentTitleDescription: return "Toont de naam van de game en de categorie, plus eventueel icoon, pogingen en voltooide runs."; + case Label.ComponentGraph: return "Grafiek"; + case Label.ComponentGraphDescription: return "Visualiseert hoe ver de run voor/achter ligt t.o.v. de vergelijking, met punten per delta."; + case Label.ComponentSplitsDescription: return "Hoofdcomponent voor split‑tijden met icoon, naam, delta en tijd; bevat scrollen."; + case Label.ComponentDetailedTimer: return "Gedetailleerde timer"; + case Label.ComponentDetailedTimerDescription: return "Toont totale tijd en segmenttijd, plus optioneel vergelijkingen, icoon en naam."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Toont totale tijd als digitale klok, kleur gebaseerd op vergelijking."; + case Label.ComponentCurrentComparison: return "Huidige vergelijking"; + case Label.ComponentCurrentComparisonDescription: return "Toont de naam van de huidige vergelijking."; + case Label.ComponentCurrentPace: return "Huidige pace"; + case Label.ComponentCurrentPaceDescription: return "Voorspelt de eindtijd op basis van de gekozen vergelijking."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Toont hoeveel je voor/achter ligt t.o.v. de vergelijking."; + case Label.ComponentPbChance: return "PB‑kans"; + case Label.ComponentPbChanceDescription: return "Toont de kans om PB te halen; verandert tijdens de run."; + case Label.ComponentPossibleTimeSave: return "Mogelijke tijdbesparing"; + case Label.ComponentPossibleTimeSaveDescription: return "Toont mogelijke besparing op het huidige segment en totaal."; + case Label.ComponentPreviousSegment: return "Vorig segment"; + case Label.ComponentPreviousSegmentDescription: return "Toont winst/verlies in vorig segment en potentiële besparing; kan Live Segment tonen."; + case Label.ComponentSegmentTime: return "Segmenttijd"; + case Label.ComponentSegmentTimeDescription: return "Toont segmenttijd voor de gekozen vergelijking; anders huidige vergelijking."; + case Label.ComponentSumOfBest: return "Som van beste"; + case Label.ComponentSumOfBestDescription: return "Toont de snelst mogelijke eindtijd op basis van historische runs."; + case Label.ComponentText: return "Tekst"; + case Label.ComponentTextDescription: return "Toont tekst; gecentreerd of links/rechts, of een aangepaste variabele."; + case Label.ComponentTotalPlaytime: return "Totale speeltijd"; + case Label.ComponentTotalPlaytimeDescription: return "Toont de totale speeltijd van de categorie."; + case Label.ComponentVariableDescription: return "Maakt een tekstcomponent die de waarde van variabele “{name}” toont."; + case Label.ComponentBlankSpace: return "Lege ruimte"; + case Label.ComponentBlankSpaceDescription: return "Leeg component voor padding tussen onderdelen."; + case Label.ComponentSeparator: return "Scheiding"; + case Label.ComponentSeparatorDescription: return "Tekent een scheidingslijn tussen componenten."; + case Label.AccuracySeconds: return "Seconden"; + case Label.AccuracyTenths: return "Tienden"; + case Label.AccuracyHundredths: return "Honderdsten"; + case Label.AccuracyMilliseconds: return "Milliseconden"; + case Label.FontStyle: return "Stijl"; + case Label.FontWeight: return "Gewicht"; + case Label.FontStretch: return "Rek"; + case Label.FontStyleNormal: return "Normaal"; + case Label.FontStyleItalic: return "Cursief"; + case Label.AlignmentAutomatic: return "Automatisch"; + case Label.AlignmentLeft: return "Links"; + case Label.AlignmentCenter: return "Midden"; + case Label.GradientTransparent: return "Transparant"; + case Label.GradientPlain: return "Effen"; + case Label.GradientVertical: return "Verticaal"; + case Label.GradientHorizontal: return "Horizontaal"; + case Label.GradientAlternating: return "Afwisselend"; + case Label.GradientPlainDelta: return "Effen delta"; + case Label.GradientVerticalDelta: return "Verticale delta"; + case Label.GradientHorizontalDelta: return "Horizontale delta"; + case Label.LayoutBackgroundImage: return "Afbeelding"; + case Label.LayoutBackgroundBrightness: return "Helderheid"; + case Label.LayoutBackgroundOpacity: return "Ondoorzichtigheid"; + case Label.LayoutBackgroundBlur: return "Vervaging"; + case Label.LayoutDirectionVertical: return "Verticaal"; + case Label.LayoutDirectionHorizontal: return "Horizontaal"; + case Label.ColumnKindTime: return "Tijd"; + case Label.ColumnKindVariable: return "Variabele"; + case Label.ColumnStartWithEmpty: return "Leeg"; + case Label.ColumnStartWithComparisonTime: return "Vergelijkingstijd"; + case Label.ColumnStartWithComparisonSegmentTime: return "Vergelijking segmenttijd"; + case Label.ColumnStartWithPossibleTimeSave: return "Mogelijke tijdswinst"; + case Label.ColumnUpdateWithDontUpdate: return "Niet bijwerken"; + case Label.ColumnUpdateWithSplitTime: return "Split‑tijd"; + case Label.ColumnUpdateWithDelta: return "Tijd voor/achter"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Tijd voor/achter of split‑tijd indien leeg"; + case Label.ColumnUpdateWithSegmentTime: return "Segmenttijd"; + case Label.ColumnUpdateWithSegmentDelta: return "Tijd gewonnen/verloren"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Tijd gewonnen/verloren of segmenttijd indien leeg"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Bij starten segment"; + case Label.ColumnUpdateTriggerContextual: return "Contextueel"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Bij einde segment"; + case Label.ComparisonCurrentComparison: return "Huidige vergelijking"; + case Label.CustomVariableNoneAvailable: return "Geen variabelen beschikbaar"; + case Label.CustomVariableNoneAvailableTooltip: return "Aangepaste variabelen kunnen worden gedefinieerd op het tabblad Variabelen bij het bewerken van splits. Extra aangepaste variabelen kunnen automatisch worden geleverd door auto splitters."; + case Label.HotkeyButtonTooltip: return "Klik om een sneltoets op te nemen. Je kunt ook knoppen op een gamepad gebruiken. Globale sneltoetsen zijn momenteel niet mogelijk. Gamepadknoppen werken globaal."; + case Label.ServerConnect: return "Verbinden"; + case Label.ServerDisconnect: return "Verbinding verbreken"; + case Label.ServerConnecting: return "Bezig met verbinden..."; + case Label.ServerDisconnecting: return "Bezig met verbreken..."; + case Label.ConnectToServerTitle: return "Verbinden met server"; + case Label.ConnectToServerDescription: return "Geef de WebSocket-URL op:"; + case Label.Connect: return "Verbinden"; + case Label.UpdateAvailable: return "Er is een nieuwe versie van LiveSplit One beschikbaar! Klik hier om opnieuw te laden."; + case Label.UnsavedChangesBeforeUnload: return "Er zijn niet-opgeslagen wijzigingen. Wil je LiveSplit One echt sluiten?"; + case Label.OpenSidebarAriaLabel: return "Zijbalk openen"; + case Label.FailedToSaveLayout: return "Lay-out opslaan mislukt."; + case Label.FailedToSaveHotkeys: return "Sneltoetsinstellingen opslaan mislukt."; + case Label.FailedToSaveGeneralSettings: return "Algemene instellingen opslaan mislukt."; + case Label.FailedToSaveSplits: return "Splits opslaan mislukt."; + case Label.LayoutCouldNotBeLoaded: return "De lay-out kon niet worden geladen. Dit is mogelijk geen geldige LiveSplit- of LiveSplit One-lay-out."; + case Label.EmptySplitsNotSupported: return "Lege splits worden niet ondersteund."; + case Label.BugEncountered: return "Er is een fout opgetreden:"; + case Label.PleaseReportIssueStart: return "Meld dit probleem "; + case Label.ReportHere: return "hier"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Om ons te helpen dit probleem op te lossen, voeg de stappen toe om het te reproduceren en voeg de splits en lay‑out toe die je gebruikte toen het probleem optrad."; + case Label.LoadFailedPrivateBrowsing: return "LiveSplit One kon niet worden geladen.\nMogelijk gebruik je de privé‑modus.\nLiveSplit One kan geen splits, lay‑outs of andere instellingen opslaan door beperkingen van privé‑browsen.\nDeze beperkingen kunnen in de toekomst worden opgeheven.\nOm LiveSplit One nu te gebruiken, schakel privé‑browsen uit in je instellingen."; + case Label.LoadFailedOutdatedBrowser: return "LiveSplit One kon niet worden geladen.\nMogelijk gebruik je een verouderde browser.\nWerk je browser of iOS‑versie bij en probeer het opnieuw.\nEen andere oorzaak kan een browserextensie zijn, zoals een adblocker, die de toegang tot belangrijke scripts blokkeert."; + } +} diff --git a/src/localization/english.ts b/src/localization/english.ts new file mode 100644 index 000000000..c2d93a4fa --- /dev/null +++ b/src/localization/english.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveEnglish(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Cancel"; + case Label.Settings: return "Settings"; + case Label.Language: return "Language"; + case Label.LanguageDescription: return "Sets the language used in the application."; + case Label.LanguageAuto: return "Automatic"; + case Label.HotkeysHeading: return "Hotkeys"; + case Label.GeneralHeading: return "General"; + case Label.NetworkHeading: return "Network"; + case Label.FrameRate: return "Frame Rate"; + case Label.FrameRateDescription: return "Determines the frame rate at which to display the timer. “Battery Aware” tries determining the type of device and charging status to select a good frame rate. “Match Screen” makes the timer match the screen's refresh rate."; + case Label.FrameRateBatteryAware: return "Battery Aware"; + case Label.FrameRateMatchScreen: return "Match Screen"; + case Label.SaveOnReset: return "Save On Reset"; + case Label.SaveOnResetDescription: return "Determines whether to automatically save the splits when resetting the timer."; + case Label.ShowControlButtons: return "Show Control Buttons"; + case Label.ShowControlButtonsDescription: return "Determines whether to show buttons beneath the timer that allow controlling it. When disabled, you have to use the hotkeys instead."; + case Label.ShowManualGameTimeInput: return "Show Manual Game Time Input"; + case Label.ShowManualGameTimeInputDescription: return "Shows a text box beneath the timer that allows you to manually input the game time. You start the timer and do splits by pressing the Enter key in the text box. Make sure to compare against “Game Time”."; + case Label.ManualGameTimeMode: return "Manual Game Time Mode"; + case Label.ManualGameTimeModeDescription: return "Determines whether to input the manual game time as segment times or split times."; + case Label.ManualGameTimeModeSegmentTimes: return "Segment Times"; + case Label.ManualGameTimeModeSplitTimes: return "Split Times"; + case Label.AlwaysOnTop: return "Always On Top"; + case Label.AlwaysOnTopDescription: return "Keeps the window always on top of other windows."; + case Label.SpeedrunComIntegration: return "Speedrun.com Integration"; + case Label.SpeedrunComIntegrationDescription: return "Queries the list of games, categories, and the leaderboards from speedrun.com."; + case Label.ServerConnection: return "Server Connection"; + case Label.ServerConnectionDescription: return "Allows you to connect to a WebSocket server that can control the timer by sending various commands. The commands are currently a subset of the commands the original LiveSplit supports."; + case Label.ServerConnectionExperimental: return "This feature is experimental and the protocol will likely change in the future."; + case Label.HotkeyAlreadyInUse: return "The hotkey is already in use."; + case Label.Start: return "Start"; + case Label.Resume: return "Resume"; + case Label.Pause: return "Pause"; + case Label.UndoSplit: return "Undo Split"; + case Label.Reset: return "Reset"; + case Label.SkipSplit: return "Skip Split"; + case Label.ManualGameTimePlaceholder: return "Manual Game Time"; + case Label.LiveSplitLogoAlt: return "LiveSplit Logo"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Layout"; + case Label.CompareAgainst: return "Compare Against"; + case Label.RealTime: return "Real Time"; + case Label.GameTime: return "Game Time"; + case Label.PopOut: return "Pop Out"; + case Label.About: return "About"; + case Label.Back: return "Back"; + case Label.AboutVersionPrefix: return "Version:"; + case Label.AboutDescription: return "LiveSplit One is a multiplatform version of LiveSplit, the sleek, highly-customizable timer for speedrunners."; + case Label.AboutViewSource: return "View Source Code on GitHub"; + case Label.AboutRecentChanges: return "Recent Changes"; + case Label.AboutContributors: return "Contributors"; + case Label.Loading: return "Loading..."; + case Label.Add: return "Add"; + case Label.Import: return "Import"; + case Label.OpenSplits: return "Open Splits"; + case Label.EditSplits: return "Edit Splits"; + case Label.ExportSplits: return "Export Splits"; + case Label.CopySplits: return "Copy Splits"; + case Label.RemoveSplits: return "Remove Splits"; + case Label.Untitled: return "Untitled"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Discard Changes?"; + case Label.DiscardChangesDescription: return "Your current splits are modified and have unsaved changes. Do you want to continue and discard those changes?"; + case Label.DeleteSplitsTitle: return "Delete Splits?"; + case Label.DeleteSplitsDescription: return "Are you sure you want to delete the splits? This operation can not be undone."; + case Label.SaveBestTimesTitle: return "Save Best Times?"; + case Label.SaveBestTimesDescription: return "You have beaten some of your best times. Do you want to update them?"; + case Label.Yes: return "Yes"; + case Label.No: return "No"; + case Label.DontReset: return "Don't Reset"; + case Label.FailedToExportSplits: return "Failed to export the splits."; + case Label.CantImportEmptySplits: return "Can't import empty splits."; + case Label.FailedToReadFile: return "Failed to read the file:"; + case Label.FailedToImportSplits: return "Failed to import the splits:"; + case Label.CouldNotParseSplits: return "Couldn't parse the splits."; + case Label.LoadedSplitsInvalid: return "The loaded splits are invalid."; + case Label.NewSegmentName: return "Time"; + case Label.EditWhileRunningError: return "You can't edit your splits while the timer is running."; + case Label.Edit: return "Edit"; + case Label.Save: return "Save"; + case Label.Export: return "Export"; + case Label.FailedToParseTimeSpan: return "Failed to parse TimeSpan"; + case Label.Default: return "Default"; + case Label.Game: return "Game"; + case Label.Category: return "Category"; + case Label.StartTimerAt: return "Start Timer At"; + case Label.Attempts: return "Attempts"; + case Label.SplitsEditor: return "Splits Editor"; + case Label.Variables: return "Variables"; + case Label.Rules: return "Rules"; + case Label.Leaderboard: return "Leaderboard"; + case Label.InsertAbove: return "Insert Above"; + case Label.InsertBelow: return "Insert Below"; + case Label.RemoveSegment: return "Remove Segment"; + case Label.MoveUp: return "Move Up"; + case Label.MoveDown: return "Move Down"; + case Label.AddVariable: return "Add Variable"; + case Label.OpenPbPage: return "Open PB Page"; + case Label.AssociateRun: return "Associate Run"; + case Label.Icon: return "Icon"; + case Label.SegmentName: return "Segment Name"; + case Label.SplitTime: return "Split Time"; + case Label.SegmentTime: return "Segment Time"; + case Label.BestSegment: return "Best Segment"; + case Label.SpeedrunComVariableTooltip: return "A variable on speedrun.com specific to the game."; + case Label.Region: return "Region"; + case Label.RegionDescription: return "The region of the game that is being played."; + case Label.Platform: return "Platform"; + case Label.PlatformDescription: return "The platform that the game is being played on."; + case Label.UsesEmulator: return "Uses Emulator"; + case Label.UsesEmulatorDescription: return "Whether an emulator is being used to play the game."; + case Label.CustomVariableTooltip: return "A custom variable specified by you. These can be displayed with the text component."; + case Label.NoVariables: return "There are currently no custom variables for this game."; + case Label.NoVariablesWithSpeedrunCom: return "There are currently no Speedrun.com variables or custom variables for this game."; + case Label.TimedWithoutLoads: return "are timed without the loading times"; + case Label.TimedWithGameTime: return "are timed with Game Time"; + case Label.RequireVideoProof: return "require video proof"; + case Label.RunsOfThisGamePrefix: return "Runs of this game "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "and"; + case Label.SetIcon: return "Set Icon"; + case Label.SetIconDescription: return "Allows you to choose an image file to set as the game's icon. Certain file formats may not work everywhere."; + case Label.DownloadBoxArt: return "Download Box Art"; + case Label.DownloadBoxArtDescription: return "Attempts to download the box art of the game from speedrun.com, to set as the game's icon."; + case Label.DownloadIcon: return "Download Icon"; + case Label.DownloadIconDescription: return "Attempts to download the icon of the game from speedrun.com."; + case Label.RemoveIcon: return "Remove Icon"; + case Label.RemoveIconDescription: return "Removes the icon of the game."; + case Label.CleaningMenu: return "Cleaning…"; + case Label.ClearOnlyHistory: return "Clear Only History"; + case Label.ClearOnlyHistoryDescription: return "Splits store the entire history of all runs, including every segment time. This information is used by various components. You can clear the history with this. The personal best, the best segment times, and the comparisons will not be affected."; + case Label.ClearAllTimes: return "Clear All Times"; + case Label.ClearAllTimesDescription: return "This removes all the times from the splits, including all the history, such that the splits are completely empty, as if they were just created."; + case Label.CleanSumOfBest: return "Clean Sum of Best"; + case Label.CleanSumOfBestDescription: return "Allows you to interactively remove potential issues in the segment history that lead to an inaccurate Sum of Best Segments. If you skip a split, whenever you will do the next split, the combined segment time might be faster than the sum of the individual best segments. This will point out all such occurrences and allow you to delete them individually if any of them seem wrong."; + case Label.ComparisonsMenu: return "Comparisons…"; + case Label.AddComparison: return "Add Comparison"; + case Label.AddComparisonDescription: return "Adds a new custom comparison where you can store any times that you would like."; + case Label.ImportComparison: return "Import Comparison"; + case Label.ImportComparisonDescription: return "Imports the Personal Best of a splits file you provide as a comparison."; + case Label.GenerateGoalComparison: return "Generate Goal Comparison"; + case Label.GenerateGoalComparisonDescription: return "Generates a custom goal comparison based on a goal time that you can specify. The comparison's times are automatically balanced based on the segment history such that it roughly represents what the split times for the goal time would look like. Since it is populated by the segment history, the goal times are capped to a range between the sum of the best segments and the sum of the worst segments. The comparison is only populated for the selected timing method. The other timing method's comparison times are not modified by this, so you can generate it again with the other timing method to generate the comparison times for both timing methods."; + case Label.CopyComparison: return "Copy Comparison"; + case Label.CopyComparisonDescription: return "Copies any existing comparison, including the Personal Best or even any other automatically provided comparison as a new custom comparison. You could for example use this to keep the Latest Run around as a comparison that exists for as long as you want it to."; + case Label.SetSegmentIcon: return "Set Icon"; + case Label.SetSegmentIconDescription: return "Allows you to choose an image file to set as the segment's icon. Certain file formats may not work everywhere."; + case Label.RemoveSegmentIcon: return "Remove Icon"; + case Label.RemoveSegmentIconDescription: return "Removes the segment's icon."; + case Label.Rename: return "Rename"; + case Label.RenameDescription: return "Choose a new name for the custom comparison. There are reserved names that can't be used. You also can't have duplicate names."; + case Label.CopyAction: return "Copy"; + case Label.CopyDescription: return "Creates a copy of the custom comparison."; + case Label.ACopy: return "Copy"; + case Label.Remove: return "Remove"; + case Label.RemoveDescription: return "Removes the custom comparison."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Specify the name of the comparison you want to add:"; + case Label.ComparisonAddError: return "The comparison could not be added. It may be a duplicate or a reserved name."; + case Label.ImportComparisonPrompt: return "Specify the name of the comparison you want to import:"; + case Label.GenerateGoalComparisonPrompt: return "Specify the time you want to achieve:"; + case Label.Generate: return "Generate"; + case Label.GenerateGoalComparisonError: return "Failed generating the goal comparison. Make sure to specify a valid time."; + case Label.CopyComparisonPrompt: return "Specify the name of the comparison you want to copy:"; + case Label.CopyComparisonError: return "Failed copying the comparison. The comparison may not exist."; + case Label.NothingToCleanUp: return "There is nothing to clean up."; + case Label.CleanPrompt: return "Clean?"; + case Label.AssociateRunPrompt: return "Specify the speedrun.com ID or URL of the run:"; + case Label.Associate: return "Associate"; + case Label.InvalidSpeedrunUrl: return "Invalid speedrun.com ID or URL."; + case Label.AssociateRunError: return "Couldn't associate the run. The ID may be invalid."; + case Label.AddVariablePrompt: return "Specify the name of the custom variable you want to add:"; + case Label.RenameComparison: return "Rename Comparison"; + case Label.RenameComparisonPrompt: return "Specify the new name of the comparison:"; + case Label.ComparisonRenameError: return "The comparison could not be renamed. It may be a duplicate or a reserved name."; + case Label.GameNotFound: return "Couldn't find the game."; + case Label.NoBoxArt: return "The game doesn't have a box art."; + case Label.DownloadBoxArtError: return "Couldn't download the box art."; + case Label.NoGameIcon: return "The game doesn't have an icon."; + case Label.DownloadIconError: return "Couldn't download the icon."; + case Label.Rank: return "Rank"; + case Label.Player: return "Player"; + case Label.Time: return "Time"; + case Label.Date: return "Date:"; + case Label.Emulator: return "Emulator"; + case Label.EmulatorTag: return "Emulator"; + case Label.ObsoleteRuns: return "Obsolete Runs"; + case Label.Shown: return "Shown"; + case Label.Hidden: return "Hidden"; + case Label.OpenLeaderboard: return "Open Leaderboard"; + case Label.Filters: return "Filters"; + case Label.LayoutEditor: return "Layout Editor"; + case Label.Component: return "Component"; + case Label.AddComponent: return "Add Component"; + case Label.RemoveComponent: return "Remove Component"; + case Label.DuplicateComponent: return "Duplicate Component"; + case Label.MoveComponentUp: return "Move Component Up"; + case Label.MoveComponentDown: return "Move Component Down"; + case Label.ComponentTitle: return "Title"; + case Label.ComponentTitleDescription: return "Shows the name of the game and the category that is being run. Additionally, the game icon, the attempt count, and the total number of successfully finished runs can be shown."; + case Label.ComponentGraph: return "Graph"; + case Label.ComponentGraphDescription: return "Visualizes how far the current run has been ahead or behind the chosen comparison throughout the whole run. All the individual deltas are shown as points on the graph."; + case Label.ComponentSplitsDescription: return "The main component for visualizing all the split times. Each segment is shown in a tabular fashion showing the segment icon, segment name, the delta compared to the chosen comparison, and the split time. The list provides scrolling functionality, so not every segment needs to be shown all the time."; + case Label.ComponentDetailedTimer: return "Detailed Timer"; + case Label.ComponentDetailedTimerDescription: return "Shows two timers, one for the total time of the current run and one showing the time of just the current segment. Other information, like segment times of up to two comparisons, the segment icon, and the segment name, can also be shown."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Shows the total time of the current run as a digital clock. The color of the time shown is based on how well the current run is doing compared to the chosen comparison."; + case Label.ComponentCurrentComparison: return "Current Comparison"; + case Label.ComponentCurrentComparisonDescription: return "Shows the name of the comparison that the timer is currently comparing against."; + case Label.ComponentCurrentPace: return "Current Pace"; + case Label.ComponentCurrentPaceDescription: return "Shows a prediction for the current run's final time. The remainder of the run is predicted based on the chosen comparison for the component. For example, the “Best Segments” comparison can be chosen to show the best possible final time for the current run based on the Sum of Best Segments."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Shows how far ahead or behind the current run is compared to the chosen comparison."; + case Label.ComponentPbChance: return "PB Chance"; + case Label.ComponentPbChanceDescription: return "Shows how likely it is for the active run to beat the personal best. If there is no active run, it shows the general chance of beating the personal best. During a run, it actively changes based on how well the run is going."; + case Label.ComponentPossibleTimeSave: return "Possible Time Save"; + case Label.ComponentPossibleTimeSaveDescription: return "Shows how much time you can save on the current segment compared to the chosen comparison, based on the best segment time of the segment. This component also allows showing the “Total Possible Time Save” for the remainder of the current run."; + case Label.ComponentPreviousSegment: return "Previous Segment"; + case Label.ComponentPreviousSegmentDescription: return "Shows how much time was saved or lost during the previous segment based on the chosen comparison. Additionally, the potential time save for the previous segment can be displayed. This component switches to a “Live Segment” view that shows the active time loss whenever you are losing time on the current segment."; + case Label.ComponentSegmentTime: return "Segment Time"; + case Label.ComponentSegmentTimeDescription: return "Shows the time for the current segment for the chosen comparison. If no comparison is specified it uses the timer's current comparison."; + case Label.ComponentSumOfBest: return "Sum of Best"; + case Label.ComponentSumOfBestDescription: return "Shows the fastest possible time to complete a run of the current category, based on information collected from all the previous runs. This often matches up with the sum of the best segment times of all the segments, but that may not always be the case, as skipped segments may introduce combined segments that may be faster than the actual sum of their best segment times. The name is therefore a bit misleading, but sticks around for historical reasons."; + case Label.ComponentText: return "Text"; + case Label.ComponentTextDescription: return "Shows the text that you specify. This can either be a single centered text, or split up into a left and right text, which is suitable for a situation where you have a label and a value. There is also the option of showing a custom variable that you specify in the splits editor."; + case Label.ComponentTotalPlaytime: return "Total Playtime"; + case Label.ComponentTotalPlaytimeDescription: return "Shows the total amount of time that the current category has been played for."; + case Label.ComponentVariableDescription: return "Creates a text component that shows the value of the custom variable “{name}”."; + case Label.ComponentBlankSpace: return "Blank Space"; + case Label.ComponentBlankSpaceDescription: return "An empty component that doesn't show anything other than a background. It mostly serves as padding between other components."; + case Label.ComponentSeparator: return "Separator"; + case Label.ComponentSeparatorDescription: return "A simple component that just renders a separator between components."; + case Label.AccuracySeconds: return "Seconds"; + case Label.AccuracyTenths: return "Tenths"; + case Label.AccuracyHundredths: return "Hundredths"; + case Label.AccuracyMilliseconds: return "Milliseconds"; + case Label.FontStyle: return "Style"; + case Label.FontWeight: return "Weight"; + case Label.FontStretch: return "Stretch"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Italic"; + case Label.AlignmentAutomatic: return "Automatic"; + case Label.AlignmentLeft: return "Left"; + case Label.AlignmentCenter: return "Center"; + case Label.GradientTransparent: return "Transparent"; + case Label.GradientPlain: return "Plain"; + case Label.GradientVertical: return "Vertical"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Alternating"; + case Label.GradientPlainDelta: return "Plain Delta"; + case Label.GradientVerticalDelta: return "Vertical Delta"; + case Label.GradientHorizontalDelta: return "Horizontal Delta"; + case Label.LayoutBackgroundImage: return "Image"; + case Label.LayoutBackgroundBrightness: return "Brightness"; + case Label.LayoutBackgroundOpacity: return "Opacity"; + case Label.LayoutBackgroundBlur: return "Blur"; + case Label.LayoutDirectionVertical: return "Vertical"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Time"; + case Label.ColumnKindVariable: return "Variable"; + case Label.ColumnStartWithEmpty: return "Empty"; + case Label.ColumnStartWithComparisonTime: return "Comparison Time"; + case Label.ColumnStartWithComparisonSegmentTime: return "Comparison Segment Time"; + case Label.ColumnStartWithPossibleTimeSave: return "Possible Time Save"; + case Label.ColumnUpdateWithDontUpdate: return "Don't Update"; + case Label.ColumnUpdateWithSplitTime: return "Split Time"; + case Label.ColumnUpdateWithDelta: return "Time Ahead / Behind"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Time Ahead / Behind or Split Time If Empty"; + case Label.ColumnUpdateWithSegmentTime: return "Segment Time"; + case Label.ColumnUpdateWithSegmentDelta: return "Time Saved / Lost"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Time Saved / Lost or Segment Time If Empty"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "On Starting Segment"; + case Label.ColumnUpdateTriggerContextual: return "Contextual"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "On Ending Segment"; + case Label.ComparisonCurrentComparison: return "Current Comparison"; + case Label.CustomVariableNoneAvailable: return "No variables available"; + case Label.CustomVariableNoneAvailableTooltip: return "Custom variables can be defined in the Variables tab when editing splits. Additional custom variables can be provided automatically by auto splitters."; + case Label.HotkeyButtonTooltip: return "Click to record a hotkey. You may also use buttons on a gamepad. Global hotkeys are currently not possible. Gamepad buttons work globally."; + case Label.ServerConnect: return "Connect"; + case Label.ServerDisconnect: return "Disconnect"; + case Label.ServerConnecting: return "Connecting..."; + case Label.ServerDisconnecting: return "Disconnecting..."; + case Label.ConnectToServerTitle: return "Connect to Server"; + case Label.ConnectToServerDescription: return "Specify the WebSocket URL:"; + case Label.Connect: return "Connect"; + case Label.UpdateAvailable: return "A new version of LiveSplit One is available! Click here to reload."; + case Label.UnsavedChangesBeforeUnload: return "There are unsaved changes. Do you really want to close LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Open Sidebar"; + case Label.FailedToSaveLayout: return "Failed to save the layout."; + case Label.FailedToSaveHotkeys: return "Failed to save the hotkey settings."; + case Label.FailedToSaveGeneralSettings: return "Failed to save the general settings."; + case Label.FailedToSaveSplits: return "Failed to save the splits."; + case Label.LayoutCouldNotBeLoaded: return "The layout could not be loaded. This may not be a valid LiveSplit or LiveSplit One Layout."; + case Label.EmptySplitsNotSupported: return "Empty Splits are not supported."; + case Label.BugEncountered: return "You encountered a bug:"; + case Label.PleaseReportIssueStart: return "Please report this issue "; + case Label.ReportHere: return "here"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "In order to help us fix this issue, please include steps to reproduce it and attach the splits and layout you were using when the issue occurred."; + case Label.LoadFailedPrivateBrowsing: return "Couldn't load LiveSplit One.\nYou may be in private browsing mode.\nLiveSplit One cannot store any splits, layouts, or other settings because of the limitations of the browser's private browsing mode.\nThese limitations may be lifted in the future.\nTo run LiveSplit One for now, please disable private browsing in your settings."; + case Label.LoadFailedOutdatedBrowser: return "Couldn't load LiveSplit One.\nYou may be using a browser that is not up to date.\nPlease update your browser or your iOS version and try again.\nAnother reason might be that a browser extension, such as an adblocker, is blocking access to important scripts."; + } +} diff --git a/src/localization/french.ts b/src/localization/french.ts new file mode 100644 index 000000000..bcca87c6f --- /dev/null +++ b/src/localization/french.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveFrench(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Annuler"; + case Label.Settings: return "Paramètres"; + case Label.Language: return "Langue"; + case Label.LanguageDescription: return "Définit la langue utilisée dans l'application."; + case Label.LanguageAuto: return "Automatique"; + case Label.HotkeysHeading: return "Raccourcis"; + case Label.GeneralHeading: return "Général"; + case Label.NetworkHeading: return "Réseau"; + case Label.FrameRate: return "Fréquence d’images"; + case Label.FrameRateDescription: return "Détermine la fréquence d’images à laquelle afficher le minuteur. « Adapté à la batterie » tente de déterminer le type d’appareil et l’état de charge pour choisir une bonne fréquence d’images. « Adapter à l’écran » fait correspondre le minuteur au taux de rafraîchissement de l’écran."; + case Label.FrameRateBatteryAware: return "Adapté à la batterie"; + case Label.FrameRateMatchScreen: return "Adapter à l’écran"; + case Label.SaveOnReset: return "Enregistrer lors de la réinitialisation"; + case Label.SaveOnResetDescription: return "Détermine s’il faut enregistrer automatiquement les splits lors de la réinitialisation du minuteur."; + case Label.ShowControlButtons: return "Afficher les boutons de contrôle"; + case Label.ShowControlButtonsDescription: return "Détermine s’il faut afficher des boutons sous le minuteur pour le contrôler. Lorsqu’ils sont désactivés, vous devez utiliser les raccourcis."; + case Label.ShowManualGameTimeInput: return "Afficher la saisie manuelle du temps de jeu"; + case Label.ShowManualGameTimeInputDescription: return "Affiche une zone de texte sous le minuteur qui vous permet de saisir manuellement le temps de jeu. Vous démarrez le minuteur et faites des splits en appuyant sur la touche Entrée dans la zone de texte. Assurez‑vous de comparer avec « Game Time »."; + case Label.ManualGameTimeMode: return "Mode de temps de jeu manuel"; + case Label.ManualGameTimeModeDescription: return "Détermine si le temps de jeu manuel est saisi en temps de segment ou en temps de split."; + case Label.ManualGameTimeModeSegmentTimes: return "Temps de segment"; + case Label.ManualGameTimeModeSplitTimes: return "Temps de split"; + case Label.AlwaysOnTop: return "Toujours au premier plan"; + case Label.AlwaysOnTopDescription: return "Garde la fenêtre au‑dessus des autres fenêtres."; + case Label.SpeedrunComIntegration: return "Intégration Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Interroge la liste des jeux, catégories et classements depuis speedrun.com."; + case Label.ServerConnection: return "Connexion au serveur"; + case Label.ServerConnectionDescription: return "Permet de se connecter à un serveur WebSocket qui peut contrôler le minuteur en envoyant diverses commandes. Les commandes sont actuellement un sous‑ensemble de celles que le LiveSplit original prend en charge."; + case Label.ServerConnectionExperimental: return "Cette fonctionnalité est expérimentale et le protocole changera probablement à l’avenir."; + case Label.HotkeyAlreadyInUse: return "Le raccourci est déjà utilisé."; + case Label.Start: return "Démarrer"; + case Label.Resume: return "Reprendre"; + case Label.Pause: return "Pause"; + case Label.UndoSplit: return "Annuler le split"; + case Label.Reset: return "Réinitialiser"; + case Label.SkipSplit: return "Ignorer le split"; + case Label.ManualGameTimePlaceholder: return "Temps de jeu manuel"; + case Label.LiveSplitLogoAlt: return "Logo LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Disposition"; + case Label.CompareAgainst: return "Comparer à"; + case Label.RealTime: return "Temps réel"; + case Label.GameTime: return "Temps de jeu"; + case Label.PopOut: return "Fenêtre détachée"; + case Label.About: return "À propos"; + case Label.Back: return "Retour"; + case Label.AboutVersionPrefix: return "Version :"; + case Label.AboutDescription: return "LiveSplit One est une version multiplateforme de LiveSplit, le minuteur élégant et hautement personnalisable pour les speedrunners."; + case Label.AboutViewSource: return "Voir le code source sur GitHub"; + case Label.AboutRecentChanges: return "Changements récents"; + case Label.AboutContributors: return "Contributeurs"; + case Label.Loading: return "Chargement..."; + case Label.Add: return "Ajouter"; + case Label.Import: return "Importer"; + case Label.OpenSplits: return "Ouvrir les splits"; + case Label.EditSplits: return "Modifier les splits"; + case Label.ExportSplits: return "Exporter les splits"; + case Label.CopySplits: return "Copier les splits"; + case Label.RemoveSplits: return "Supprimer les splits"; + case Label.Untitled: return "Sans titre"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Ignorer les modifications ?"; + case Label.DiscardChangesDescription: return "Vos splits actuels ont des modifications non enregistrées. Voulez-vous continuer et ignorer ces modifications ?"; + case Label.DeleteSplitsTitle: return "Supprimer les splits ?"; + case Label.DeleteSplitsDescription: return "Voulez-vous vraiment supprimer les splits ? Cette opération est irréversible."; + case Label.SaveBestTimesTitle: return "Enregistrer les meilleurs temps ?"; + case Label.SaveBestTimesDescription: return "Vous avez battu certains de vos meilleurs temps. Voulez-vous les mettre à jour ?"; + case Label.Yes: return "Oui"; + case Label.No: return "Non"; + case Label.DontReset: return "Ne pas réinitialiser"; + case Label.FailedToExportSplits: return "Échec de l’exportation des splits."; + case Label.CantImportEmptySplits: return "Impossible d’importer des splits vides."; + case Label.FailedToReadFile: return "Échec de la lecture du fichier :"; + case Label.FailedToImportSplits: return "Échec de l’importation des splits :"; + case Label.CouldNotParseSplits: return "Impossible d’analyser les splits."; + case Label.LoadedSplitsInvalid: return "Les splits chargés ne sont pas valides."; + case Label.NewSegmentName: return "Temps"; + case Label.EditWhileRunningError: return "Vous ne pouvez pas modifier vos splits pendant que le minuteur fonctionne."; + case Label.Edit: return "Modifier"; + case Label.Save: return "Enregistrer"; + case Label.Export: return "Exporter"; + case Label.FailedToParseTimeSpan: return "Impossible d’analyser TimeSpan"; + case Label.Default: return "Par défaut"; + case Label.Game: return "Jeu"; + case Label.Category: return "Catégorie"; + case Label.StartTimerAt: return "Démarrer le timer à"; + case Label.Attempts: return "Tentatives"; + case Label.SplitsEditor: return "Éditeur de splits"; + case Label.Variables: return "Variables"; + case Label.Rules: return "Règles"; + case Label.Leaderboard: return "Classement"; + case Label.InsertAbove: return "Insérer au‑dessus"; + case Label.InsertBelow: return "Insérer au‑dessous"; + case Label.RemoveSegment: return "Supprimer le segment"; + case Label.MoveUp: return "Monter"; + case Label.MoveDown: return "Descendre"; + case Label.AddVariable: return "Ajouter une variable"; + case Label.OpenPbPage: return "Ouvrir la page PB"; + case Label.AssociateRun: return "Associer une run"; + case Label.Icon: return "Icône"; + case Label.SegmentName: return "Nom du segment"; + case Label.SplitTime: return "Temps du split"; + case Label.SegmentTime: return "Temps du segment"; + case Label.BestSegment: return "Meilleur segment"; + case Label.SpeedrunComVariableTooltip: return "Variable speedrun.com spécifique au jeu."; + case Label.Region: return "Région"; + case Label.RegionDescription: return "La région du jeu joué."; + case Label.Platform: return "Plateforme"; + case Label.PlatformDescription: return "La plateforme sur laquelle le jeu est joué."; + case Label.UsesEmulator: return "Utilise un émulateur"; + case Label.UsesEmulatorDescription: return "Indique si un émulateur est utilisé."; + case Label.CustomVariableTooltip: return "Variable personnalisée que vous avez définie. Peut être affichée avec le composant texte."; + case Label.NoVariables: return "Il n’y a actuellement aucune variable personnalisée pour ce jeu."; + case Label.NoVariablesWithSpeedrunCom: return "Il n’y a actuellement aucune variable speedrun.com ou personnalisée pour ce jeu."; + case Label.TimedWithoutLoads: return "sont chronométrées sans les temps de chargement"; + case Label.TimedWithGameTime: return "sont chronométrées avec le Game Time"; + case Label.RequireVideoProof: return "exigent une preuve vidéo"; + case Label.RunsOfThisGamePrefix: return "Les runs de ce jeu "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "et"; + case Label.SetIcon: return "Définir l’icône"; + case Label.SetIconDescription: return "Choisir une image comme icône du jeu. Certains formats peuvent ne pas être pris en charge partout."; + case Label.DownloadBoxArt: return "Télécharger la jaquette"; + case Label.DownloadBoxArtDescription: return "Tente de télécharger la jaquette depuis speedrun.com pour l’utiliser comme icône du jeu."; + case Label.DownloadIcon: return "Télécharger l’icône"; + case Label.DownloadIconDescription: return "Tente de télécharger l’icône du jeu depuis speedrun.com."; + case Label.RemoveIcon: return "Retirer l’icône"; + case Label.RemoveIconDescription: return "Retire l’icône du jeu."; + case Label.CleaningMenu: return "Nettoyage…"; + case Label.ClearOnlyHistory: return "Effacer uniquement l’historique"; + case Label.ClearOnlyHistoryDescription: return "Les splits stockent tout l’historique des runs, y compris chaque segment. Cette action efface l’historique sans affecter le PB, les meilleurs segments ni les comparaisons."; + case Label.ClearAllTimes: return "Effacer tous les temps"; + case Label.ClearAllTimesDescription: return "Supprime tous les temps et l’historique pour réinitialiser complètement les splits."; + case Label.CleanSumOfBest: return "Nettoyer la somme des meilleurs"; + case Label.CleanSumOfBestDescription: return "Permet de supprimer des anomalies dans l’historique des segments qui rendent la somme des meilleurs segments inexacte."; + case Label.ComparisonsMenu: return "Comparaisons…"; + case Label.AddComparison: return "Ajouter une comparaison"; + case Label.AddComparisonDescription: return "Ajoute une comparaison personnalisée où vous pouvez stocker des temps."; + case Label.ImportComparison: return "Importer une comparaison"; + case Label.ImportComparisonDescription: return "Importe le Personal Best d’un fichier de splits comme comparaison."; + case Label.GenerateGoalComparison: return "Générer une comparaison d’objectif"; + case Label.GenerateGoalComparisonDescription: return "Génère une comparaison d’objectif basée sur un temps cible."; + case Label.CopyComparison: return "Copier la comparaison"; + case Label.CopyComparisonDescription: return "Copie une comparaison existante en nouvelle comparaison personnalisée."; + case Label.SetSegmentIcon: return "Définir l’icône"; + case Label.SetSegmentIconDescription: return "Choisir une image comme icône du segment. Certains formats peuvent ne pas fonctionner partout."; + case Label.RemoveSegmentIcon: return "Retirer l’icône"; + case Label.RemoveSegmentIconDescription: return "Retire l’icône du segment."; + case Label.Rename: return "Renommer"; + case Label.RenameDescription: return "Choisissez un nouveau nom pour la comparaison personnalisée. Les noms réservés ou en double ne sont pas autorisés."; + case Label.CopyAction: return "Copier"; + case Label.CopyDescription: return "Crée une copie de la comparaison personnalisée."; + case Label.ACopy: return "Copie"; + case Label.Remove: return "Supprimer"; + case Label.RemoveDescription: return "Supprime la comparaison personnalisée."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Indiquez le nom de la comparaison à ajouter :"; + case Label.ComparisonAddError: return "La comparaison n’a pas pu être ajoutée. Elle est peut‑être en double ou réservée."; + case Label.ImportComparisonPrompt: return "Indiquez le nom de la comparaison à importer :"; + case Label.GenerateGoalComparisonPrompt: return "Indiquez le temps à atteindre :"; + case Label.Generate: return "Générer"; + case Label.GenerateGoalComparisonError: return "Échec de génération de la comparaison d’objectif. Vérifiez que le temps est valide."; + case Label.CopyComparisonPrompt: return "Indiquez le nom de la comparaison à copier :"; + case Label.CopyComparisonError: return "Échec de copie de la comparaison. Elle n’existe peut‑être pas."; + case Label.NothingToCleanUp: return "Il n’y a rien à nettoyer."; + case Label.CleanPrompt: return "Nettoyer ?"; + case Label.AssociateRunPrompt: return "Indiquez l’ID ou l’URL speedrun.com de la run :"; + case Label.Associate: return "Associer"; + case Label.InvalidSpeedrunUrl: return "ID ou URL speedrun.com invalide."; + case Label.AssociateRunError: return "Impossible d’associer la run. L’ID est peut‑être invalide."; + case Label.AddVariablePrompt: return "Indiquez le nom de la variable personnalisée à ajouter :"; + case Label.RenameComparison: return "Renommer la comparaison"; + case Label.RenameComparisonPrompt: return "Indiquez le nouveau nom de la comparaison :"; + case Label.ComparisonRenameError: return "La comparaison n’a pas pu être renommée. Elle est peut‑être en double ou réservée."; + case Label.GameNotFound: return "Jeu introuvable."; + case Label.NoBoxArt: return "Le jeu n’a pas de jaquette."; + case Label.DownloadBoxArtError: return "Impossible de télécharger la jaquette."; + case Label.NoGameIcon: return "Le jeu n’a pas d’icône."; + case Label.DownloadIconError: return "Impossible de télécharger l’icône."; + case Label.Rank: return "Rang"; + case Label.Player: return "Joueur"; + case Label.Time: return "Temps"; + case Label.Date: return "Date :"; + case Label.Emulator: return "Émulateur"; + case Label.EmulatorTag: return "Émulateur"; + case Label.ObsoleteRuns: return "Runs obsolètes"; + case Label.Shown: return "Affichées"; + case Label.Hidden: return "Masquées"; + case Label.OpenLeaderboard: return "Ouvrir le classement"; + case Label.Filters: return "Filtres"; + case Label.LayoutEditor: return "Éditeur de layout"; + case Label.Component: return "Composant"; + case Label.AddComponent: return "Ajouter un composant"; + case Label.RemoveComponent: return "Supprimer le composant"; + case Label.DuplicateComponent: return "Dupliquer le composant"; + case Label.MoveComponentUp: return "Monter le composant"; + case Label.MoveComponentDown: return "Descendre le composant"; + case Label.ComponentTitle: return "Titre"; + case Label.ComponentTitleDescription: return "Affiche le nom du jeu et la catégorie, ainsi que l’icône, les tentatives et les runs terminées."; + case Label.ComponentGraph: return "Graphique"; + case Label.ComponentGraphDescription: return "Visualise l’avance/le retard sur toute la run par rapport à la comparaison."; + case Label.ComponentSplitsDescription: return "Composant principal des splits avec icône, nom, delta et temps, défilable."; + case Label.ComponentDetailedTimer: return "Timer détaillé"; + case Label.ComponentDetailedTimerDescription: return "Affiche le temps total et celui du segment, plus des infos optionnelles."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Affiche le temps total en horloge numérique, couleur selon la comparaison."; + case Label.ComponentCurrentComparison: return "Comparaison actuelle"; + case Label.ComponentCurrentComparisonDescription: return "Affiche le nom de la comparaison en cours."; + case Label.ComponentCurrentPace: return "Rythme actuel"; + case Label.ComponentCurrentPaceDescription: return "Prédit le temps final en fonction de la comparaison choisie."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Affiche l’avance/le retard par rapport à la comparaison."; + case Label.ComponentPbChance: return "Chance de PB"; + case Label.ComponentPbChanceDescription: return "Affiche la probabilité de battre le PB, évolutive pendant la run."; + case Label.ComponentPossibleTimeSave: return "Gain de temps possible"; + case Label.ComponentPossibleTimeSaveDescription: return "Affiche le temps gagnable sur le segment et le total possible."; + case Label.ComponentPreviousSegment: return "Segment précédent"; + case Label.ComponentPreviousSegmentDescription: return "Affiche gain/perte sur le segment précédent et le gain potentiel."; + case Label.ComponentSegmentTime: return "Temps du segment"; + case Label.ComponentSegmentTimeDescription: return "Affiche le temps du segment pour la comparaison choisie."; + case Label.ComponentSumOfBest: return "Somme des meilleurs"; + case Label.ComponentSumOfBestDescription: return "Affiche le temps minimal possible basé sur l’historique."; + case Label.ComponentText: return "Texte"; + case Label.ComponentTextDescription: return "Affiche un texte centré ou gauche/droite, ou une variable personnalisée."; + case Label.ComponentTotalPlaytime: return "Temps de jeu total"; + case Label.ComponentTotalPlaytimeDescription: return "Affiche le temps total joué pour la catégorie."; + case Label.ComponentVariableDescription: return "Crée un composant texte qui affiche la valeur de la variable « {name} »."; + case Label.ComponentBlankSpace: return "Espace vide"; + case Label.ComponentBlankSpaceDescription: return "Composant vide servant d’espacement."; + case Label.ComponentSeparator: return "Séparateur"; + case Label.ComponentSeparatorDescription: return "Affiche un séparateur entre les composants."; + case Label.AccuracySeconds: return "Secondes"; + case Label.AccuracyTenths: return "Dixièmes"; + case Label.AccuracyHundredths: return "Centièmes"; + case Label.AccuracyMilliseconds: return "Millisecondes"; + case Label.FontStyle: return "Style"; + case Label.FontWeight: return "Graisse"; + case Label.FontStretch: return "Étirement"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Italique"; + case Label.AlignmentAutomatic: return "Automatique"; + case Label.AlignmentLeft: return "Gauche"; + case Label.AlignmentCenter: return "Centre"; + case Label.GradientTransparent: return "Transparent"; + case Label.GradientPlain: return "Uni"; + case Label.GradientVertical: return "Vertical"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Alterné"; + case Label.GradientPlainDelta: return "Delta uni"; + case Label.GradientVerticalDelta: return "Delta vertical"; + case Label.GradientHorizontalDelta: return "Delta horizontal"; + case Label.LayoutBackgroundImage: return "Image"; + case Label.LayoutBackgroundBrightness: return "Luminosité"; + case Label.LayoutBackgroundOpacity: return "Opacité"; + case Label.LayoutBackgroundBlur: return "Flou"; + case Label.LayoutDirectionVertical: return "Vertical"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Temps"; + case Label.ColumnKindVariable: return "Variable"; + case Label.ColumnStartWithEmpty: return "Vide"; + case Label.ColumnStartWithComparisonTime: return "Temps de comparaison"; + case Label.ColumnStartWithComparisonSegmentTime: return "Temps du segment de comparaison"; + case Label.ColumnStartWithPossibleTimeSave: return "Gain de temps possible"; + case Label.ColumnUpdateWithDontUpdate: return "Ne pas mettre à jour"; + case Label.ColumnUpdateWithSplitTime: return "Temps du split"; + case Label.ColumnUpdateWithDelta: return "Avance / retard"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Avance / retard ou temps du split si vide"; + case Label.ColumnUpdateWithSegmentTime: return "Temps du segment"; + case Label.ColumnUpdateWithSegmentDelta: return "Temps gagné / perdu"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Temps gagné / perdu ou temps du segment si vide"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Au début du segment"; + case Label.ColumnUpdateTriggerContextual: return "Contextuel"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "À la fin du segment"; + case Label.ComparisonCurrentComparison: return "Comparaison actuelle"; + case Label.CustomVariableNoneAvailable: return "Aucune variable disponible"; + case Label.CustomVariableNoneAvailableTooltip: return "Les variables personnalisées peuvent être définies dans l’onglet Variables lors de l’édition des splits. Des variables personnalisées supplémentaires peuvent être fournies automatiquement par les auto splitters."; + case Label.HotkeyButtonTooltip: return "Cliquez pour enregistrer un raccourci. Vous pouvez aussi utiliser les boutons d’une manette. Les raccourcis globaux ne sont pas possibles pour l’instant. Les boutons de manette fonctionnent globalement."; + case Label.ServerConnect: return "Se connecter"; + case Label.ServerDisconnect: return "Se déconnecter"; + case Label.ServerConnecting: return "Connexion..."; + case Label.ServerDisconnecting: return "Déconnexion..."; + case Label.ConnectToServerTitle: return "Se connecter au serveur"; + case Label.ConnectToServerDescription: return "Saisissez l’URL WebSocket :"; + case Label.Connect: return "Se connecter"; + case Label.UpdateAvailable: return "Une nouvelle version de LiveSplit One est disponible ! Cliquez ici pour recharger."; + case Label.UnsavedChangesBeforeUnload: return "Il y a des modifications non enregistrées. Voulez-vous vraiment fermer LiveSplit One ?"; + case Label.OpenSidebarAriaLabel: return "Ouvrir la barre latérale"; + case Label.FailedToSaveLayout: return "Échec de l’enregistrement de la disposition."; + case Label.FailedToSaveHotkeys: return "Échec de l’enregistrement des raccourcis clavier."; + case Label.FailedToSaveGeneralSettings: return "Échec de l’enregistrement des paramètres généraux."; + case Label.FailedToSaveSplits: return "Échec de l’enregistrement des splits."; + case Label.LayoutCouldNotBeLoaded: return "La disposition n’a pas pu être chargée. Il se peut que ce ne soit pas une disposition LiveSplit ou LiveSplit One valide."; + case Label.EmptySplitsNotSupported: return "Les splits vides ne sont pas pris en charge."; + case Label.BugEncountered: return "Vous avez rencontré un bug :"; + case Label.PleaseReportIssueStart: return "Veuillez signaler ce problème "; + case Label.ReportHere: return "ici"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Afin de nous aider à corriger ce problème, veuillez indiquer les étapes pour le reproduire et joindre les splits et la disposition que vous utilisiez lorsque le problème est survenu."; + case Label.LoadFailedPrivateBrowsing: return "Impossible de charger LiveSplit One.\nVous êtes peut‑être en navigation privée.\nLiveSplit One ne peut pas enregistrer les splits, les dispositions ou d’autres paramètres à cause des limitations de la navigation privée.\nCes limitations pourraient être levées à l’avenir.\nPour utiliser LiveSplit One pour l’instant, désactivez la navigation privée dans vos paramètres."; + case Label.LoadFailedOutdatedBrowser: return "Impossible de charger LiveSplit One.\nVotre navigateur n’est peut‑être pas à jour.\nMettez à jour votre navigateur ou votre version d’iOS et réessayez.\nUne autre raison possible est qu’une extension de navigateur, comme un bloqueur de publicité, bloque l’accès à des scripts importants."; + } +} diff --git a/src/localization/german.ts b/src/localization/german.ts new file mode 100644 index 000000000..2b748210d --- /dev/null +++ b/src/localization/german.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveGerman(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Abbrechen"; + case Label.Settings: return "Einstellungen"; + case Label.Language: return "Sprache"; + case Label.LanguageDescription: return "Legt die in der Anwendung verwendete Sprache fest."; + case Label.LanguageAuto: return "Automatisch"; + case Label.HotkeysHeading: return "Tastenkürzel"; + case Label.GeneralHeading: return "Allgemein"; + case Label.NetworkHeading: return "Netzwerk"; + case Label.FrameRate: return "Bildwiederholrate"; + case Label.FrameRateDescription: return "Legt fest, mit welcher Bildwiederholrate der Timer angezeigt wird. „Batteriebewusst“ versucht anhand des Gerätetyps und des Ladestatus eine gute Bildwiederholrate zu wählen. „An Bildschirm anpassen“ lässt den Timer der Bildwiederholrate des Bildschirms entsprechen."; + case Label.FrameRateBatteryAware: return "Batteriebewusst"; + case Label.FrameRateMatchScreen: return "An Bildschirm anpassen"; + case Label.SaveOnReset: return "Beim Zurücksetzen speichern"; + case Label.SaveOnResetDescription: return "Legt fest, ob die Splits beim Zurücksetzen des Timers automatisch gespeichert werden."; + case Label.ShowControlButtons: return "Steuerungsbuttons anzeigen"; + case Label.ShowControlButtonsDescription: return "Legt fest, ob unter dem Timer Schaltflächen angezeigt werden, mit denen er gesteuert werden kann. Wenn deaktiviert, müssen die Hotkeys verwendet werden."; + case Label.ShowManualGameTimeInput: return "Manuelle Spielzeit‑Eingabe anzeigen"; + case Label.ShowManualGameTimeInputDescription: return "Zeigt ein Textfeld unter dem Timer an, mit dem du die Spielzeit manuell eingeben kannst. Du startest den Timer und machst Splits, indem du im Textfeld die Eingabetaste drückst. Vergleiche mit „Spielzeit“."; + case Label.ManualGameTimeMode: return "Manueller Spielzeitmodus"; + case Label.ManualGameTimeModeDescription: return "Legt fest, ob die manuelle Spielzeit als Segmentzeiten oder Splitzeiten eingegeben wird."; + case Label.ManualGameTimeModeSegmentTimes: return "Segmentzeiten"; + case Label.ManualGameTimeModeSplitTimes: return "Splitzeiten"; + case Label.AlwaysOnTop: return "Immer im Vordergrund"; + case Label.AlwaysOnTopDescription: return "Hält das Fenster immer über anderen Fenstern."; + case Label.SpeedrunComIntegration: return "Speedrun.com‑Integration"; + case Label.SpeedrunComIntegrationDescription: return "Fragt die Liste der Spiele, Kategorien und Bestenlisten von speedrun.com ab."; + case Label.ServerConnection: return "Serververbindung"; + case Label.ServerConnectionDescription: return "Ermöglicht die Verbindung zu einem WebSocket‑Server, der den Timer durch das Senden verschiedener Befehle steuern kann. Die Befehle sind derzeit eine Teilmenge der Befehle, die das ursprüngliche LiveSplit unterstützt."; + case Label.ServerConnectionExperimental: return "Diese Funktion ist experimentell und das Protokoll wird sich wahrscheinlich in Zukunft ändern."; + case Label.HotkeyAlreadyInUse: return "Der Hotkey wird bereits verwendet."; + case Label.Start: return "Start"; + case Label.Resume: return "Fortsetzen"; + case Label.Pause: return "Pause"; + case Label.UndoSplit: return "Split rückgängig"; + case Label.Reset: return "Zurücksetzen"; + case Label.SkipSplit: return "Split überspringen"; + case Label.ManualGameTimePlaceholder: return "Manuelle Spielzeit"; + case Label.LiveSplitLogoAlt: return "LiveSplit‑Logo"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Layout"; + case Label.CompareAgainst: return "Vergleichen mit"; + case Label.RealTime: return "Echtzeit"; + case Label.GameTime: return "Spielzeit"; + case Label.PopOut: return "Pop‑out"; + case Label.About: return "Über"; + case Label.Back: return "Zurück"; + case Label.AboutVersionPrefix: return "Version:"; + case Label.AboutDescription: return "LiveSplit One ist eine plattformübergreifende Version von LiveSplit, dem schlanken und hochgradig anpassbaren Timer für Speedrunner."; + case Label.AboutViewSource: return "Quellcode auf GitHub ansehen"; + case Label.AboutRecentChanges: return "Neueste Änderungen"; + case Label.AboutContributors: return "Mitwirkende"; + case Label.Loading: return "Wird geladen..."; + case Label.Add: return "Hinzufügen"; + case Label.Import: return "Importieren"; + case Label.OpenSplits: return "Splits öffnen"; + case Label.EditSplits: return "Splits bearbeiten"; + case Label.ExportSplits: return "Splits exportieren"; + case Label.CopySplits: return "Splits kopieren"; + case Label.RemoveSplits: return "Splits entfernen"; + case Label.Untitled: return "Unbenannt"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Änderungen verwerfen?"; + case Label.DiscardChangesDescription: return "Deine aktuellen Splits wurden geändert und enthalten nicht gespeicherte Änderungen. Möchtest du fortfahren und diese Änderungen verwerfen?"; + case Label.DeleteSplitsTitle: return "Splits löschen?"; + case Label.DeleteSplitsDescription: return "Möchtest du die Splits wirklich löschen? Dieser Vorgang kann nicht rückgängig gemacht werden."; + case Label.SaveBestTimesTitle: return "Bestzeiten speichern?"; + case Label.SaveBestTimesDescription: return "Du hast einige deiner Bestzeiten unterboten. Möchtest du sie aktualisieren?"; + case Label.Yes: return "Ja"; + case Label.No: return "Nein"; + case Label.DontReset: return "Nicht zurücksetzen"; + case Label.FailedToExportSplits: return "Splits konnten nicht exportiert werden."; + case Label.CantImportEmptySplits: return "Leere Splits können nicht importiert werden."; + case Label.FailedToReadFile: return "Datei konnte nicht gelesen werden:"; + case Label.FailedToImportSplits: return "Splits konnten nicht importiert werden:"; + case Label.CouldNotParseSplits: return "Splits konnten nicht geparst werden."; + case Label.LoadedSplitsInvalid: return "Die geladenen Splits sind ungültig."; + case Label.NewSegmentName: return "Zeit"; + case Label.EditWhileRunningError: return "Du kannst deine Splits nicht bearbeiten, während der Timer läuft."; + case Label.Edit: return "Bearbeiten"; + case Label.Save: return "Speichern"; + case Label.Export: return "Exportieren"; + case Label.FailedToParseTimeSpan: return "TimeSpan konnte nicht geparst werden"; + case Label.Default: return "Standard"; + case Label.Game: return "Spiel"; + case Label.Category: return "Kategorie"; + case Label.StartTimerAt: return "Timer starten bei"; + case Label.Attempts: return "Versuche"; + case Label.SplitsEditor: return "Splits‑Editor"; + case Label.Variables: return "Variablen"; + case Label.Rules: return "Regeln"; + case Label.Leaderboard: return "Rangliste"; + case Label.InsertAbove: return "Darüber einfügen"; + case Label.InsertBelow: return "Darunter einfügen"; + case Label.RemoveSegment: return "Segment entfernen"; + case Label.MoveUp: return "Nach oben"; + case Label.MoveDown: return "Nach unten"; + case Label.AddVariable: return "Variable hinzufügen"; + case Label.OpenPbPage: return "PB‑Seite öffnen"; + case Label.AssociateRun: return "Run verknüpfen"; + case Label.Icon: return "Symbol"; + case Label.SegmentName: return "Segmentname"; + case Label.SplitTime: return "Splitzeit"; + case Label.SegmentTime: return "Segmentzeit"; + case Label.BestSegment: return "Bestes Segment"; + case Label.SpeedrunComVariableTooltip: return "Eine speedrun.com‑Variable, die zum Spiel gehört."; + case Label.Region: return "Region"; + case Label.RegionDescription: return "Die Region des gespielten Spiels."; + case Label.Platform: return "Plattform"; + case Label.PlatformDescription: return "Die Plattform, auf der das Spiel gespielt wird."; + case Label.UsesEmulator: return "Emulator verwenden"; + case Label.UsesEmulatorDescription: return "Ob ein Emulator zum Spielen verwendet wird."; + case Label.CustomVariableTooltip: return "Eine von dir definierte Variable. Diese kann im Text‑Komponent angezeigt werden."; + case Label.NoVariables: return "Derzeit gibt es keine benutzerdefinierten Variablen für dieses Spiel."; + case Label.NoVariablesWithSpeedrunCom: return "Derzeit gibt es keine speedrun.com‑Variablen oder benutzerdefinierten Variablen für dieses Spiel."; + case Label.TimedWithoutLoads: return "werden ohne Ladezeiten getimt"; + case Label.TimedWithGameTime: return "werden mit Spielzeit getimt"; + case Label.RequireVideoProof: return "erfordern einen Videobeweis"; + case Label.RunsOfThisGamePrefix: return "Runs dieses Spiels "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "und"; + case Label.SetIcon: return "Symbol festlegen"; + case Label.SetIconDescription: return "Wähle eine Bilddatei als Spielsymbol. Manche Formate funktionieren nicht überall."; + case Label.DownloadBoxArt: return "Cover herunterladen"; + case Label.DownloadBoxArtDescription: return "Versucht, das Cover von speedrun.com herunterzuladen und als Spielsymbol zu setzen."; + case Label.DownloadIcon: return "Symbol herunterladen"; + case Label.DownloadIconDescription: return "Versucht, das Symbol des Spiels von speedrun.com herunterzuladen."; + case Label.RemoveIcon: return "Symbol entfernen"; + case Label.RemoveIconDescription: return "Entfernt das Spielsymbol."; + case Label.CleaningMenu: return "Bereinigen…"; + case Label.ClearOnlyHistory: return "Nur Verlauf löschen"; + case Label.ClearOnlyHistoryDescription: return "Splits speichern den gesamten Verlauf aller Runs. Damit kannst du den Verlauf löschen, ohne PB, beste Segmente oder Vergleiche zu beeinflussen."; + case Label.ClearAllTimes: return "Alle Zeiten löschen"; + case Label.ClearAllTimesDescription: return "Entfernt alle Zeiten inklusive Verlauf, sodass die Splits komplett leer sind."; + case Label.CleanSumOfBest: return "Summe der Besten bereinigen"; + case Label.CleanSumOfBestDescription: return "Ermöglicht das interaktive Entfernen von Problemen in der Segmenthistorie, die eine ungenaue Summe der besten Segmente verursachen."; + case Label.ComparisonsMenu: return "Vergleiche…"; + case Label.AddComparison: return "Vergleich hinzufügen"; + case Label.AddComparisonDescription: return "Fügt einen benutzerdefinierten Vergleich hinzu, in dem du Zeiten speichern kannst."; + case Label.ImportComparison: return "Vergleich importieren"; + case Label.ImportComparisonDescription: return "Importiert die Personal Best aus einer Splits‑Datei als Vergleich."; + case Label.GenerateGoalComparison: return "Zielvergleich erzeugen"; + case Label.GenerateGoalComparisonDescription: return "Erzeugt einen Zielvergleich basierend auf einer Zielzeit."; + case Label.CopyComparison: return "Vergleich kopieren"; + case Label.CopyComparisonDescription: return "Kopiert einen vorhandenen Vergleich als neuen benutzerdefinierten Vergleich."; + case Label.SetSegmentIcon: return "Symbol festlegen"; + case Label.SetSegmentIconDescription: return "Wähle eine Bilddatei als Segmentsymbol. Manche Formate funktionieren nicht überall."; + case Label.RemoveSegmentIcon: return "Symbol entfernen"; + case Label.RemoveSegmentIconDescription: return "Entfernt das Segmentsymbol."; + case Label.Rename: return "Umbenennen"; + case Label.RenameDescription: return "Wähle einen neuen Namen für den benutzerdefinierten Vergleich. Reservierte Namen oder Duplikate sind nicht erlaubt."; + case Label.CopyAction: return "Kopieren"; + case Label.CopyDescription: return "Erstellt eine Kopie des benutzerdefinierten Vergleichs."; + case Label.ACopy: return "Kopie"; + case Label.Remove: return "Entfernen"; + case Label.RemoveDescription: return "Entfernt den benutzerdefinierten Vergleich."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Gib den Namen des Vergleichs an, den du hinzufügen möchtest:"; + case Label.ComparisonAddError: return "Der Vergleich konnte nicht hinzugefügt werden. Möglicherweise Duplikat oder reservierter Name."; + case Label.ImportComparisonPrompt: return "Gib den Namen des Vergleichs an, den du importieren möchtest:"; + case Label.GenerateGoalComparisonPrompt: return "Gib die Zeit an, die du erreichen möchtest:"; + case Label.Generate: return "Erzeugen"; + case Label.GenerateGoalComparisonError: return "Zielvergleich konnte nicht erzeugt werden. Bitte eine gültige Zeit angeben."; + case Label.CopyComparisonPrompt: return "Gib den Namen des Vergleichs an, den du kopieren möchtest:"; + case Label.CopyComparisonError: return "Vergleich konnte nicht kopiert werden. Er existiert möglicherweise nicht."; + case Label.NothingToCleanUp: return "Es gibt nichts zu bereinigen."; + case Label.CleanPrompt: return "Bereinigen?"; + case Label.AssociateRunPrompt: return "Gib die speedrun.com‑ID oder URL des Runs an:"; + case Label.Associate: return "Verknüpfen"; + case Label.InvalidSpeedrunUrl: return "Ungültige speedrun.com‑ID oder URL."; + case Label.AssociateRunError: return "Run konnte nicht verknüpft werden. Die ID ist möglicherweise ungültig."; + case Label.AddVariablePrompt: return "Gib den Namen der benutzerdefinierten Variable an, die du hinzufügen möchtest:"; + case Label.RenameComparison: return "Vergleich umbenennen"; + case Label.RenameComparisonPrompt: return "Gib den neuen Namen des Vergleichs an:"; + case Label.ComparisonRenameError: return "Der Vergleich konnte nicht umbenannt werden. Möglicherweise Duplikat oder reservierter Name."; + case Label.GameNotFound: return "Spiel nicht gefunden."; + case Label.NoBoxArt: return "Das Spiel hat kein Cover."; + case Label.DownloadBoxArtError: return "Cover konnte nicht heruntergeladen werden."; + case Label.NoGameIcon: return "Das Spiel hat kein Symbol."; + case Label.DownloadIconError: return "Symbol konnte nicht heruntergeladen werden."; + case Label.Rank: return "Rang"; + case Label.Player: return "Spieler"; + case Label.Time: return "Zeit"; + case Label.Date: return "Datum:"; + case Label.Emulator: return "Emulator"; + case Label.EmulatorTag: return "Emulator"; + case Label.ObsoleteRuns: return "Veraltete Runs"; + case Label.Shown: return "Angezeigt"; + case Label.Hidden: return "Ausgeblendet"; + case Label.OpenLeaderboard: return "Rangliste öffnen"; + case Label.Filters: return "Filter"; + case Label.LayoutEditor: return "Layout‑Editor"; + case Label.Component: return "Komponente"; + case Label.AddComponent: return "Komponente hinzufügen"; + case Label.RemoveComponent: return "Komponente entfernen"; + case Label.DuplicateComponent: return "Komponente duplizieren"; + case Label.MoveComponentUp: return "Komponente nach oben"; + case Label.MoveComponentDown: return "Komponente nach unten"; + case Label.ComponentTitle: return "Titel"; + case Label.ComponentTitleDescription: return "Zeigt Spielname und Kategorie sowie optional Icon, Versuche und abgeschlossene Runs."; + case Label.ComponentGraph: return "Graph"; + case Label.ComponentGraphDescription: return "Visualisiert den Vorsprung/Rückstand über den ganzen Run."; + case Label.ComponentSplitsDescription: return "Hauptkomponente für Splits mit Icon, Name, Delta und Zeit; scrollbar."; + case Label.ComponentDetailedTimer: return "Detaillierter Timer"; + case Label.ComponentDetailedTimerDescription: return "Zeigt Gesamt‑ und Segmentzeit sowie optionale Infos."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Zeigt Gesamtzeit als digitale Uhr, Farbe je Vergleich."; + case Label.ComponentCurrentComparison: return "Aktueller Vergleich"; + case Label.ComponentCurrentComparisonDescription: return "Zeigt den Namen des aktuellen Vergleichs."; + case Label.ComponentCurrentPace: return "Aktuelles Tempo"; + case Label.ComponentCurrentPaceDescription: return "Prognostiziert die Endzeit basierend auf dem Vergleich."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Zeigt Vorsprung/Rückstand zum Vergleich."; + case Label.ComponentPbChance: return "PB‑Chance"; + case Label.ComponentPbChanceDescription: return "Zeigt die Wahrscheinlichkeit für ein PB, dynamisch während des Runs."; + case Label.ComponentPossibleTimeSave: return "Mögliche Zeitersparnis"; + case Label.ComponentPossibleTimeSaveDescription: return "Zeigt die mögliche Ersparnis im Segment und insgesamt."; + case Label.ComponentPreviousSegment: return "Vorheriges Segment"; + case Label.ComponentPreviousSegmentDescription: return "Zeigt Gewinn/Verlust im vorherigen Segment und mögliche Ersparnis."; + case Label.ComponentSegmentTime: return "Segmentzeit"; + case Label.ComponentSegmentTimeDescription: return "Zeigt die Segmentzeit für den gewählten Vergleich."; + case Label.ComponentSumOfBest: return "Summe der Besten"; + case Label.ComponentSumOfBestDescription: return "Zeigt die schnellstmögliche Zeit basierend auf der Historie."; + case Label.ComponentText: return "Text"; + case Label.ComponentTextDescription: return "Zeigt Text zentriert oder links/rechts, oder eine benutzerdefinierte Variable."; + case Label.ComponentTotalPlaytime: return "Gesamtspielzeit"; + case Label.ComponentTotalPlaytimeDescription: return "Zeigt die gesamte Spielzeit der Kategorie."; + case Label.ComponentVariableDescription: return "Erstellt eine Textkomponente, die den Wert der Variable „{name}“ zeigt."; + case Label.ComponentBlankSpace: return "Leerraum"; + case Label.ComponentBlankSpaceDescription: return "Leere Komponente als Abstand zwischen anderen."; + case Label.ComponentSeparator: return "Trenner"; + case Label.ComponentSeparatorDescription: return "Zeichnet einen Trenner zwischen Komponenten."; + case Label.AccuracySeconds: return "Sekunden"; + case Label.AccuracyTenths: return "Zehntel"; + case Label.AccuracyHundredths: return "Hundertstel"; + case Label.AccuracyMilliseconds: return "Millisekunden"; + case Label.FontStyle: return "Stil"; + case Label.FontWeight: return "Gewicht"; + case Label.FontStretch: return "Streckung"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Kursiv"; + case Label.AlignmentAutomatic: return "Automatisch"; + case Label.AlignmentLeft: return "Links"; + case Label.AlignmentCenter: return "Zentriert"; + case Label.GradientTransparent: return "Transparent"; + case Label.GradientPlain: return "Einfarbig"; + case Label.GradientVertical: return "Vertikal"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Abwechselnd"; + case Label.GradientPlainDelta: return "Einfarbiges Delta"; + case Label.GradientVerticalDelta: return "Vertikales Delta"; + case Label.GradientHorizontalDelta: return "Horizontales Delta"; + case Label.LayoutBackgroundImage: return "Bild"; + case Label.LayoutBackgroundBrightness: return "Helligkeit"; + case Label.LayoutBackgroundOpacity: return "Deckkraft"; + case Label.LayoutBackgroundBlur: return "Weichzeichnung"; + case Label.LayoutDirectionVertical: return "Vertikal"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Zeit"; + case Label.ColumnKindVariable: return "Variable"; + case Label.ColumnStartWithEmpty: return "Leer"; + case Label.ColumnStartWithComparisonTime: return "Vergleichszeit"; + case Label.ColumnStartWithComparisonSegmentTime: return "Vergleichs‑Segmentzeit"; + case Label.ColumnStartWithPossibleTimeSave: return "Mögliche Zeitersparnis"; + case Label.ColumnUpdateWithDontUpdate: return "Nicht aktualisieren"; + case Label.ColumnUpdateWithSplitTime: return "Splitzeit"; + case Label.ColumnUpdateWithDelta: return "Zeit voraus / zurück"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Zeit voraus / zurück oder Splitzeit, falls leer"; + case Label.ColumnUpdateWithSegmentTime: return "Segmentzeit"; + case Label.ColumnUpdateWithSegmentDelta: return "Zeit gewonnen / verloren"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Zeit gewonnen / verloren oder Segmentzeit, falls leer"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Beim Start des Segments"; + case Label.ColumnUpdateTriggerContextual: return "Kontextabhängig"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Beim Ende des Segments"; + case Label.ComparisonCurrentComparison: return "Aktueller Vergleich"; + case Label.CustomVariableNoneAvailable: return "Keine Variablen verfügbar"; + case Label.CustomVariableNoneAvailableTooltip: return "Benutzerdefinierte Variablen können im Tab Variablen beim Bearbeiten der Splits definiert werden. Zusätzliche benutzerdefinierte Variablen können automatisch durch Auto‑Splitter bereitgestellt werden."; + case Label.HotkeyButtonTooltip: return "Klicken, um eine Hotkey‑Taste aufzunehmen. Du kannst auch Gamepad‑Tasten verwenden. Globale Hotkeys sind derzeit nicht möglich. Gamepad‑Tasten funktionieren global."; + case Label.ServerConnect: return "Verbinden"; + case Label.ServerDisconnect: return "Trennen"; + case Label.ServerConnecting: return "Verbinde..."; + case Label.ServerDisconnecting: return "Trenne..."; + case Label.ConnectToServerTitle: return "Mit Server verbinden"; + case Label.ConnectToServerDescription: return "WebSocket‑URL angeben:"; + case Label.Connect: return "Verbinden"; + case Label.UpdateAvailable: return "Eine neue Version von LiveSplit One ist verfügbar! Klicke hier, um neu zu laden."; + case Label.UnsavedChangesBeforeUnload: return "Es gibt ungespeicherte Änderungen. Möchtest du LiveSplit One wirklich schließen?"; + case Label.OpenSidebarAriaLabel: return "Seitenleiste öffnen"; + case Label.FailedToSaveLayout: return "Layout konnte nicht gespeichert werden."; + case Label.FailedToSaveHotkeys: return "Hotkey-Einstellungen konnten nicht gespeichert werden."; + case Label.FailedToSaveGeneralSettings: return "Allgemeine Einstellungen konnten nicht gespeichert werden."; + case Label.FailedToSaveSplits: return "Splits konnten nicht gespeichert werden."; + case Label.LayoutCouldNotBeLoaded: return "Das Layout konnte nicht geladen werden. Dies ist möglicherweise kein gültiges LiveSplit- oder LiveSplit-One-Layout."; + case Label.EmptySplitsNotSupported: return "Leere Splits werden nicht unterstützt."; + case Label.BugEncountered: return "Ein Fehler ist aufgetreten:"; + case Label.PleaseReportIssueStart: return "Bitte melde dieses Problem "; + case Label.ReportHere: return "hier"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Um uns zu helfen, dieses Problem zu beheben, füge bitte Schritte zur Reproduktion hinzu und hänge die Splits und das Layout an, die du verwendet hast, als das Problem auftrat."; + case Label.LoadFailedPrivateBrowsing: return "LiveSplit One konnte nicht geladen werden.\nDu bist möglicherweise im privaten Modus.\nLiveSplit One kann aufgrund der Einschränkungen des privaten Modus keine Splits, Layouts oder andere Einstellungen speichern.\nDiese Einschränkungen könnten in Zukunft aufgehoben werden.\nUm LiveSplit One vorerst zu nutzen, deaktiviere den privaten Modus in den Einstellungen."; + case Label.LoadFailedOutdatedBrowser: return "LiveSplit One konnte nicht geladen werden.\nDu verwendest möglicherweise einen veralteten Browser.\nBitte aktualisiere deinen Browser oder deine iOS‑Version und versuche es erneut.\nEine andere Ursache könnte eine Browser‑Erweiterung sein, z. B. ein Werbeblocker, der den Zugriff auf wichtige Skripte blockiert."; + } +} diff --git a/src/localization/index.ts b/src/localization/index.ts new file mode 100644 index 000000000..464205079 --- /dev/null +++ b/src/localization/index.ts @@ -0,0 +1,403 @@ +import { Lang, Language } from "../livesplit-core"; +import { resolveChineseSimplified } from "./chinese-simplified"; +import { resolveChineseTraditional } from "./chinese-traditional"; +import { resolveDutch } from "./dutch"; +import { resolveEnglish } from "./english"; +import { resolveFrench } from "./french"; +import { resolveGerman } from "./german"; +import { resolveItalian } from "./italian"; +import { resolveJapanese } from "./japanese"; +import { resolveKorean } from "./korean"; +import { resolvePolish } from "./polish"; +import { resolvePortuguese } from "./portuguese"; +import { resolveBrazilianPortuguese } from "./portuguese-brazil"; +import { resolveRussian } from "./russian"; +import { resolveSpanish } from "./spanish"; + +export enum Label { + Ok, + Cancel, + Settings, + Language, + LanguageDescription, + LanguageAuto, + HotkeysHeading, + GeneralHeading, + NetworkHeading, + FrameRate, + FrameRateDescription, + FrameRateBatteryAware, + FrameRateMatchScreen, + SaveOnReset, + SaveOnResetDescription, + ShowControlButtons, + ShowControlButtonsDescription, + ShowManualGameTimeInput, + ShowManualGameTimeInputDescription, + ManualGameTimeMode, + ManualGameTimeModeDescription, + ManualGameTimeModeSegmentTimes, + ManualGameTimeModeSplitTimes, + AlwaysOnTop, + AlwaysOnTopDescription, + SpeedrunComIntegration, + SpeedrunComIntegrationDescription, + ServerConnection, + ServerConnectionDescription, + ServerConnectionExperimental, + HotkeyAlreadyInUse, + Start, + Resume, + Pause, + UndoSplit, + Reset, + SkipSplit, + ManualGameTimePlaceholder, + LiveSplitLogoAlt, + LiveSplitOne, + Splits, + Layout, + CompareAgainst, + RealTime, + GameTime, + PopOut, + About, + Back, + AboutVersionPrefix, + AboutDescription, + AboutViewSource, + AboutRecentChanges, + AboutContributors, + Loading, + Add, + Import, + OpenSplits, + EditSplits, + ExportSplits, + CopySplits, + RemoveSplits, + Untitled, + NoCategory, + DiscardChangesTitle, + DiscardChangesDescription, + DeleteSplitsTitle, + DeleteSplitsDescription, + SaveBestTimesTitle, + SaveBestTimesDescription, + Yes, + No, + DontReset, + FailedToExportSplits, + CantImportEmptySplits, + FailedToReadFile, + FailedToImportSplits, + CouldNotParseSplits, + LoadedSplitsInvalid, + NewSegmentName, + EditWhileRunningError, + Edit, + Save, + Export, + FailedToParseTimeSpan, + Default, + Game, + Category, + StartTimerAt, + Attempts, + SplitsEditor, + Variables, + Rules, + Leaderboard, + InsertAbove, + InsertBelow, + RemoveSegment, + MoveUp, + MoveDown, + AddVariable, + OpenPbPage, + AssociateRun, + Icon, + SegmentName, + SplitTime, + SegmentTime, + BestSegment, + SpeedrunComVariableTooltip, + Region, + RegionDescription, + Platform, + PlatformDescription, + UsesEmulator, + UsesEmulatorDescription, + CustomVariableTooltip, + NoVariables, + NoVariablesWithSpeedrunCom, + TimedWithoutLoads, + TimedWithGameTime, + RequireVideoProof, + RunsOfThisGamePrefix, + RunsOfThisGameSuffix, + And, + SetIcon, + SetIconDescription, + DownloadBoxArt, + DownloadBoxArtDescription, + DownloadIcon, + DownloadIconDescription, + RemoveIcon, + RemoveIconDescription, + CleaningMenu, + ClearOnlyHistory, + ClearOnlyHistoryDescription, + ClearAllTimes, + ClearAllTimesDescription, + CleanSumOfBest, + CleanSumOfBestDescription, + ComparisonsMenu, + AddComparison, + AddComparisonDescription, + ImportComparison, + ImportComparisonDescription, + GenerateGoalComparison, + GenerateGoalComparisonDescription, + CopyComparison, + CopyComparisonDescription, + SetSegmentIcon, + SetSegmentIconDescription, + RemoveSegmentIcon, + RemoveSegmentIconDescription, + Rename, + RenameDescription, + CopyAction, + CopyDescription, + ACopy, + Remove, + RemoveDescription, + AnyPercent, + LowPercent, + HundredPercent, + AddComparisonPrompt, + ComparisonAddError, + ImportComparisonPrompt, + GenerateGoalComparisonPrompt, + Generate, + GenerateGoalComparisonError, + CopyComparisonPrompt, + CopyComparisonError, + NothingToCleanUp, + CleanPrompt, + AssociateRunPrompt, + Associate, + InvalidSpeedrunUrl, + AssociateRunError, + AddVariablePrompt, + RenameComparison, + RenameComparisonPrompt, + ComparisonRenameError, + GameNotFound, + NoBoxArt, + DownloadBoxArtError, + NoGameIcon, + DownloadIconError, + Rank, + Player, + Time, + Date, + Emulator, + EmulatorTag, + ObsoleteRuns, + Shown, + Hidden, + OpenLeaderboard, + Filters, + LayoutEditor, + Component, + AddComponent, + RemoveComponent, + DuplicateComponent, + MoveComponentUp, + MoveComponentDown, + ComponentTitle, + ComponentTitleDescription, + ComponentGraph, + ComponentGraphDescription, + ComponentSplitsDescription, + ComponentDetailedTimer, + ComponentDetailedTimerDescription, + ComponentTimer, + ComponentTimerDescription, + ComponentCurrentComparison, + ComponentCurrentComparisonDescription, + ComponentCurrentPace, + ComponentCurrentPaceDescription, + ComponentDelta, + ComponentDeltaDescription, + ComponentPbChance, + ComponentPbChanceDescription, + ComponentPossibleTimeSave, + ComponentPossibleTimeSaveDescription, + ComponentPreviousSegment, + ComponentPreviousSegmentDescription, + ComponentSegmentTime, + ComponentSegmentTimeDescription, + ComponentSumOfBest, + ComponentSumOfBestDescription, + ComponentText, + ComponentTextDescription, + ComponentTotalPlaytime, + ComponentTotalPlaytimeDescription, + ComponentVariableDescription, + ComponentBlankSpace, + ComponentBlankSpaceDescription, + ComponentSeparator, + ComponentSeparatorDescription, + AccuracySeconds, + AccuracyTenths, + AccuracyHundredths, + AccuracyMilliseconds, + FontStyle, + FontWeight, + FontStretch, + FontStyleNormal, + FontStyleItalic, + AlignmentAutomatic, + AlignmentLeft, + AlignmentCenter, + GradientTransparent, + GradientPlain, + GradientVertical, + GradientHorizontal, + GradientAlternating, + GradientPlainDelta, + GradientVerticalDelta, + GradientHorizontalDelta, + LayoutBackgroundImage, + LayoutBackgroundBrightness, + LayoutBackgroundOpacity, + LayoutBackgroundBlur, + LayoutDirectionVertical, + LayoutDirectionHorizontal, + ColumnKindTime, + ColumnKindVariable, + ColumnStartWithEmpty, + ColumnStartWithComparisonTime, + ColumnStartWithComparisonSegmentTime, + ColumnStartWithPossibleTimeSave, + ColumnUpdateWithDontUpdate, + ColumnUpdateWithSplitTime, + ColumnUpdateWithDelta, + ColumnUpdateWithDeltaWithFallback, + ColumnUpdateWithSegmentTime, + ColumnUpdateWithSegmentDelta, + ColumnUpdateWithSegmentDeltaWithFallback, + ColumnUpdateTriggerOnStartingSegment, + ColumnUpdateTriggerContextual, + ColumnUpdateTriggerOnEndingSegment, + ComparisonCurrentComparison, + CustomVariableNoneAvailable, + CustomVariableNoneAvailableTooltip, + HotkeyButtonTooltip, + ServerConnect, + ServerDisconnect, + ServerConnecting, + ServerDisconnecting, + ConnectToServerTitle, + ConnectToServerDescription, + Connect, + UpdateAvailable, + UnsavedChangesBeforeUnload, + OpenSidebarAriaLabel, + FailedToSaveLayout, + FailedToSaveHotkeys, + FailedToSaveGeneralSettings, + FailedToSaveSplits, + LayoutCouldNotBeLoaded, + EmptySplitsNotSupported, + BugEncountered, + PleaseReportIssueStart, + ReportHere, + PleaseReportIssueEnd, + BugReportInstructions, + LoadFailedPrivateBrowsing, + LoadFailedOutdatedBrowser, +} + +export function resolve(text: Label, lang: Language | undefined): string { + switch (orAutoLang(lang)) { + case Language.ChineseSimplified: return resolveChineseSimplified(text); + case Language.ChineseTraditional: return resolveChineseTraditional(text); + case Language.Dutch: return resolveDutch(text); + case Language.French: return resolveFrench(text); + case Language.German: return resolveGerman(text); + case Language.Italian: return resolveItalian(text); + case Language.Japanese: return resolveJapanese(text); + case Language.Korean: return resolveKorean(text); + case Language.Polish: return resolvePolish(text); + case Language.Portuguese: return resolvePortuguese(text); + case Language.BrazilianPortuguese: return resolveBrazilianPortuguese(text); + case Language.Russian: return resolveRussian(text); + case Language.Spanish: return resolveSpanish(text); + case Language.English: return resolveEnglish(text); + } +} + +export function getLocale(lang: Language | undefined): string { + return getLocaleOpt(lang) ?? navigator.language; +} + +export function getLocaleOpt(lang: Language | undefined): string | undefined { + if (lang == null) { + return undefined; + } + switch (lang) { + case Language.ChineseSimplified: return "zh-Hans"; + case Language.ChineseTraditional: return "zh-Hant"; + case Language.Dutch: return "nl"; + case Language.French: return "fr"; + case Language.German: return "de"; + case Language.Italian: return "it"; + case Language.Japanese: return "ja"; + case Language.Korean: return "ko"; + case Language.Polish: return "pl"; + case Language.Portuguese: return "pt"; + case Language.BrazilianPortuguese: return "pt-BR"; + case Language.Russian: return "ru"; + case Language.Spanish: return "es"; + case Language.English: return "en"; + } +} + +export function fromLocaleOpt(value: unknown): Language | undefined { + if (typeof value === "string") { + return Lang.parseLocale(value); + } else { + return undefined; + } +} + +export function formatDate(date: string, lang: Language | undefined): string { + // FIXME: Use Temporal.PlainDate when it's available in Safari. + const locale = getLocale(lang); + const dateObj = new Date(date); + return dateObj.toLocaleDateString(locale, { + timeZone: "UTC", + year: "numeric", + month: "long", + day: "numeric", + }); +} + +let autoLang: Language | undefined = undefined; +export function orAutoLang(lang: Language | undefined): Language { + if (lang != null) { + return lang; + } + if (autoLang != null) { + return autoLang; + } + autoLang = Lang.parseLocale(navigator.language); + return autoLang; +} + +export function setHtmlLang(lang: Language | undefined): void { + document.documentElement.lang = getLocale(lang); +} diff --git a/src/localization/italian.ts b/src/localization/italian.ts new file mode 100644 index 000000000..8977b0f37 --- /dev/null +++ b/src/localization/italian.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveItalian(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Annulla"; + case Label.Settings: return "Impostazioni"; + case Label.Language: return "Lingua"; + case Label.LanguageDescription: return "Imposta la lingua utilizzata nell'applicazione."; + case Label.LanguageAuto: return "Automatico"; + case Label.HotkeysHeading: return "Scorciatoie"; + case Label.GeneralHeading: return "Generale"; + case Label.NetworkHeading: return "Rete"; + case Label.FrameRate: return "Frequenza dei fotogrammi"; + case Label.FrameRateDescription: return "Determina la frequenza dei fotogrammi con cui visualizzare il timer. «Consapevole della batteria» prova a determinare il tipo di dispositivo e lo stato di carica per scegliere una buona frequenza. «Abbina allo schermo» fa corrispondere il timer alla frequenza di aggiornamento dello schermo."; + case Label.FrameRateBatteryAware: return "Consapevole della batteria"; + case Label.FrameRateMatchScreen: return "Abbina allo schermo"; + case Label.SaveOnReset: return "Salva al reset"; + case Label.SaveOnResetDescription: return "Determina se salvare automaticamente gli split quando si resetta il timer."; + case Label.ShowControlButtons: return "Mostra pulsanti di controllo"; + case Label.ShowControlButtonsDescription: return "Determina se mostrare pulsanti sotto il timer che consentono di controllarlo. Quando disattivati, devi usare le scorciatoie."; + case Label.ShowManualGameTimeInput: return "Mostra input manuale del tempo di gioco"; + case Label.ShowManualGameTimeInputDescription: return "Mostra una casella di testo sotto il timer che permette di inserire manualmente il tempo di gioco. Avvii il timer e fai gli split premendo Invio nella casella di testo. Assicurati di confrontare con «Game Time»."; + case Label.ManualGameTimeMode: return "Modalità tempo di gioco manuale"; + case Label.ManualGameTimeModeDescription: return "Determina se inserire il tempo di gioco manuale come tempi segmento o tempi split."; + case Label.ManualGameTimeModeSegmentTimes: return "Tempi segmento"; + case Label.ManualGameTimeModeSplitTimes: return "Tempi split"; + case Label.AlwaysOnTop: return "Sempre in primo piano"; + case Label.AlwaysOnTopDescription: return "Mantiene la finestra sempre sopra le altre finestre."; + case Label.SpeedrunComIntegration: return "Integrazione Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Richiede l'elenco dei giochi, delle categorie e delle classifiche da speedrun.com."; + case Label.ServerConnection: return "Connessione server"; + case Label.ServerConnectionDescription: return "Consente di connettersi a un server WebSocket che può controllare il timer inviando vari comandi. I comandi sono attualmente un sottoinsieme di quelli supportati dal LiveSplit originale."; + case Label.ServerConnectionExperimental: return "Questa funzionalità è sperimentale e il protocollo probabilmente cambierà in futuro."; + case Label.HotkeyAlreadyInUse: return "La scorciatoia è già in uso."; + case Label.Start: return "Avvia"; + case Label.Resume: return "Riprendi"; + case Label.Pause: return "Pausa"; + case Label.UndoSplit: return "Annulla split"; + case Label.Reset: return "Reimposta"; + case Label.SkipSplit: return "Salta split"; + case Label.ManualGameTimePlaceholder: return "Tempo di gioco manuale"; + case Label.LiveSplitLogoAlt: return "Logo LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Layout"; + case Label.CompareAgainst: return "Confronta con"; + case Label.RealTime: return "Tempo reale"; + case Label.GameTime: return "Tempo di gioco"; + case Label.PopOut: return "Finestra separata"; + case Label.About: return "Informazioni"; + case Label.Back: return "Indietro"; + case Label.AboutVersionPrefix: return "Versione:"; + case Label.AboutDescription: return "LiveSplit One è una versione multipiattaforma di LiveSplit, il timer elegante e altamente personalizzabile per speedrunner."; + case Label.AboutViewSource: return "Visualizza il codice sorgente su GitHub"; + case Label.AboutRecentChanges: return "Modifiche recenti"; + case Label.AboutContributors: return "Collaboratori"; + case Label.Loading: return "Caricamento..."; + case Label.Add: return "Aggiungi"; + case Label.Import: return "Importa"; + case Label.OpenSplits: return "Apri split"; + case Label.EditSplits: return "Modifica split"; + case Label.ExportSplits: return "Esporta split"; + case Label.CopySplits: return "Copia split"; + case Label.RemoveSplits: return "Rimuovi split"; + case Label.Untitled: return "Senza titolo"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Scartare le modifiche?"; + case Label.DiscardChangesDescription: return "Gli split attuali sono stati modificati e hanno modifiche non salvate. Vuoi continuare e scartare le modifiche?"; + case Label.DeleteSplitsTitle: return "Eliminare gli split?"; + case Label.DeleteSplitsDescription: return "Sei sicuro di voler eliminare gli split? Questa operazione non può essere annullata."; + case Label.SaveBestTimesTitle: return "Salvare i migliori tempi?"; + case Label.SaveBestTimesDescription: return "Hai migliorato alcuni dei tuoi migliori tempi. Vuoi aggiornarli?"; + case Label.Yes: return "Sì"; + case Label.No: return "No"; + case Label.DontReset: return "Non azzerare"; + case Label.FailedToExportSplits: return "Impossibile esportare gli split."; + case Label.CantImportEmptySplits: return "Non è possibile importare split vuoti."; + case Label.FailedToReadFile: return "Impossibile leggere il file:"; + case Label.FailedToImportSplits: return "Impossibile importare gli split:"; + case Label.CouldNotParseSplits: return "Impossibile analizzare gli split."; + case Label.LoadedSplitsInvalid: return "Gli split caricati non sono validi."; + case Label.NewSegmentName: return "Tempo"; + case Label.EditWhileRunningError: return "Non puoi modificare gli split mentre il timer è in esecuzione."; + case Label.Edit: return "Modifica"; + case Label.Save: return "Salva"; + case Label.Export: return "Esporta"; + case Label.FailedToParseTimeSpan: return "Impossibile analizzare TimeSpan"; + case Label.Default: return "Predefinito"; + case Label.Game: return "Gioco"; + case Label.Category: return "Categoria"; + case Label.StartTimerAt: return "Avvia timer a"; + case Label.Attempts: return "Tentativi"; + case Label.SplitsEditor: return "Editor degli split"; + case Label.Variables: return "Variabili"; + case Label.Rules: return "Regole"; + case Label.Leaderboard: return "Classifica"; + case Label.InsertAbove: return "Inserisci sopra"; + case Label.InsertBelow: return "Inserisci sotto"; + case Label.RemoveSegment: return "Rimuovi segmento"; + case Label.MoveUp: return "Sposta su"; + case Label.MoveDown: return "Sposta giù"; + case Label.AddVariable: return "Aggiungi variabile"; + case Label.OpenPbPage: return "Apri pagina PB"; + case Label.AssociateRun: return "Associa run"; + case Label.Icon: return "Icona"; + case Label.SegmentName: return "Nome segmento"; + case Label.SplitTime: return "Tempo split"; + case Label.SegmentTime: return "Tempo segmento"; + case Label.BestSegment: return "Miglior segmento"; + case Label.SpeedrunComVariableTooltip: return "Variabile di speedrun.com specifica del gioco."; + case Label.Region: return "Regione"; + case Label.RegionDescription: return "La regione del gioco che si sta giocando."; + case Label.Platform: return "Piattaforma"; + case Label.PlatformDescription: return "La piattaforma su cui si gioca."; + case Label.UsesEmulator: return "Usa emulatore"; + case Label.UsesEmulatorDescription: return "Se viene usato un emulatore."; + case Label.CustomVariableTooltip: return "Variabile personalizzata da te. Può essere mostrata con il componente testo."; + case Label.NoVariables: return "Al momento non ci sono variabili personalizzate per questo gioco."; + case Label.NoVariablesWithSpeedrunCom: return "Al momento non ci sono variabili di speedrun.com o personalizzate per questo gioco."; + case Label.TimedWithoutLoads: return "sono cronometrate senza tempi di caricamento"; + case Label.TimedWithGameTime: return "sono cronometrate con Game Time"; + case Label.RequireVideoProof: return "richiedono prova video"; + case Label.RunsOfThisGamePrefix: return "Le run di questo gioco "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "e"; + case Label.SetIcon: return "Imposta icona"; + case Label.SetIconDescription: return "Scegli un'immagine come icona del gioco. Alcuni formati potrebbero non funzionare ovunque."; + case Label.DownloadBoxArt: return "Scarica copertina"; + case Label.DownloadBoxArtDescription: return "Tenta di scaricare la copertina da speedrun.com per impostarla come icona del gioco."; + case Label.DownloadIcon: return "Scarica icona"; + case Label.DownloadIconDescription: return "Tenta di scaricare l'icona del gioco da speedrun.com."; + case Label.RemoveIcon: return "Rimuovi icona"; + case Label.RemoveIconDescription: return "Rimuove l'icona del gioco."; + case Label.CleaningMenu: return "Pulizia…"; + case Label.ClearOnlyHistory: return "Cancella solo cronologia"; + case Label.ClearOnlyHistoryDescription: return "Gli split salvano tutta la cronologia delle run. Questa azione cancella la cronologia senza influire su PB, migliori segmenti o confronti."; + case Label.ClearAllTimes: return "Cancella tutti i tempi"; + case Label.ClearAllTimesDescription: return "Rimuove tutti i tempi e la cronologia, rendendo gli split vuoti."; + case Label.CleanSumOfBest: return "Pulisci la somma dei migliori"; + case Label.CleanSumOfBestDescription: return "Permette di rimuovere interattivamente problemi nella cronologia dei segmenti che rendono la somma dei migliori segmenti imprecisa."; + case Label.ComparisonsMenu: return "Confronti…"; + case Label.AddComparison: return "Aggiungi confronto"; + case Label.AddComparisonDescription: return "Aggiunge un confronto personalizzato dove puoi salvare i tempi."; + case Label.ImportComparison: return "Importa confronto"; + case Label.ImportComparisonDescription: return "Importa il Personal Best di un file splits come confronto."; + case Label.GenerateGoalComparison: return "Genera confronto obiettivo"; + case Label.GenerateGoalComparisonDescription: return "Genera un confronto obiettivo basato su un tempo obiettivo."; + case Label.CopyComparison: return "Copia confronto"; + case Label.CopyComparisonDescription: return "Copia un confronto esistente come nuovo confronto personalizzato."; + case Label.SetSegmentIcon: return "Imposta icona"; + case Label.SetSegmentIconDescription: return "Scegli un'immagine come icona del segmento. Alcuni formati potrebbero non funzionare ovunque."; + case Label.RemoveSegmentIcon: return "Rimuovi icona"; + case Label.RemoveSegmentIconDescription: return "Rimuove l'icona del segmento."; + case Label.Rename: return "Rinomina"; + case Label.RenameDescription: return "Scegli un nuovo nome per il confronto personalizzato. Nomi riservati o duplicati non sono consentiti."; + case Label.CopyAction: return "Copia"; + case Label.CopyDescription: return "Crea una copia del confronto personalizzato."; + case Label.ACopy: return "Copia"; + case Label.Remove: return "Rimuovi"; + case Label.RemoveDescription: return "Rimuove il confronto personalizzato."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Specifica il nome del confronto da aggiungere:"; + case Label.ComparisonAddError: return "Impossibile aggiungere il confronto. Potrebbe essere duplicato o riservato."; + case Label.ImportComparisonPrompt: return "Specifica il nome del confronto da importare:"; + case Label.GenerateGoalComparisonPrompt: return "Specifica il tempo che vuoi raggiungere:"; + case Label.Generate: return "Genera"; + case Label.GenerateGoalComparisonError: return "Impossibile generare il confronto obiettivo. Specifica un tempo valido."; + case Label.CopyComparisonPrompt: return "Specifica il nome del confronto da copiare:"; + case Label.CopyComparisonError: return "Impossibile copiare il confronto. Il confronto potrebbe non esistere."; + case Label.NothingToCleanUp: return "Non c'è nulla da pulire."; + case Label.CleanPrompt: return "Pulire?"; + case Label.AssociateRunPrompt: return "Specifica l'ID o l'URL speedrun.com della run:"; + case Label.Associate: return "Associa"; + case Label.InvalidSpeedrunUrl: return "ID o URL speedrun.com non valido."; + case Label.AssociateRunError: return "Impossibile associare la run. L'ID potrebbe non essere valido."; + case Label.AddVariablePrompt: return "Specifica il nome della variabile personalizzata da aggiungere:"; + case Label.RenameComparison: return "Rinomina confronto"; + case Label.RenameComparisonPrompt: return "Specifica il nuovo nome del confronto:"; + case Label.ComparisonRenameError: return "Impossibile rinominare il confronto. Potrebbe essere duplicato o riservato."; + case Label.GameNotFound: return "Gioco non trovato."; + case Label.NoBoxArt: return "Il gioco non ha una copertina."; + case Label.DownloadBoxArtError: return "Impossibile scaricare la copertina."; + case Label.NoGameIcon: return "Il gioco non ha un'icona."; + case Label.DownloadIconError: return "Impossibile scaricare l'icona."; + case Label.Rank: return "Posizione"; + case Label.Player: return "Giocatore"; + case Label.Time: return "Tempo"; + case Label.Date: return "Data:"; + case Label.Emulator: return "Emulatore"; + case Label.EmulatorTag: return "Emulatore"; + case Label.ObsoleteRuns: return "Run obsolete"; + case Label.Shown: return "Mostrate"; + case Label.Hidden: return "Nascoste"; + case Label.OpenLeaderboard: return "Apri classifica"; + case Label.Filters: return "Filtri"; + case Label.LayoutEditor: return "Editor layout"; + case Label.Component: return "Componente"; + case Label.AddComponent: return "Aggiungi componente"; + case Label.RemoveComponent: return "Rimuovi componente"; + case Label.DuplicateComponent: return "Duplica componente"; + case Label.MoveComponentUp: return "Sposta componente su"; + case Label.MoveComponentDown: return "Sposta componente giù"; + case Label.ComponentTitle: return "Titolo"; + case Label.ComponentTitleDescription: return "Mostra nome gioco e categoria, oltre a icona, tentativi e run completate."; + case Label.ComponentGraph: return "Grafico"; + case Label.ComponentGraphDescription: return "Visualizza vantaggio/svantaggio della run rispetto al confronto."; + case Label.ComponentSplitsDescription: return "Componente principale per gli split con icona, nome, delta e tempo; scorrevole."; + case Label.ComponentDetailedTimer: return "Timer dettagliato"; + case Label.ComponentDetailedTimerDescription: return "Mostra tempo totale e del segmento, più info opzionali."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Mostra il tempo totale come orologio digitale; colore in base al confronto."; + case Label.ComponentCurrentComparison: return "Confronto attuale"; + case Label.ComponentCurrentComparisonDescription: return "Mostra il nome del confronto attuale."; + case Label.ComponentCurrentPace: return "Pace attuale"; + case Label.ComponentCurrentPaceDescription: return "Predice il tempo finale in base al confronto scelto."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Mostra quanto sei avanti o indietro rispetto al confronto."; + case Label.ComponentPbChance: return "Probabilità PB"; + case Label.ComponentPbChanceDescription: return "Mostra la probabilità di battere il PB, dinamica durante la run."; + case Label.ComponentPossibleTimeSave: return "Tempo risparmiabile"; + case Label.ComponentPossibleTimeSaveDescription: return "Mostra il tempo risparmiabile nel segmento e totale."; + case Label.ComponentPreviousSegment: return "Segmento precedente"; + case Label.ComponentPreviousSegmentDescription: return "Mostra tempo guadagnato/perso nel segmento precedente e risparmio potenziale."; + case Label.ComponentSegmentTime: return "Tempo segmento"; + case Label.ComponentSegmentTimeDescription: return "Mostra il tempo del segmento per il confronto scelto."; + case Label.ComponentSumOfBest: return "Somma dei migliori"; + case Label.ComponentSumOfBestDescription: return "Mostra il tempo più veloce possibile basato sulla storia."; + case Label.ComponentText: return "Testo"; + case Label.ComponentTextDescription: return "Mostra testo centrato o sinistra/destra, oppure una variabile personalizzata."; + case Label.ComponentTotalPlaytime: return "Tempo di gioco totale"; + case Label.ComponentTotalPlaytimeDescription: return "Mostra il tempo totale di gioco della categoria."; + case Label.ComponentVariableDescription: return "Crea un componente testo che mostra il valore della variabile «{name}»."; + case Label.ComponentBlankSpace: return "Spazio vuoto"; + case Label.ComponentBlankSpaceDescription: return "Componente vuoto usato come spaziatura."; + case Label.ComponentSeparator: return "Separatore"; + case Label.ComponentSeparatorDescription: return "Rende un separatore tra componenti."; + case Label.AccuracySeconds: return "Secondi"; + case Label.AccuracyTenths: return "Decimi"; + case Label.AccuracyHundredths: return "Centesimi"; + case Label.AccuracyMilliseconds: return "Millisecondi"; + case Label.FontStyle: return "Stile"; + case Label.FontWeight: return "Peso"; + case Label.FontStretch: return "Allungamento"; + case Label.FontStyleNormal: return "Normale"; + case Label.FontStyleItalic: return "Corsivo"; + case Label.AlignmentAutomatic: return "Automatico"; + case Label.AlignmentLeft: return "Sinistra"; + case Label.AlignmentCenter: return "Centro"; + case Label.GradientTransparent: return "Trasparente"; + case Label.GradientPlain: return "Tinta unita"; + case Label.GradientVertical: return "Verticale"; + case Label.GradientHorizontal: return "Orizzontale"; + case Label.GradientAlternating: return "Alternato"; + case Label.GradientPlainDelta: return "Delta tinta unita"; + case Label.GradientVerticalDelta: return "Delta verticale"; + case Label.GradientHorizontalDelta: return "Delta orizzontale"; + case Label.LayoutBackgroundImage: return "Immagine"; + case Label.LayoutBackgroundBrightness: return "Luminosità"; + case Label.LayoutBackgroundOpacity: return "Opacità"; + case Label.LayoutBackgroundBlur: return "Sfocatura"; + case Label.LayoutDirectionVertical: return "Verticale"; + case Label.LayoutDirectionHorizontal: return "Orizzontale"; + case Label.ColumnKindTime: return "Tempo"; + case Label.ColumnKindVariable: return "Variabile"; + case Label.ColumnStartWithEmpty: return "Vuoto"; + case Label.ColumnStartWithComparisonTime: return "Tempo di confronto"; + case Label.ColumnStartWithComparisonSegmentTime: return "Tempo segmento di confronto"; + case Label.ColumnStartWithPossibleTimeSave: return "Tempo risparmiabile"; + case Label.ColumnUpdateWithDontUpdate: return "Non aggiornare"; + case Label.ColumnUpdateWithSplitTime: return "Tempo split"; + case Label.ColumnUpdateWithDelta: return "Tempo avanti / indietro"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Tempo avanti / indietro o tempo split se vuoto"; + case Label.ColumnUpdateWithSegmentTime: return "Tempo segmento"; + case Label.ColumnUpdateWithSegmentDelta: return "Tempo guadagnato / perso"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Tempo guadagnato / perso o tempo segmento se vuoto"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "All’inizio del segmento"; + case Label.ColumnUpdateTriggerContextual: return "Contestuale"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Alla fine del segmento"; + case Label.ComparisonCurrentComparison: return "Confronto attuale"; + case Label.CustomVariableNoneAvailable: return "Nessuna variabile disponibile"; + case Label.CustomVariableNoneAvailableTooltip: return "Le variabili personalizzate possono essere definite nella scheda Variabili durante la modifica degli split. Ulteriori variabili personalizzate possono essere fornite automaticamente dagli auto splitter."; + case Label.HotkeyButtonTooltip: return "Fai clic per registrare un tasto di scelta rapida. Puoi usare anche i pulsanti del gamepad. Gli hotkey globali al momento non sono possibili. I pulsanti del gamepad funzionano globalmente."; + case Label.ServerConnect: return "Connetti"; + case Label.ServerDisconnect: return "Disconnetti"; + case Label.ServerConnecting: return "Connessione..."; + case Label.ServerDisconnecting: return "Disconnessione..."; + case Label.ConnectToServerTitle: return "Connetti al server"; + case Label.ConnectToServerDescription: return "Specifica l’URL WebSocket:"; + case Label.Connect: return "Connetti"; + case Label.UpdateAvailable: return "È disponibile una nuova versione di LiveSplit One! Clicca qui per ricaricare."; + case Label.UnsavedChangesBeforeUnload: return "Ci sono modifiche non salvate. Vuoi davvero chiudere LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Apri barra laterale"; + case Label.FailedToSaveLayout: return "Impossibile salvare il layout."; + case Label.FailedToSaveHotkeys: return "Impossibile salvare le impostazioni dei tasti di scelta rapida."; + case Label.FailedToSaveGeneralSettings: return "Impossibile salvare le impostazioni generali."; + case Label.FailedToSaveSplits: return "Impossibile salvare gli split."; + case Label.LayoutCouldNotBeLoaded: return "Il layout non può essere caricato. Potrebbe non essere un layout LiveSplit o LiveSplit One valido."; + case Label.EmptySplitsNotSupported: return "Gli split vuoti non sono supportati."; + case Label.BugEncountered: return "Hai riscontrato un bug:"; + case Label.PleaseReportIssueStart: return "Segnala questo problema "; + case Label.ReportHere: return "qui"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Per aiutarci a risolvere questo problema, includi i passaggi per riprodurlo e allega gli split e il layout che stavi usando quando si è verificato il problema."; + case Label.LoadFailedPrivateBrowsing: return "Impossibile caricare LiveSplit One.\nPotresti essere in modalità di navigazione privata.\nLiveSplit One non può salvare split, layout o altre impostazioni a causa delle limitazioni della modalità privata del browser.\nQueste limitazioni potrebbero essere rimosse in futuro.\nPer usare LiveSplit One ora, disattiva la navigazione privata nelle impostazioni."; + case Label.LoadFailedOutdatedBrowser: return "Impossibile caricare LiveSplit One.\nPotresti usare un browser non aggiornato.\nAggiorna il browser o la versione di iOS e riprova.\nUn altro motivo potrebbe essere un’estensione del browser, ad esempio un adblocker, che blocca l’accesso a script importanti."; + } +} diff --git a/src/localization/japanese.ts b/src/localization/japanese.ts new file mode 100644 index 000000000..d02e78a8b --- /dev/null +++ b/src/localization/japanese.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveJapanese(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "キャンセル"; + case Label.Settings: return "設定"; + case Label.Language: return "言語"; + case Label.LanguageDescription: return "アプリケーションで使用される言語を設定します。"; + case Label.LanguageAuto: return "自動"; + case Label.HotkeysHeading: return "ホットキー"; + case Label.GeneralHeading: return "一般"; + case Label.NetworkHeading: return "ネットワーク"; + case Label.FrameRate: return "フレームレート"; + case Label.FrameRateDescription: return "タイマーを表示するフレームレートを決定します。「バッテリー考慮」はデバイスの種類と充電状態を判断して適切なフレームレートを選択します。「画面に合わせる」はタイマーを画面のリフレッシュレートに合わせます。"; + case Label.FrameRateBatteryAware: return "バッテリー考慮"; + case Label.FrameRateMatchScreen: return "画面に合わせる"; + case Label.SaveOnReset: return "リセット時に保存"; + case Label.SaveOnResetDescription: return "タイマーをリセットしたときにスプリットを自動的に保存するかどうかを決定します。"; + case Label.ShowControlButtons: return "コントロールボタンを表示"; + case Label.ShowControlButtonsDescription: return "タイマー下に制御用のボタンを表示するかどうかを決定します。無効にした場合はホットキーを使用する必要があります。"; + case Label.ShowManualGameTimeInput: return "手動のゲームタイム入力を表示"; + case Label.ShowManualGameTimeInputDescription: return "タイマー下にゲームタイムを手動で入力できるテキストボックスを表示します。テキストボックスで Enter キーを押すとタイマーを開始し、スプリットします。「Game Time」との比較を忘れないでください。"; + case Label.ManualGameTimeMode: return "手動ゲームタイムモード"; + case Label.ManualGameTimeModeDescription: return "手動のゲームタイムをセグメントタイムとして入力するか、スプリットタイムとして入力するかを決定します。"; + case Label.ManualGameTimeModeSegmentTimes: return "セグメントタイム"; + case Label.ManualGameTimeModeSplitTimes: return "スプリットタイム"; + case Label.AlwaysOnTop: return "常に最前面"; + case Label.AlwaysOnTopDescription: return "ウィンドウを常に他のウィンドウの前面に表示します。"; + case Label.SpeedrunComIntegration: return "Speedrun.com 連携"; + case Label.SpeedrunComIntegrationDescription: return "speedrun.com からゲーム、カテゴリ、リーダーボードの一覧を取得します。"; + case Label.ServerConnection: return "サーバー接続"; + case Label.ServerConnectionDescription: return "WebSocket サーバーに接続して、さまざまなコマンドを送信することでタイマーを制御できます。これらのコマンドは現在、元の LiveSplit がサポートするコマンドの一部です。"; + case Label.ServerConnectionExperimental: return "この機能は実験的で、プロトコルは将来変更される可能性があります。"; + case Label.HotkeyAlreadyInUse: return "このホットキーは既に使用されています。"; + case Label.Start: return "開始"; + case Label.Resume: return "再開"; + case Label.Pause: return "一時停止"; + case Label.UndoSplit: return "スプリットを戻す"; + case Label.Reset: return "リセット"; + case Label.SkipSplit: return "スプリットをスキップ"; + case Label.ManualGameTimePlaceholder: return "手動ゲームタイム"; + case Label.LiveSplitLogoAlt: return "LiveSplit ロゴ"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "スプリット"; + case Label.Layout: return "レイアウト"; + case Label.CompareAgainst: return "比較対象"; + case Label.RealTime: return "リアルタイム"; + case Label.GameTime: return "ゲームタイム"; + case Label.PopOut: return "ポップアウト"; + case Label.About: return "このアプリについて"; + case Label.Back: return "戻る"; + case Label.AboutVersionPrefix: return "バージョン:"; + case Label.AboutDescription: return "LiveSplit One は LiveSplit のマルチプラットフォーム版で、スピードランナー向けの洗練された高いカスタマイズ性を持つタイマーです。"; + case Label.AboutViewSource: return "GitHub でソースコードを見る"; + case Label.AboutRecentChanges: return "最近の変更"; + case Label.AboutContributors: return "貢献者"; + case Label.Loading: return "読み込み中..."; + case Label.Add: return "追加"; + case Label.Import: return "インポート"; + case Label.OpenSplits: return "スプリットを開く"; + case Label.EditSplits: return "スプリットを編集"; + case Label.ExportSplits: return "スプリットをエクスポート"; + case Label.CopySplits: return "スプリットをコピー"; + case Label.RemoveSplits: return "スプリットを削除"; + case Label.Untitled: return "無題"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "変更を破棄しますか?"; + case Label.DiscardChangesDescription: return "現在のスプリットには未保存の変更があります。続行して変更を破棄しますか?"; + case Label.DeleteSplitsTitle: return "スプリットを削除しますか?"; + case Label.DeleteSplitsDescription: return "スプリットを削除してもよろしいですか?この操作は元に戻せません。"; + case Label.SaveBestTimesTitle: return "ベストタイムを保存しますか?"; + case Label.SaveBestTimesDescription: return "いくつかのベストタイムを更新しました。更新しますか?"; + case Label.Yes: return "はい"; + case Label.No: return "いいえ"; + case Label.DontReset: return "リセットしない"; + case Label.FailedToExportSplits: return "スプリットのエクスポートに失敗しました。"; + case Label.CantImportEmptySplits: return "空のスプリットはインポートできません。"; + case Label.FailedToReadFile: return "ファイルの読み込みに失敗しました:"; + case Label.FailedToImportSplits: return "スプリットのインポートに失敗しました:"; + case Label.CouldNotParseSplits: return "スプリットを解析できませんでした。"; + case Label.LoadedSplitsInvalid: return "読み込んだスプリットが無効です。"; + case Label.NewSegmentName: return "時間"; + case Label.EditWhileRunningError: return "タイマーが動作中はスプリットを編集できません。"; + case Label.Edit: return "編集"; + case Label.Save: return "保存"; + case Label.Export: return "エクスポート"; + case Label.FailedToParseTimeSpan: return "TimeSpan を解析できませんでした"; + case Label.Default: return "既定"; + case Label.Game: return "ゲーム"; + case Label.Category: return "カテゴリ"; + case Label.StartTimerAt: return "開始時刻"; + case Label.Attempts: return "試行回数"; + case Label.SplitsEditor: return "スプリット編集"; + case Label.Variables: return "変数"; + case Label.Rules: return "ルール"; + case Label.Leaderboard: return "リーダーボード"; + case Label.InsertAbove: return "上に挿入"; + case Label.InsertBelow: return "下に挿入"; + case Label.RemoveSegment: return "セグメント削除"; + case Label.MoveUp: return "上へ移動"; + case Label.MoveDown: return "下へ移動"; + case Label.AddVariable: return "変数を追加"; + case Label.OpenPbPage: return "PB ページを開く"; + case Label.AssociateRun: return "ランを関連付け"; + case Label.Icon: return "アイコン"; + case Label.SegmentName: return "セグメント名"; + case Label.SplitTime: return "スプリットタイム"; + case Label.SegmentTime: return "セグメントタイム"; + case Label.BestSegment: return "ベストセグメント"; + case Label.SpeedrunComVariableTooltip: return "speedrun.com のゲーム固有の変数。"; + case Label.Region: return "地域"; + case Label.RegionDescription: return "プレイしているゲームの地域。"; + case Label.Platform: return "プラットフォーム"; + case Label.PlatformDescription: return "ゲームをプレイするプラットフォーム。"; + case Label.UsesEmulator: return "エミュレータ使用"; + case Label.UsesEmulatorDescription: return "エミュレータを使用しているかどうか。"; + case Label.CustomVariableTooltip: return "あなたが指定したカスタム変数。テキストコンポーネントで表示できます。"; + case Label.NoVariables: return "このゲームには現在カスタム変数がありません。"; + case Label.NoVariablesWithSpeedrunCom: return "このゲームには speedrun.com 変数またはカスタム変数がありません。"; + case Label.TimedWithoutLoads: return "ロード時間を除いて計測されます"; + case Label.TimedWithGameTime: return "ゲームタイムで計測されます"; + case Label.RequireVideoProof: return "動画証明が必要です"; + case Label.RunsOfThisGamePrefix: return "このゲームのランは"; + case Label.RunsOfThisGameSuffix: return "。"; + case Label.And: return "と"; + case Label.SetIcon: return "アイコン設定"; + case Label.SetIconDescription: return "画像ファイルを選択してゲームのアイコンに設定します。形式によっては対応していない場合があります。"; + case Label.DownloadBoxArt: return "ボックスアートをダウンロード"; + case Label.DownloadBoxArtDescription: return "speedrun.com からボックスアートをダウンロードしてゲームのアイコンに設定します。"; + case Label.DownloadIcon: return "アイコンをダウンロード"; + case Label.DownloadIconDescription: return "speedrun.com からゲームのアイコンをダウンロードします。"; + case Label.RemoveIcon: return "アイコン削除"; + case Label.RemoveIconDescription: return "ゲームのアイコンを削除します。"; + case Label.CleaningMenu: return "クリーンアップ…"; + case Label.ClearOnlyHistory: return "履歴のみ削除"; + case Label.ClearOnlyHistoryDescription: return "すべてのラン履歴(各セグメントタイム)を削除します。PB、ベストセグメント、比較には影響しません。"; + case Label.ClearAllTimes: return "全ての時間を削除"; + case Label.ClearAllTimesDescription: return "履歴を含むすべての時間を削除し、スプリットを初期状態に戻します。"; + case Label.CleanSumOfBest: return "ベスト合計をクリーン"; + case Label.CleanSumOfBestDescription: return "セグメント履歴の問題を対話的に修正し、ベストセグメント合計の精度を高めます。"; + case Label.ComparisonsMenu: return "比較…"; + case Label.AddComparison: return "比較を追加"; + case Label.AddComparisonDescription: return "カスタム比較を追加します。"; + case Label.ImportComparison: return "比較をインポート"; + case Label.ImportComparisonDescription: return "スプリットファイルの PB を比較としてインポートします。"; + case Label.GenerateGoalComparison: return "目標比較を生成"; + case Label.GenerateGoalComparisonDescription: return "目標タイムに基づく比較を生成します。"; + case Label.CopyComparison: return "比較をコピー"; + case Label.CopyComparisonDescription: return "既存の比較をコピーして新しい比較を作成します。"; + case Label.SetSegmentIcon: return "アイコン設定"; + case Label.SetSegmentIconDescription: return "画像ファイルを選択してセグメントのアイコンに設定します。"; + case Label.RemoveSegmentIcon: return "アイコン削除"; + case Label.RemoveSegmentIconDescription: return "セグメントのアイコンを削除します。"; + case Label.Rename: return "名前変更"; + case Label.RenameDescription: return "比較の新しい名前を選択します。予約名や重複名は使用できません。"; + case Label.CopyAction: return "コピー"; + case Label.CopyDescription: return "比較のコピーを作成します。"; + case Label.ACopy: return "コピー"; + case Label.Remove: return "削除"; + case Label.RemoveDescription: return "比較を削除します。"; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "追加する比較の名前を入力してください:"; + case Label.ComparisonAddError: return "比較を追加できませんでした。重複または予約名の可能性があります。"; + case Label.ImportComparisonPrompt: return "インポートする比較の名前を入力してください:"; + case Label.GenerateGoalComparisonPrompt: return "達成したい時間を入力してください:"; + case Label.Generate: return "生成"; + case Label.GenerateGoalComparisonError: return "目標比較の生成に失敗しました。時間が正しいか確認してください。"; + case Label.CopyComparisonPrompt: return "コピーする比較の名前を入力してください:"; + case Label.CopyComparisonError: return "比較のコピーに失敗しました。比較が存在しない可能性があります。"; + case Label.NothingToCleanUp: return "クリーンアップするものはありません。"; + case Label.CleanPrompt: return "クリーンアップしますか?"; + case Label.AssociateRunPrompt: return "speedrun.com のラン ID または URL を入力してください:"; + case Label.Associate: return "関連付け"; + case Label.InvalidSpeedrunUrl: return "speedrun.com の ID または URL が無効です。"; + case Label.AssociateRunError: return "ランを関連付けできませんでした。ID が無効な可能性があります。"; + case Label.AddVariablePrompt: return "追加するカスタム変数名を入力してください:"; + case Label.RenameComparison: return "比較名を変更"; + case Label.RenameComparisonPrompt: return "新しい比較名を入力してください:"; + case Label.ComparisonRenameError: return "比較名を変更できませんでした。重複または予約名の可能性があります。"; + case Label.GameNotFound: return "ゲームが見つかりませんでした。"; + case Label.NoBoxArt: return "このゲームにはボックスアートがありません。"; + case Label.DownloadBoxArtError: return "ボックスアートをダウンロードできませんでした。"; + case Label.NoGameIcon: return "このゲームにはアイコンがありません。"; + case Label.DownloadIconError: return "アイコンをダウンロードできませんでした。"; + case Label.Rank: return "順位"; + case Label.Player: return "プレイヤー"; + case Label.Time: return "時間"; + case Label.Date: return "日付:"; + case Label.Emulator: return "エミュレータ"; + case Label.EmulatorTag: return "エミュレータ"; + case Label.ObsoleteRuns: return "古い記録"; + case Label.Shown: return "表示"; + case Label.Hidden: return "非表示"; + case Label.OpenLeaderboard: return "リーダーボードを開く"; + case Label.Filters: return "フィルター"; + case Label.LayoutEditor: return "レイアウトエディター"; + case Label.Component: return "コンポーネント"; + case Label.AddComponent: return "コンポーネント追加"; + case Label.RemoveComponent: return "コンポーネント削除"; + case Label.DuplicateComponent: return "コンポーネント複製"; + case Label.MoveComponentUp: return "コンポーネント上へ"; + case Label.MoveComponentDown: return "コンポーネント下へ"; + case Label.ComponentTitle: return "タイトル"; + case Label.ComponentTitleDescription: return "ゲーム名とカテゴリ、アイコン、試行回数、完走数を表示します。"; + case Label.ComponentGraph: return "グラフ"; + case Label.ComponentGraphDescription: return "比較に対する先行/遅れを全区間で可視化します。"; + case Label.ComponentSplitsDescription: return "スプリット時間の主要コンポーネント。表形式で表示し、スクロールできます。"; + case Label.ComponentDetailedTimer: return "詳細タイマー"; + case Label.ComponentDetailedTimerDescription: return "総時間と現在セグメント時間などを表示します。"; + case Label.ComponentTimer: return "タイマー"; + case Label.ComponentTimerDescription: return "総時間をデジタル表示し、色は比較に基づきます。"; + case Label.ComponentCurrentComparison: return "現在の比較"; + case Label.ComponentCurrentComparisonDescription: return "現在の比較名を表示します。"; + case Label.ComponentCurrentPace: return "現在のペース"; + case Label.ComponentCurrentPaceDescription: return "選択した比較に基づき最終時間を予測します。"; + case Label.ComponentDelta: return "差"; + case Label.ComponentDeltaDescription: return "比較に対する先行/遅れを表示します。"; + case Label.ComponentPbChance: return "PB 可能性"; + case Label.ComponentPbChanceDescription: return "PB 更新の可能性を表示します。"; + case Label.ComponentPossibleTimeSave: return "節約可能時間"; + case Label.ComponentPossibleTimeSaveDescription: return "現在セグメントの節約可能時間を表示します。"; + case Label.ComponentPreviousSegment: return "前セグメント"; + case Label.ComponentPreviousSegmentDescription: return "前セグメントの増減や潜在節約を表示します。"; + case Label.ComponentSegmentTime: return "セグメント時間"; + case Label.ComponentSegmentTimeDescription: return "選択した比較のセグメント時間を表示します。"; + case Label.ComponentSumOfBest: return "ベスト合計"; + case Label.ComponentSumOfBestDescription: return "履歴に基づく最速完走時間を表示します。"; + case Label.ComponentText: return "テキスト"; + case Label.ComponentTextDescription: return "中央/左右のテキストやカスタム変数を表示します。"; + case Label.ComponentTotalPlaytime: return "総プレイ時間"; + case Label.ComponentTotalPlaytimeDescription: return "カテゴリの総プレイ時間を表示します。"; + case Label.ComponentVariableDescription: return "カスタム変数「{name}」の値を表示するテキストを作成します。"; + case Label.ComponentBlankSpace: return "空白"; + case Label.ComponentBlankSpaceDescription: return "背景のみの空コンポーネントです。"; + case Label.ComponentSeparator: return "区切り"; + case Label.ComponentSeparatorDescription: return "コンポーネント間の区切り線を表示します。"; + case Label.AccuracySeconds: return "秒"; + case Label.AccuracyTenths: return "1/10秒"; + case Label.AccuracyHundredths: return "1/100秒"; + case Label.AccuracyMilliseconds: return "ミリ秒"; + case Label.FontStyle: return "スタイル"; + case Label.FontWeight: return "太さ"; + case Label.FontStretch: return "幅"; + case Label.FontStyleNormal: return "標準"; + case Label.FontStyleItalic: return "斜体"; + case Label.AlignmentAutomatic: return "自動"; + case Label.AlignmentLeft: return "左"; + case Label.AlignmentCenter: return "中央"; + case Label.GradientTransparent: return "透明"; + case Label.GradientPlain: return "単色"; + case Label.GradientVertical: return "垂直"; + case Label.GradientHorizontal: return "水平"; + case Label.GradientAlternating: return "交互"; + case Label.GradientPlainDelta: return "単色差"; + case Label.GradientVerticalDelta: return "垂直差"; + case Label.GradientHorizontalDelta: return "水平差"; + case Label.LayoutBackgroundImage: return "画像"; + case Label.LayoutBackgroundBrightness: return "明るさ"; + case Label.LayoutBackgroundOpacity: return "不透明度"; + case Label.LayoutBackgroundBlur: return "ぼかし"; + case Label.LayoutDirectionVertical: return "垂直"; + case Label.LayoutDirectionHorizontal: return "水平"; + case Label.ColumnKindTime: return "時間"; + case Label.ColumnKindVariable: return "変数"; + case Label.ColumnStartWithEmpty: return "空"; + case Label.ColumnStartWithComparisonTime: return "比較時間"; + case Label.ColumnStartWithComparisonSegmentTime: return "比較セグメント時間"; + case Label.ColumnStartWithPossibleTimeSave: return "節約可能時間"; + case Label.ColumnUpdateWithDontUpdate: return "更新しない"; + case Label.ColumnUpdateWithSplitTime: return "スプリットタイム"; + case Label.ColumnUpdateWithDelta: return "先行/遅れ時間"; + case Label.ColumnUpdateWithDeltaWithFallback: return "先行/遅れ時間(空ならスプリットタイム)"; + case Label.ColumnUpdateWithSegmentTime: return "セグメントタイム"; + case Label.ColumnUpdateWithSegmentDelta: return "節約/損失時間"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "節約/損失時間(空ならセグメントタイム)"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "セグメント開始時"; + case Label.ColumnUpdateTriggerContextual: return "状況に応じて"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "セグメント終了時"; + case Label.ComparisonCurrentComparison: return "現在の比較"; + case Label.CustomVariableNoneAvailable: return "利用可能な変数がありません"; + case Label.CustomVariableNoneAvailableTooltip: return "スプリット編集時の「変数」タブでカスタム変数を定義できます。追加のカスタム変数は自動スプリッターが自動的に提供する場合があります。"; + case Label.HotkeyButtonTooltip: return "クリックしてホットキーを記録します。ゲームパッドのボタンも使用できます。グローバルホットキーは現在利用できません。ゲームパッドのボタンはグローバルに動作します。"; + case Label.ServerConnect: return "接続"; + case Label.ServerDisconnect: return "切断"; + case Label.ServerConnecting: return "接続中..."; + case Label.ServerDisconnecting: return "切断中..."; + case Label.ConnectToServerTitle: return "サーバーに接続"; + case Label.ConnectToServerDescription: return "WebSocket URL を指定してください:"; + case Label.Connect: return "接続"; + case Label.UpdateAvailable: return "LiveSplit One の新しいバージョンがあります。ここをクリックして再読み込みしてください。"; + case Label.UnsavedChangesBeforeUnload: return "未保存の変更があります。本当に LiveSplit One を閉じますか?"; + case Label.OpenSidebarAriaLabel: return "サイドバーを開く"; + case Label.FailedToSaveLayout: return "レイアウトの保存に失敗しました。"; + case Label.FailedToSaveHotkeys: return "ホットキー設定の保存に失敗しました。"; + case Label.FailedToSaveGeneralSettings: return "一般設定の保存に失敗しました。"; + case Label.FailedToSaveSplits: return "スプリットの保存に失敗しました。"; + case Label.LayoutCouldNotBeLoaded: return "レイアウトを読み込めませんでした。LiveSplit または LiveSplit One の有効なレイアウトではない可能性があります。"; + case Label.EmptySplitsNotSupported: return "空のスプリットはサポートされていません。"; + case Label.BugEncountered: return "バグが発生しました:"; + case Label.PleaseReportIssueStart: return "この問題は"; + case Label.ReportHere: return "こちら"; + case Label.PleaseReportIssueEnd: return "に報告してください。"; + case Label.BugReportInstructions: return "この問題の修正に役立つよう、再現手順を記載し、問題が発生したときに使用していたスプリットとレイアウトを添付してください。"; + case Label.LoadFailedPrivateBrowsing: return "LiveSplit One を読み込めませんでした。\nプライベートブラウジングを使用している可能性があります。\nブラウザのプライベートブラウジングの制限により、LiveSplit One はスプリット、レイアウト、その他の設定を保存できません。\nこれらの制限は将来解除される可能性があります。\n今すぐ LiveSplit One を使うには、設定でプライベートブラウジングを無効にしてください。"; + case Label.LoadFailedOutdatedBrowser: return "LiveSplit One を読み込めませんでした。\nブラウザが最新でない可能性があります。\nブラウザまたは iOS のバージョンを更新して、もう一度お試しください。\n別の原因として、広告ブロッカーなどのブラウザ拡張機能が重要なスクリプトへのアクセスをブロックしている可能性があります。"; + } +} diff --git a/src/localization/korean.ts b/src/localization/korean.ts new file mode 100644 index 000000000..d3c4079a8 --- /dev/null +++ b/src/localization/korean.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveKorean(text: Label): string { + switch (text) { + case Label.Ok: return "확인"; + case Label.Cancel: return "취소"; + case Label.Settings: return "설정"; + case Label.Language: return "언어"; + case Label.LanguageDescription: return "애플리케이션에서 사용되는 언어를 설정합니다."; + case Label.LanguageAuto: return "자동"; + case Label.HotkeysHeading: return "단축키"; + case Label.GeneralHeading: return "일반"; + case Label.NetworkHeading: return "네트워크"; + case Label.FrameRate: return "프레임률"; + case Label.FrameRateDescription: return "타이머를 표시할 프레임률을 결정합니다. “배터리 고려”는 기기 유형과 충전 상태를 판단해 적절한 프레임률을 선택합니다. “화면에 맞춤”은 타이머를 화면의 새로 고침 빈도에 맞춥니다."; + case Label.FrameRateBatteryAware: return "배터리 고려"; + case Label.FrameRateMatchScreen: return "화면에 맞춤"; + case Label.SaveOnReset: return "리셋 시 저장"; + case Label.SaveOnResetDescription: return "타이머를 리셋할 때 스플릿을 자동으로 저장할지 여부를 결정합니다."; + case Label.ShowControlButtons: return "제어 버튼 표시"; + case Label.ShowControlButtonsDescription: return "타이머 아래에 제어 버튼을 표시할지 여부를 결정합니다. 비활성화하면 단축키를 사용해야 합니다."; + case Label.ShowManualGameTimeInput: return "수동 게임 시간 입력 표시"; + case Label.ShowManualGameTimeInputDescription: return "타이머 아래에 게임 시간을 수동으로 입력할 수 있는 텍스트 상자를 표시합니다. 텍스트 상자에서 Enter 키를 눌러 타이머를 시작하고 스플릿을 진행합니다. “Game Time”과 비교하도록 하세요."; + case Label.ManualGameTimeMode: return "수동 게임 시간 모드"; + case Label.ManualGameTimeModeDescription: return "수동 게임 시간을 세그먼트 시간으로 입력할지 스플릿 시간으로 입력할지 결정합니다."; + case Label.ManualGameTimeModeSegmentTimes: return "세그먼트 시간"; + case Label.ManualGameTimeModeSplitTimes: return "스플릿 시간"; + case Label.AlwaysOnTop: return "항상 위"; + case Label.AlwaysOnTopDescription: return "창을 항상 다른 창 위에 표시합니다."; + case Label.SpeedrunComIntegration: return "Speedrun.com 통합"; + case Label.SpeedrunComIntegrationDescription: return "speedrun.com에서 게임, 카테고리, 리더보드 목록을 조회합니다."; + case Label.ServerConnection: return "서버 연결"; + case Label.ServerConnectionDescription: return "WebSocket 서버에 연결하여 다양한 명령을 전송함으로써 타이머를 제어할 수 있습니다. 현재 명령은 원래 LiveSplit이 지원하는 명령의 일부입니다."; + case Label.ServerConnectionExperimental: return "이 기능은 실험적이며 프로토콜은 향후 변경될 가능성이 있습니다."; + case Label.HotkeyAlreadyInUse: return "해당 단축키는 이미 사용 중입니다."; + case Label.Start: return "시작"; + case Label.Resume: return "재개"; + case Label.Pause: return "일시정지"; + case Label.UndoSplit: return "스플릿 되돌리기"; + case Label.Reset: return "리셋"; + case Label.SkipSplit: return "스플릿 건너뛰기"; + case Label.ManualGameTimePlaceholder: return "수동 게임 시간"; + case Label.LiveSplitLogoAlt: return "LiveSplit 로고"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "스플릿"; + case Label.Layout: return "레이아웃"; + case Label.CompareAgainst: return "비교 기준"; + case Label.RealTime: return "실시간"; + case Label.GameTime: return "게임 시간"; + case Label.PopOut: return "팝아웃"; + case Label.About: return "정보"; + case Label.Back: return "뒤로"; + case Label.AboutVersionPrefix: return "버전:"; + case Label.AboutDescription: return "LiveSplit One은 LiveSplit의 멀티플랫폼 버전으로, 스피드러너를 위한 세련되고 높은 사용자 지정이 가능한 타이머입니다."; + case Label.AboutViewSource: return "GitHub에서 소스 코드 보기"; + case Label.AboutRecentChanges: return "최근 변경 사항"; + case Label.AboutContributors: return "기여자"; + case Label.Loading: return "불러오는 중..."; + case Label.Add: return "추가"; + case Label.Import: return "가져오기"; + case Label.OpenSplits: return "스플릿 열기"; + case Label.EditSplits: return "스플릿 편집"; + case Label.ExportSplits: return "스플릿 내보내기"; + case Label.CopySplits: return "스플릿 복사"; + case Label.RemoveSplits: return "스플릿 삭제"; + case Label.Untitled: return "제목 없음"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "변경 사항을 버릴까요?"; + case Label.DiscardChangesDescription: return "현재 스플릿에 저장되지 않은 변경 사항이 있습니다. 계속 진행하여 변경 사항을 버릴까요?"; + case Label.DeleteSplitsTitle: return "스플릿을 삭제할까요?"; + case Label.DeleteSplitsDescription: return "스플릿을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."; + case Label.SaveBestTimesTitle: return "최고 기록을 저장할까요?"; + case Label.SaveBestTimesDescription: return "일부 최고 기록을 갱신했습니다. 업데이트할까요?"; + case Label.Yes: return "예"; + case Label.No: return "아니요"; + case Label.DontReset: return "리셋 안 함"; + case Label.FailedToExportSplits: return "스플릿 내보내기에 실패했습니다."; + case Label.CantImportEmptySplits: return "빈 스플릿은 가져올 수 없습니다."; + case Label.FailedToReadFile: return "파일을 읽지 못했습니다:"; + case Label.FailedToImportSplits: return "스플릿 가져오기에 실패했습니다:"; + case Label.CouldNotParseSplits: return "스플릿을 파싱할 수 없습니다."; + case Label.LoadedSplitsInvalid: return "불러온 스플릿이 유효하지 않습니다."; + case Label.NewSegmentName: return "시간"; + case Label.EditWhileRunningError: return "타이머가 실행 중일 때는 스플릿을 편집할 수 없습니다."; + case Label.Edit: return "편집"; + case Label.Save: return "저장"; + case Label.Export: return "내보내기"; + case Label.FailedToParseTimeSpan: return "TimeSpan을 파싱할 수 없습니다"; + case Label.Default: return "기본"; + case Label.Game: return "게임"; + case Label.Category: return "카테고리"; + case Label.StartTimerAt: return "타이머 시작 시간"; + case Label.Attempts: return "시도 횟수"; + case Label.SplitsEditor: return "스플릿 편집기"; + case Label.Variables: return "변수"; + case Label.Rules: return "규칙"; + case Label.Leaderboard: return "리더보드"; + case Label.InsertAbove: return "위에 삽입"; + case Label.InsertBelow: return "아래에 삽입"; + case Label.RemoveSegment: return "세그먼트 삭제"; + case Label.MoveUp: return "위로"; + case Label.MoveDown: return "아래로"; + case Label.AddVariable: return "변수 추가"; + case Label.OpenPbPage: return "PB 페이지 열기"; + case Label.AssociateRun: return "런 연결"; + case Label.Icon: return "아이콘"; + case Label.SegmentName: return "세그먼트 이름"; + case Label.SplitTime: return "스플릿 시간"; + case Label.SegmentTime: return "세그먼트 시간"; + case Label.BestSegment: return "최고 세그먼트"; + case Label.SpeedrunComVariableTooltip: return "게임에 대한 speedrun.com 변수입니다."; + case Label.Region: return "지역"; + case Label.RegionDescription: return "플레이 중인 게임의 지역입니다."; + case Label.Platform: return "플랫폼"; + case Label.PlatformDescription: return "게임을 플레이하는 플랫폼입니다."; + case Label.UsesEmulator: return "에뮬레이터 사용"; + case Label.UsesEmulatorDescription: return "에뮬레이터 사용 여부입니다."; + case Label.CustomVariableTooltip: return "사용자가 지정한 변수입니다. 텍스트 구성 요소로 표시할 수 있습니다."; + case Label.NoVariables: return "이 게임에는 현재 사용자 지정 변수가 없습니다."; + case Label.NoVariablesWithSpeedrunCom: return "이 게임에는 speedrun.com 변수 또는 사용자 지정 변수가 없습니다."; + case Label.TimedWithoutLoads: return "로드 시간을 제외하여 측정됩니다"; + case Label.TimedWithGameTime: return "게임 시간으로 측정됩니다"; + case Label.RequireVideoProof: return "영상 증명이 필요합니다"; + case Label.RunsOfThisGamePrefix: return "이 게임의 런은 "; + case Label.RunsOfThisGameSuffix: return "입니다."; + case Label.And: return "및"; + case Label.SetIcon: return "아이콘 설정"; + case Label.SetIconDescription: return "이미지 파일을 선택해 게임 아이콘으로 설정합니다. 일부 형식은 지원되지 않을 수 있습니다."; + case Label.DownloadBoxArt: return "박스 아트 다운로드"; + case Label.DownloadBoxArtDescription: return "speedrun.com에서 박스 아트를 다운로드하여 게임 아이콘으로 설정합니다."; + case Label.DownloadIcon: return "아이콘 다운로드"; + case Label.DownloadIconDescription: return "speedrun.com에서 게임 아이콘을 다운로드합니다."; + case Label.RemoveIcon: return "아이콘 제거"; + case Label.RemoveIconDescription: return "게임 아이콘을 제거합니다."; + case Label.CleaningMenu: return "정리…"; + case Label.ClearOnlyHistory: return "기록만 지우기"; + case Label.ClearOnlyHistoryDescription: return "모든 런의 기록을 지웁니다. PB, 최고 세그먼트, 비교에는 영향이 없습니다."; + case Label.ClearAllTimes: return "모든 시간 지우기"; + case Label.ClearAllTimesDescription: return "모든 시간과 기록을 제거하여 스플릿을 초기 상태로 만듭니다."; + case Label.CleanSumOfBest: return "베스트 합계 정리"; + case Label.CleanSumOfBestDescription: return "세그먼트 기록의 문제를 제거해 베스트 세그먼트 합계의 정확성을 개선합니다."; + case Label.ComparisonsMenu: return "비교…"; + case Label.AddComparison: return "비교 추가"; + case Label.AddComparisonDescription: return "시간을 저장할 수 있는 사용자 지정 비교를 추가합니다."; + case Label.ImportComparison: return "비교 가져오기"; + case Label.ImportComparisonDescription: return "스플릿 파일의 PB를 비교로 가져옵니다."; + case Label.GenerateGoalComparison: return "목표 비교 생성"; + case Label.GenerateGoalComparisonDescription: return "목표 시간에 기반한 비교를 생성합니다."; + case Label.CopyComparison: return "비교 복사"; + case Label.CopyComparisonDescription: return "기존 비교를 새 사용자 지정 비교로 복사합니다."; + case Label.SetSegmentIcon: return "아이콘 설정"; + case Label.SetSegmentIconDescription: return "이미지 파일을 선택해 세그먼트 아이콘으로 설정합니다."; + case Label.RemoveSegmentIcon: return "아이콘 제거"; + case Label.RemoveSegmentIconDescription: return "세그먼트 아이콘을 제거합니다."; + case Label.Rename: return "이름 변경"; + case Label.RenameDescription: return "사용자 지정 비교의 새 이름을 선택합니다. 예약되거나 중복된 이름은 사용할 수 없습니다."; + case Label.CopyAction: return "복사"; + case Label.CopyDescription: return "사용자 지정 비교의 복사본을 만듭니다."; + case Label.ACopy: return "복사본"; + case Label.Remove: return "제거"; + case Label.RemoveDescription: return "사용자 지정 비교를 제거합니다."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "추가할 비교의 이름을 입력하세요:"; + case Label.ComparisonAddError: return "비교를 추가할 수 없습니다. 중복이거나 예약된 이름일 수 있습니다."; + case Label.ImportComparisonPrompt: return "가져올 비교의 이름을 입력하세요:"; + case Label.GenerateGoalComparisonPrompt: return "달성할 시간을 입력하세요:"; + case Label.Generate: return "생성"; + case Label.GenerateGoalComparisonError: return "목표 비교 생성에 실패했습니다. 유효한 시간을 입력하세요."; + case Label.CopyComparisonPrompt: return "복사할 비교의 이름을 입력하세요:"; + case Label.CopyComparisonError: return "비교 복사에 실패했습니다. 비교가 없을 수 있습니다."; + case Label.NothingToCleanUp: return "정리할 항목이 없습니다."; + case Label.CleanPrompt: return "정리할까요?"; + case Label.AssociateRunPrompt: return "speedrun.com 런 ID 또는 URL을 입력하세요:"; + case Label.Associate: return "연결"; + case Label.InvalidSpeedrunUrl: return "speedrun.com ID 또는 URL이 잘못되었습니다."; + case Label.AssociateRunError: return "런을 연결할 수 없습니다. ID가 잘못되었을 수 있습니다."; + case Label.AddVariablePrompt: return "추가할 사용자 지정 변수 이름을 입력하세요:"; + case Label.RenameComparison: return "비교 이름 변경"; + case Label.RenameComparisonPrompt: return "새 비교 이름을 입력하세요:"; + case Label.ComparisonRenameError: return "비교 이름을 변경할 수 없습니다. 중복이거나 예약된 이름일 수 있습니다."; + case Label.GameNotFound: return "게임을 찾을 수 없습니다."; + case Label.NoBoxArt: return "이 게임에는 박스 아트가 없습니다."; + case Label.DownloadBoxArtError: return "박스 아트 다운로드에 실패했습니다."; + case Label.NoGameIcon: return "이 게임에는 아이콘이 없습니다."; + case Label.DownloadIconError: return "아이콘 다운로드에 실패했습니다."; + case Label.Rank: return "순위"; + case Label.Player: return "플레이어"; + case Label.Time: return "시간"; + case Label.Date: return "날짜:"; + case Label.Emulator: return "에뮬레이터"; + case Label.EmulatorTag: return "에뮬레이터"; + case Label.ObsoleteRuns: return "오래된 기록"; + case Label.Shown: return "표시"; + case Label.Hidden: return "숨김"; + case Label.OpenLeaderboard: return "리더보드 열기"; + case Label.Filters: return "필터"; + case Label.LayoutEditor: return "레이아웃 편집기"; + case Label.Component: return "컴포넌트"; + case Label.AddComponent: return "컴포넌트 추가"; + case Label.RemoveComponent: return "컴포넌트 제거"; + case Label.DuplicateComponent: return "컴포넌트 복제"; + case Label.MoveComponentUp: return "컴포넌트 위로"; + case Label.MoveComponentDown: return "컴포넌트 아래로"; + case Label.ComponentTitle: return "제목"; + case Label.ComponentTitleDescription: return "게임/카테고리, 아이콘, 시도 횟수, 완주 횟수를 표시합니다."; + case Label.ComponentGraph: return "그래프"; + case Label.ComponentGraphDescription: return "전체 스플릿에 걸친 비교 대비 앞/뒤를 표시합니다."; + case Label.ComponentSplitsDescription: return "스플릿 시간의 주요 구성 요소입니다. 표 형식으로 스크롤할 수 있습니다."; + case Label.ComponentDetailedTimer: return "상세 타이머"; + case Label.ComponentDetailedTimerDescription: return "전체 시간과 현재 세그먼트 시간을 표시합니다."; + case Label.ComponentTimer: return "타이머"; + case Label.ComponentTimerDescription: return "전체 시간을 디지털로 표시하며, 색상은 비교 결과에 따라 결정됩니다."; + case Label.ComponentCurrentComparison: return "현재 비교"; + case Label.ComponentCurrentComparisonDescription: return "현재 비교의 이름을 표시합니다."; + case Label.ComponentCurrentPace: return "현재 페이스"; + case Label.ComponentCurrentPaceDescription: return "선택된 비교를 기반으로 최종 시간을 예측합니다."; + case Label.ComponentDelta: return "차이"; + case Label.ComponentDeltaDescription: return "비교 대비 앞섬/뒤처짐을 표시합니다."; + case Label.ComponentPbChance: return "PB 가능성"; + case Label.ComponentPbChanceDescription: return "PB를 갱신할 가능성을 표시합니다."; + case Label.ComponentPossibleTimeSave: return "가능한 시간 절약"; + case Label.ComponentPossibleTimeSaveDescription: return "현재 세그먼트에서 절약 가능한 시간을 표시합니다."; + case Label.ComponentPreviousSegment: return "이전 세그먼트"; + case Label.ComponentPreviousSegmentDescription: return "이전 세그먼트의 증가/감소와 잠재적 절약을 표시합니다."; + case Label.ComponentSegmentTime: return "세그먼트 시간"; + case Label.ComponentSegmentTimeDescription: return "선택된 비교의 세그먼트 시간을 표시합니다."; + case Label.ComponentSumOfBest: return "최고 합계"; + case Label.ComponentSumOfBestDescription: return "기록을 기반으로 가장 빠른 완주 시간을 표시합니다."; + case Label.ComponentText: return "텍스트"; + case Label.ComponentTextDescription: return "중앙/좌우 텍스트와 사용자 지정 변수를 표시합니다."; + case Label.ComponentTotalPlaytime: return "총 플레이 시간"; + case Label.ComponentTotalPlaytimeDescription: return "카테고리의 총 플레이 시간을 표시합니다."; + case Label.ComponentVariableDescription: return "사용자 지정 변수 “{name}”의 값을 표시하는 텍스트를 만듭니다."; + case Label.ComponentBlankSpace: return "빈 공간"; + case Label.ComponentBlankSpaceDescription: return "배경만 있는 빈 컴포넌트입니다."; + case Label.ComponentSeparator: return "구분선"; + case Label.ComponentSeparatorDescription: return "컴포넌트 사이의 구분선을 표시합니다."; + case Label.AccuracySeconds: return "초"; + case Label.AccuracyTenths: return "0.1초"; + case Label.AccuracyHundredths: return "0.01초"; + case Label.AccuracyMilliseconds: return "밀리초"; + case Label.FontStyle: return "스타일"; + case Label.FontWeight: return "굵기"; + case Label.FontStretch: return "늘림"; + case Label.FontStyleNormal: return "보통"; + case Label.FontStyleItalic: return "이탤릭"; + case Label.AlignmentAutomatic: return "자동"; + case Label.AlignmentLeft: return "왼쪽"; + case Label.AlignmentCenter: return "가운데"; + case Label.GradientTransparent: return "투명"; + case Label.GradientPlain: return "단색"; + case Label.GradientVertical: return "수직"; + case Label.GradientHorizontal: return "수평"; + case Label.GradientAlternating: return "교대"; + case Label.GradientPlainDelta: return "단색 차이"; + case Label.GradientVerticalDelta: return "수직 차이"; + case Label.GradientHorizontalDelta: return "수평 차이"; + case Label.LayoutBackgroundImage: return "이미지"; + case Label.LayoutBackgroundBrightness: return "밝기"; + case Label.LayoutBackgroundOpacity: return "불투명도"; + case Label.LayoutBackgroundBlur: return "흐림"; + case Label.LayoutDirectionVertical: return "수직"; + case Label.LayoutDirectionHorizontal: return "수평"; + case Label.ColumnKindTime: return "시간"; + case Label.ColumnKindVariable: return "변수"; + case Label.ColumnStartWithEmpty: return "비어 있음"; + case Label.ColumnStartWithComparisonTime: return "비교 시간"; + case Label.ColumnStartWithComparisonSegmentTime: return "비교 세그먼트 시간"; + case Label.ColumnStartWithPossibleTimeSave: return "절약 가능한 시간"; + case Label.ColumnUpdateWithDontUpdate: return "업데이트 안 함"; + case Label.ColumnUpdateWithSplitTime: return "스플릿 시간"; + case Label.ColumnUpdateWithDelta: return "앞섬/뒤처짐"; + case Label.ColumnUpdateWithDeltaWithFallback: return "앞섬/뒤처짐 (비어 있으면 스플릿 시간)"; + case Label.ColumnUpdateWithSegmentTime: return "세그먼트 시간"; + case Label.ColumnUpdateWithSegmentDelta: return "절약/손실 시간"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "절약/손실 시간 (비어 있으면 세그먼트 시간)"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "세그먼트 시작 시"; + case Label.ColumnUpdateTriggerContextual: return "상황에 따라"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "세그먼트 종료 시"; + case Label.ComparisonCurrentComparison: return "현재 비교"; + case Label.CustomVariableNoneAvailable: return "사용 가능한 변수가 없습니다"; + case Label.CustomVariableNoneAvailableTooltip: return "스플릿 편집의 변수 탭에서 사용자 지정 변수를 정의할 수 있습니다. 추가 사용자 지정 변수는 자동 분할기가 자동으로 제공할 수 있습니다."; + case Label.HotkeyButtonTooltip: return "클릭하여 단축키를 기록합니다. 게임패드 버튼도 사용할 수 있습니다. 전역 단축키는 현재 불가능합니다. 게임패드 버튼은 전역으로 동작합니다."; + case Label.ServerConnect: return "연결"; + case Label.ServerDisconnect: return "연결 해제"; + case Label.ServerConnecting: return "연결 중..."; + case Label.ServerDisconnecting: return "연결 해제 중..."; + case Label.ConnectToServerTitle: return "서버에 연결"; + case Label.ConnectToServerDescription: return "WebSocket URL을 지정하세요:"; + case Label.Connect: return "연결"; + case Label.UpdateAvailable: return "새 버전의 LiveSplit One을 사용할 수 있습니다! 여기를 클릭하여 다시 로드하세요."; + case Label.UnsavedChangesBeforeUnload: return "저장되지 않은 변경 사항이 있습니다. LiveSplit One을 정말로 닫으시겠습니까?"; + case Label.OpenSidebarAriaLabel: return "사이드바 열기"; + case Label.FailedToSaveLayout: return "레이아웃을 저장하지 못했습니다."; + case Label.FailedToSaveHotkeys: return "단축키 설정을 저장하지 못했습니다."; + case Label.FailedToSaveGeneralSettings: return "일반 설정을 저장하지 못했습니다."; + case Label.FailedToSaveSplits: return "스플릿을 저장하지 못했습니다."; + case Label.LayoutCouldNotBeLoaded: return "레이아웃을 불러올 수 없습니다. 유효한 LiveSplit 또는 LiveSplit One 레이아웃이 아닐 수 있습니다."; + case Label.EmptySplitsNotSupported: return "빈 스플릿은 지원되지 않습니다."; + case Label.BugEncountered: return "버그가 발생했습니다:"; + case Label.PleaseReportIssueStart: return "이 문제를 "; + case Label.ReportHere: return "여기"; + case Label.PleaseReportIssueEnd: return "로 신고해 주세요."; + case Label.BugReportInstructions: return "이 문제를 해결하는 데 도움이 되도록 재현 절차를 포함하고 문제가 발생했을 때 사용하던 스플릿과 레이아웃을 첨부해 주세요."; + case Label.LoadFailedPrivateBrowsing: return "LiveSplit One을 불러올 수 없습니다.\n시크릿/프라이빗 브라우징 모드일 수 있습니다.\n브라우저의 프라이빗 모드 제한으로 인해 LiveSplit One은 스플릿, 레이아웃 또는 다른 설정을 저장할 수 없습니다.\n이 제한은 향후 해제될 수 있습니다.\n지금 LiveSplit One을 사용하려면 설정에서 프라이빗 브라우징을 비활성화해 주세요."; + case Label.LoadFailedOutdatedBrowser: return "LiveSplit One을 불러올 수 없습니다.\n브라우저가 최신 버전이 아닐 수 있습니다.\n브라우저 또는 iOS 버전을 업데이트한 후 다시 시도해 주세요.\n또 다른 이유로는 광고 차단기 같은 브라우저 확장 프로그램이 중요한 스크립트에 대한 접근을 차단하고 있을 수 있습니다."; + } +} diff --git a/src/localization/polish.ts b/src/localization/polish.ts new file mode 100644 index 000000000..42b74b5f1 --- /dev/null +++ b/src/localization/polish.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolvePolish(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Anuluj"; + case Label.Settings: return "Ustawienia"; + case Label.Language: return "Język"; + case Label.LanguageDescription: return "Ustawia język używany w aplikacji."; + case Label.LanguageAuto: return "Automatyczny"; + case Label.HotkeysHeading: return "Skróty klawiszowe"; + case Label.GeneralHeading: return "Ogólne"; + case Label.NetworkHeading: return "Sieć"; + case Label.FrameRate: return "Liczba klatek"; + case Label.FrameRateDescription: return "Określa liczbę klatek, z jaką wyświetlany jest timer. „Uwzględnia baterię” próbuje określić typ urządzenia i stan ładowania, aby dobrać odpowiednią liczbę klatek. „Dopasuj do ekranu” sprawia, że timer dopasowuje się do częstotliwości odświeżania ekranu."; + case Label.FrameRateBatteryAware: return "Uwzględnia baterię"; + case Label.FrameRateMatchScreen: return "Dopasuj do ekranu"; + case Label.SaveOnReset: return "Zapisuj przy resecie"; + case Label.SaveOnResetDescription: return "Określa, czy automatycznie zapisywać splity podczas resetowania timera."; + case Label.ShowControlButtons: return "Pokaż przyciski sterowania"; + case Label.ShowControlButtonsDescription: return "Określa, czy pokazywać przyciski pod timerem pozwalające nim sterować. Gdy wyłączone, musisz używać skrótów klawiszowych."; + case Label.ShowManualGameTimeInput: return "Pokaż ręczne wprowadzanie czasu gry"; + case Label.ShowManualGameTimeInputDescription: return "Pokazuje pole tekstowe pod timerem, które pozwala ręcznie wprowadzać czas gry. Uruchamiasz timer i robisz splity, naciskając Enter w polu tekstowym. Upewnij się, że porównujesz z „Czasem gry”."; + case Label.ManualGameTimeMode: return "Tryb ręcznego czasu gry"; + case Label.ManualGameTimeModeDescription: return "Określa, czy ręcznie wprowadzany czas gry ma być czasem segmentów czy czasem splitów."; + case Label.ManualGameTimeModeSegmentTimes: return "Czasy segmentów"; + case Label.ManualGameTimeModeSplitTimes: return "Czasy splitów"; + case Label.AlwaysOnTop: return "Zawsze na wierzchu"; + case Label.AlwaysOnTopDescription: return "Utrzymuje okno zawsze na wierzchu innych okien."; + case Label.SpeedrunComIntegration: return "Integracja ze speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Pobiera listę gier, kategorii i rankingi ze speedrun.com."; + case Label.ServerConnection: return "Połączenie z serwerem"; + case Label.ServerConnectionDescription: return "Pozwala połączyć się z serwerem WebSocket, który może sterować timerem poprzez wysyłanie różnych poleceń. Polecenia są obecnie podzbiorem poleceń obsługiwanych przez oryginalny LiveSplit."; + case Label.ServerConnectionExperimental: return "Ta funkcja jest eksperymentalna i protokół prawdopodobnie zmieni się w przyszłości."; + case Label.HotkeyAlreadyInUse: return "Ten skrót klawiszowy jest już używany."; + case Label.Start: return "Start"; + case Label.Resume: return "Wznów"; + case Label.Pause: return "Pauza"; + case Label.UndoSplit: return "Cofnij split"; + case Label.Reset: return "Reset"; + case Label.SkipSplit: return "Pomiń split"; + case Label.ManualGameTimePlaceholder: return "Ręczny czas gry"; + case Label.LiveSplitLogoAlt: return "Logo LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splity"; + case Label.Layout: return "Układ"; + case Label.CompareAgainst: return "Porównaj z"; + case Label.RealTime: return "Czas rzeczywisty"; + case Label.GameTime: return "Czas gry"; + case Label.PopOut: return "Otwórz w oknie"; + case Label.About: return "O programie"; + case Label.Back: return "Wstecz"; + case Label.AboutVersionPrefix: return "Wersja:"; + case Label.AboutDescription: return "LiveSplit One to wieloplatformowa wersja LiveSplit — zgrabnego i bardzo konfigurowalnego timera dla speedrunnerów."; + case Label.AboutViewSource: return "Zobacz kod źródłowy na GitHubie"; + case Label.AboutRecentChanges: return "Ostatnie zmiany"; + case Label.AboutContributors: return "Współtwórcy"; + case Label.Loading: return "Wczytywanie..."; + case Label.Add: return "Dodaj"; + case Label.Import: return "Importuj"; + case Label.OpenSplits: return "Otwórz splity"; + case Label.EditSplits: return "Edytuj splity"; + case Label.ExportSplits: return "Eksportuj splity"; + case Label.CopySplits: return "Kopiuj splity"; + case Label.RemoveSplits: return "Usuń splity"; + case Label.Untitled: return "Bez tytułu"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Odrzucić zmiany?"; + case Label.DiscardChangesDescription: return "Twoje bieżące splity zostały zmodyfikowane i zawierają niezapisane zmiany. Czy chcesz kontynuować i je odrzucić?"; + case Label.DeleteSplitsTitle: return "Usunąć splity?"; + case Label.DeleteSplitsDescription: return "Czy na pewno chcesz usunąć splity? Tej operacji nie można cofnąć."; + case Label.SaveBestTimesTitle: return "Zapisać najlepsze czasy?"; + case Label.SaveBestTimesDescription: return "Pobiłeś/aś niektóre z najlepszych czasów. Czy chcesz je zaktualizować?"; + case Label.Yes: return "Tak"; + case Label.No: return "Nie"; + case Label.DontReset: return "Nie resetuj"; + case Label.FailedToExportSplits: return "Nie udało się wyeksportować splitów."; + case Label.CantImportEmptySplits: return "Nie można importować pustych splitów."; + case Label.FailedToReadFile: return "Nie udało się odczytać pliku:"; + case Label.FailedToImportSplits: return "Nie udało się zaimportować splitów:"; + case Label.CouldNotParseSplits: return "Nie udało się przetworzyć splitów."; + case Label.LoadedSplitsInvalid: return "Załadowane splity są nieprawidłowe."; + case Label.NewSegmentName: return "Czas"; + case Label.EditWhileRunningError: return "Nie możesz edytować splitów, gdy timer działa."; + case Label.Edit: return "Edytuj"; + case Label.Save: return "Zapisz"; + case Label.Export: return "Eksportuj"; + case Label.FailedToParseTimeSpan: return "Nie udało się przetworzyć TimeSpan"; + case Label.Default: return "Domyślne"; + case Label.Game: return "Gra"; + case Label.Category: return "Kategoria"; + case Label.StartTimerAt: return "Uruchom timer od"; + case Label.Attempts: return "Próby"; + case Label.SplitsEditor: return "Edytor splitów"; + case Label.Variables: return "Zmienne"; + case Label.Rules: return "Zasady"; + case Label.Leaderboard: return "Ranking"; + case Label.InsertAbove: return "Wstaw powyżej"; + case Label.InsertBelow: return "Wstaw poniżej"; + case Label.RemoveSegment: return "Usuń segment"; + case Label.MoveUp: return "Przenieś w górę"; + case Label.MoveDown: return "Przenieś w dół"; + case Label.AddVariable: return "Dodaj zmienną"; + case Label.OpenPbPage: return "Otwórz stronę PB"; + case Label.AssociateRun: return "Powiąż bieg"; + case Label.Icon: return "Ikona"; + case Label.SegmentName: return "Nazwa segmentu"; + case Label.SplitTime: return "Czas splitu"; + case Label.SegmentTime: return "Czas segmentu"; + case Label.BestSegment: return "Najlepszy segment"; + case Label.SpeedrunComVariableTooltip: return "Zmienna speedrun.com specyficzna dla gry."; + case Label.Region: return "Region"; + case Label.RegionDescription: return "Region gry, która jest rozgrywana."; + case Label.Platform: return "Platforma"; + case Label.PlatformDescription: return "Platforma, na której grana jest gra."; + case Label.UsesEmulator: return "Używa emulatora"; + case Label.UsesEmulatorDescription: return "Czy do grania używany jest emulator."; + case Label.CustomVariableTooltip: return "Niestandardowa zmienna określona przez ciebie. Można ją wyświetlać za pomocą komponentu tekstowego."; + case Label.NoVariables: return "Obecnie brak niestandardowych zmiennych dla tej gry."; + case Label.NoVariablesWithSpeedrunCom: return "Obecnie brak zmiennych speedrun.com lub niestandardowych zmiennych dla tej gry."; + case Label.TimedWithoutLoads: return "są mierzone bez czasów ładowania"; + case Label.TimedWithGameTime: return "są mierzone z Czasem gry"; + case Label.RequireVideoProof: return "wymagają wideo jako dowodu"; + case Label.RunsOfThisGamePrefix: return "Biegi tej gry "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "i"; + case Label.SetIcon: return "Ustaw ikonę"; + case Label.SetIconDescription: return "Pozwala wybrać plik obrazu jako ikonę gry. Niektóre formaty mogą nie działać wszędzie."; + case Label.DownloadBoxArt: return "Pobierz okładkę"; + case Label.DownloadBoxArtDescription: return "Próbuje pobrać okładkę gry ze speedrun.com, aby ustawić ją jako ikonę gry."; + case Label.DownloadIcon: return "Pobierz ikonę"; + case Label.DownloadIconDescription: return "Próbuje pobrać ikonę gry ze speedrun.com."; + case Label.RemoveIcon: return "Usuń ikonę"; + case Label.RemoveIconDescription: return "Usuwa ikonę gry."; + case Label.CleaningMenu: return "Czyszczenie…"; + case Label.ClearOnlyHistory: return "Wyczyść tylko historię"; + case Label.ClearOnlyHistoryDescription: return "Splity przechowują pełną historię wszystkich biegów, w tym każdy czas segmentu. Te informacje są używane przez różne komponenty. Możesz je wyczyścić. Rekord osobisty, najlepsze czasy segmentów i porównania nie zostaną zmienione."; + case Label.ClearAllTimes: return "Wyczyść wszystkie czasy"; + case Label.ClearAllTimesDescription: return "Usuwa wszystkie czasy ze splitów, w tym całą historię, tak że splity są całkowicie puste, jakby zostały dopiero utworzone."; + case Label.CleanSumOfBest: return "Wyczyść sumę najlepszych"; + case Label.CleanSumOfBestDescription: return "Pozwala interaktywnie usunąć potencjalne problemy w historii segmentów, które prowadzą do nieprawidłowej sumy najlepszych segmentów. Jeśli pominiesz split, przy następnym splicie łączny czas segmentu może być szybszy niż suma najlepszych czasów poszczególnych segmentów. To wskaże wszystkie takie przypadki i pozwoli je usuwać pojedynczo, jeśli któreś z nich wydaje się błędne."; + case Label.ComparisonsMenu: return "Porównania…"; + case Label.AddComparison: return "Dodaj porównanie"; + case Label.AddComparisonDescription: return "Dodaje nowe niestandardowe porównanie, w którym możesz przechowywać dowolne czasy."; + case Label.ImportComparison: return "Importuj porównanie"; + case Label.ImportComparisonDescription: return "Importuje rekord osobisty z podanego pliku splitów jako porównanie."; + case Label.GenerateGoalComparison: return "Wygeneruj porównanie celu"; + case Label.GenerateGoalComparisonDescription: return "Generuje niestandardowe porównanie celu na podstawie docelowego czasu, który możesz podać. Czasy porównania są automatycznie zbalansowane na podstawie historii segmentów, tak aby w przybliżeniu odpowiadały czasom splitów dla docelowego czasu. Ponieważ są wypełniane na podstawie historii segmentów, docelowe czasy są ograniczone do zakresu między sumą najlepszych segmentów a sumą najgorszych segmentów. Porównanie jest wypełniane tylko dla wybranej metody pomiaru czasu. Czasy porównania dla drugiej metody nie są przez to modyfikowane, więc możesz wygenerować je ponownie, wybierając drugą metodę, aby wygenerować czasy porównania dla obu metod."; + case Label.CopyComparison: return "Kopiuj porównanie"; + case Label.CopyComparisonDescription: return "Kopiuje dowolne istniejące porównanie, w tym rekord osobisty lub nawet inne automatycznie dostarczone porównanie, jako nowe niestandardowe porównanie. Możesz na przykład użyć tego, aby zachować Ostatni bieg jako porównanie tak długo, jak chcesz."; + case Label.SetSegmentIcon: return "Ustaw ikonę"; + case Label.SetSegmentIconDescription: return "Pozwala wybrać plik obrazu jako ikonę segmentu. Niektóre formaty mogą nie działać wszędzie."; + case Label.RemoveSegmentIcon: return "Usuń ikonę"; + case Label.RemoveSegmentIconDescription: return "Usuwa ikonę segmentu."; + case Label.Rename: return "Zmień nazwę"; + case Label.RenameDescription: return "Wybierz nową nazwę dla niestandardowego porównania. Istnieją nazwy zastrzeżone, których nie można użyć. Nie można też mieć duplikatów."; + case Label.CopyAction: return "Kopiuj"; + case Label.CopyDescription: return "Tworzy kopię niestandardowego porównania."; + case Label.ACopy: return "Kopia"; + case Label.Remove: return "Usuń"; + case Label.RemoveDescription: return "Usuwa niestandardowe porównanie."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Podaj nazwę porównania, które chcesz dodać:"; + case Label.ComparisonAddError: return "Nie udało się dodać porównania. Może to być duplikat lub nazwa zastrzeżona."; + case Label.ImportComparisonPrompt: return "Podaj nazwę porównania, które chcesz zaimportować:"; + case Label.GenerateGoalComparisonPrompt: return "Podaj czas, który chcesz osiągnąć:"; + case Label.Generate: return "Generuj"; + case Label.GenerateGoalComparisonError: return "Nie udało się wygenerować porównania celu. Upewnij się, że podano prawidłowy czas."; + case Label.CopyComparisonPrompt: return "Podaj nazwę porównania, które chcesz skopiować:"; + case Label.CopyComparisonError: return "Nie udało się skopiować porównania. Porównanie może nie istnieć."; + case Label.NothingToCleanUp: return "Nie ma nic do wyczyszczenia."; + case Label.CleanPrompt: return "Wyczyścić?"; + case Label.AssociateRunPrompt: return "Podaj identyfikator speedrun.com lub URL biegu:"; + case Label.Associate: return "Powiąż"; + case Label.InvalidSpeedrunUrl: return "Nieprawidłowy identyfikator lub URL speedrun.com."; + case Label.AssociateRunError: return "Nie udało się powiązać biegu. Identyfikator może być nieprawidłowy."; + case Label.AddVariablePrompt: return "Podaj nazwę niestandardowej zmiennej, którą chcesz dodać:"; + case Label.RenameComparison: return "Zmień nazwę porównania"; + case Label.RenameComparisonPrompt: return "Podaj nową nazwę porównania:"; + case Label.ComparisonRenameError: return "Nie udało się zmienić nazwy porównania. Może to być duplikat lub nazwa zastrzeżona."; + case Label.GameNotFound: return "Nie udało się znaleźć gry."; + case Label.NoBoxArt: return "Gra nie ma okładki."; + case Label.DownloadBoxArtError: return "Nie udało się pobrać okładki."; + case Label.NoGameIcon: return "Gra nie ma ikony."; + case Label.DownloadIconError: return "Nie udało się pobrać ikony."; + case Label.Rank: return "Miejsce"; + case Label.Player: return "Gracz"; + case Label.Time: return "Czas"; + case Label.Date: return "Data:"; + case Label.Emulator: return "Emulator"; + case Label.EmulatorTag: return "Emulator"; + case Label.ObsoleteRuns: return "Nieaktualne biegi"; + case Label.Shown: return "Wyświetlane"; + case Label.Hidden: return "Ukryte"; + case Label.OpenLeaderboard: return "Otwórz ranking"; + case Label.Filters: return "Filtry"; + case Label.LayoutEditor: return "Edytor układu"; + case Label.Component: return "Komponent"; + case Label.AddComponent: return "Dodaj komponent"; + case Label.RemoveComponent: return "Usuń komponent"; + case Label.DuplicateComponent: return "Duplikuj komponent"; + case Label.MoveComponentUp: return "Przenieś komponent w górę"; + case Label.MoveComponentDown: return "Przenieś komponent w dół"; + case Label.ComponentTitle: return "Tytuł"; + case Label.ComponentTitleDescription: return "Pokazuje nazwę gry i kategorię, która jest rozgrywana. Dodatkowo można pokazać ikonę gry, liczbę prób oraz łączną liczbę pomyślnie ukończonych biegów."; + case Label.ComponentGraph: return "Wykres"; + case Label.ComponentGraphDescription: return "Wizualizuje, jak bardzo bieżący bieg był przed lub za wybranym porównaniem podczas całego biegu. Wszystkie pojedyncze delty są pokazane jako punkty na wykresie."; + case Label.ComponentSplitsDescription: return "Główny komponent do wizualizacji wszystkich czasów splitów. Każdy segment jest pokazany w tabeli z ikoną segmentu, nazwą segmentu, deltą względem wybranego porównania i czasem splitu. Lista zapewnia przewijanie, więc nie każdy segment musi być zawsze widoczny."; + case Label.ComponentDetailedTimer: return "Szczegółowy timer"; + case Label.ComponentDetailedTimerDescription: return "Pokazuje dwa timery: jeden dla łącznego czasu bieżącego biegu oraz drugi pokazujący czas bieżącego segmentu. Można też wyświetlać inne informacje, takie jak czasy segmentów dla maksymalnie dwóch porównań, ikonę segmentu i nazwę segmentu."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Pokazuje łączny czas bieżącego biegu jako zegar cyfrowy. Kolor wyświetlanego czasu zależy od tego, jak dobrze idzie bieżący bieg względem wybranego porównania."; + case Label.ComponentCurrentComparison: return "Bieżące porównanie"; + case Label.ComponentCurrentComparisonDescription: return "Pokazuje nazwę porównania, z którym timer aktualnie porównuje."; + case Label.ComponentCurrentPace: return "Bieżące tempo"; + case Label.ComponentCurrentPaceDescription: return "Pokazuje przewidywany końcowy czas bieżącego biegu. Pozostała część biegu jest przewidywana na podstawie wybranego porównania. Na przykład można wybrać porównanie „Najlepsze segmenty”, aby pokazać najlepszy możliwy czas końcowy bieżącego biegu na podstawie sumy najlepszych segmentów."; + case Label.ComponentDelta: return "Delta"; + case Label.ComponentDeltaDescription: return "Pokazuje, o ile bieżący bieg jest przed lub za wybranym porównaniem."; + case Label.ComponentPbChance: return "Szansa PB"; + case Label.ComponentPbChanceDescription: return "Pokazuje, jak prawdopodobne jest, że aktywny bieg pobije rekord osobisty. Jeśli nie ma aktywnego biegu, pokazuje ogólną szansę pobicia rekordu osobistego. W trakcie biegu dynamicznie się zmienia w zależności od tego, jak dobrze idzie bieg."; + case Label.ComponentPossibleTimeSave: return "Możliwa oszczędność czasu"; + case Label.ComponentPossibleTimeSaveDescription: return "Pokazuje, ile czasu można zaoszczędzić na bieżącym segmencie w porównaniu z wybranym porównaniem, na podstawie najlepszego czasu segmentu. Ten komponent umożliwia także pokazanie „Łącznej możliwej oszczędności czasu” dla pozostałej części bieżącego biegu."; + case Label.ComponentPreviousSegment: return "Poprzedni segment"; + case Label.ComponentPreviousSegmentDescription: return "Pokazuje, ile czasu zostało zaoszczędzonego lub straconego podczas poprzedniego segmentu na podstawie wybranego porównania. Dodatkowo można wyświetlić możliwą oszczędność czasu dla poprzedniego segmentu. Ten komponent przełącza się na widok „Bieżący segment”, który pokazuje aktywną stratę czasu, gdy tracisz czas na bieżącym segmencie."; + case Label.ComponentSegmentTime: return "Czas segmentu"; + case Label.ComponentSegmentTimeDescription: return "Pokazuje czas bieżącego segmentu dla wybranego porównania. Jeśli nie określono porównania, używa bieżącego porównania timera."; + case Label.ComponentSumOfBest: return "Suma najlepszych"; + case Label.ComponentSumOfBestDescription: return "Pokazuje najszybszy możliwy czas ukończenia biegu w bieżącej kategorii, na podstawie informacji zebranych ze wszystkich poprzednich biegów. Często odpowiada to sumie najlepszych czasów segmentów, ale nie zawsze, ponieważ pominięte segmenty mogą wprowadzać połączone segmenty szybsze niż rzeczywista suma najlepszych czasów segmentów. Nazwa jest więc nieco myląca, ale pozostała z powodów historycznych."; + case Label.ComponentText: return "Tekst"; + case Label.ComponentTextDescription: return "Pokazuje tekst, który określisz. Może to być pojedynczy tekst wyśrodkowany lub podzielony na lewy i prawy tekst, co pasuje do sytuacji, w której masz etykietę i wartość. Istnieje także opcja wyświetlenia niestandardowej zmiennej, którą określisz w edytorze splitów."; + case Label.ComponentTotalPlaytime: return "Łączny czas gry"; + case Label.ComponentTotalPlaytimeDescription: return "Pokazuje łączną ilość czasu, przez jaki grano w bieżącą kategorię."; + case Label.ComponentVariableDescription: return "Tworzy komponent tekstowy, który pokazuje wartość niestandardowej zmiennej „{name}”."; + case Label.ComponentBlankSpace: return "Pusta przestrzeń"; + case Label.ComponentBlankSpaceDescription: return "Pusty komponent, który nie pokazuje nic poza tłem. Służy głównie jako odstęp między innymi komponentami."; + case Label.ComponentSeparator: return "Separator"; + case Label.ComponentSeparatorDescription: return "Prosty komponent, który renderuje separator między komponentami."; + case Label.AccuracySeconds: return "Sekundy"; + case Label.AccuracyTenths: return "Dziesiąte"; + case Label.AccuracyHundredths: return "Setne"; + case Label.AccuracyMilliseconds: return "Milisekundy"; + case Label.FontStyle: return "Styl"; + case Label.FontWeight: return "Grubość"; + case Label.FontStretch: return "Rozciągnięcie"; + case Label.FontStyleNormal: return "Normalny"; + case Label.FontStyleItalic: return "Kursywa"; + case Label.AlignmentAutomatic: return "Automatyczne"; + case Label.AlignmentLeft: return "Lewo"; + case Label.AlignmentCenter: return "Środek"; + case Label.GradientTransparent: return "Przezroczysty"; + case Label.GradientPlain: return "Jednolity"; + case Label.GradientVertical: return "Pionowy"; + case Label.GradientHorizontal: return "Poziomy"; + case Label.GradientAlternating: return "Naprzemienny"; + case Label.GradientPlainDelta: return "Jednolita delta"; + case Label.GradientVerticalDelta: return "Pionowa delta"; + case Label.GradientHorizontalDelta: return "Pozioma delta"; + case Label.LayoutBackgroundImage: return "Obraz"; + case Label.LayoutBackgroundBrightness: return "Jasność"; + case Label.LayoutBackgroundOpacity: return "Krycie"; + case Label.LayoutBackgroundBlur: return "Rozmycie"; + case Label.LayoutDirectionVertical: return "Pionowy"; + case Label.LayoutDirectionHorizontal: return "Poziomy"; + case Label.ColumnKindTime: return "Czas"; + case Label.ColumnKindVariable: return "Zmienna"; + case Label.ColumnStartWithEmpty: return "Puste"; + case Label.ColumnStartWithComparisonTime: return "Czas porównania"; + case Label.ColumnStartWithComparisonSegmentTime: return "Czas segmentu porównania"; + case Label.ColumnStartWithPossibleTimeSave: return "Możliwa oszczędność czasu"; + case Label.ColumnUpdateWithDontUpdate: return "Nie aktualizuj"; + case Label.ColumnUpdateWithSplitTime: return "Czas splitu"; + case Label.ColumnUpdateWithDelta: return "Czas przed / za"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Czas przed / za lub czas splitu, jeśli pusty"; + case Label.ColumnUpdateWithSegmentTime: return "Czas segmentu"; + case Label.ColumnUpdateWithSegmentDelta: return "Czas zyskany / stracony"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Czas zyskany / stracony lub czas segmentu, jeśli pusty"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Przy rozpoczęciu segmentu"; + case Label.ColumnUpdateTriggerContextual: return "Kontekstowo"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Przy zakończeniu segmentu"; + case Label.ComparisonCurrentComparison: return "Bieżące porównanie"; + case Label.CustomVariableNoneAvailable: return "Brak dostępnych zmiennych"; + case Label.CustomVariableNoneAvailableTooltip: return "Zmienne niestandardowe można zdefiniować na karcie Zmienne podczas edycji splitów. Dodatkowe zmienne niestandardowe mogą być dostarczane automatycznie przez autosplity."; + case Label.HotkeyButtonTooltip: return "Kliknij, aby nagrać skrót klawiszowy. Możesz też używać przycisków pada. Globalne skróty klawiszowe są obecnie niemożliwe. Przyciski pada działają globalnie."; + case Label.ServerConnect: return "Połącz"; + case Label.ServerDisconnect: return "Rozłącz"; + case Label.ServerConnecting: return "Łączenie..."; + case Label.ServerDisconnecting: return "Rozłączanie..."; + case Label.ConnectToServerTitle: return "Połącz z serwerem"; + case Label.ConnectToServerDescription: return "Podaj adres URL WebSocket:"; + case Label.Connect: return "Połącz"; + case Label.UpdateAvailable: return "Dostępna jest nowa wersja LiveSplit One! Kliknij tutaj, aby przeładować."; + case Label.UnsavedChangesBeforeUnload: return "Masz niezapisane zmiany. Czy na pewno chcesz zamknąć LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Otwórz pasek boczny"; + case Label.FailedToSaveLayout: return "Nie udało się zapisać układu."; + case Label.FailedToSaveHotkeys: return "Nie udało się zapisać ustawień skrótów klawiszowych."; + case Label.FailedToSaveGeneralSettings: return "Nie udało się zapisać ustawień ogólnych."; + case Label.FailedToSaveSplits: return "Nie udało się zapisać splitów."; + case Label.LayoutCouldNotBeLoaded: return "Nie udało się wczytać układu. Może to nie być poprawny układ LiveSplit lub LiveSplit One."; + case Label.EmptySplitsNotSupported: return "Puste splity nie są obsługiwane."; + case Label.BugEncountered: return "Napotkano błąd:"; + case Label.PleaseReportIssueStart: return "Zgłoś ten problem "; + case Label.ReportHere: return "tutaj"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Aby pomóc nam naprawić ten problem, opisz kroki odtwarzania i dołącz splity oraz układ, z których korzystałeś(-aś), gdy wystąpił problem."; + case Label.LoadFailedPrivateBrowsing: return "Nie udało się uruchomić LiveSplit One.\nByć może używasz trybu prywatnego.\nLiveSplit One nie może zapisywać splitów, układów ani innych ustawień z powodu ograniczeń trybu prywatnego przeglądarki.\nTe ograniczenia mogą zostać zniesione w przyszłości.\nAby teraz uruchomić LiveSplit One, wyłącz tryb prywatny w ustawieniach."; + case Label.LoadFailedOutdatedBrowser: return "Nie udało się uruchomić LiveSplit One.\nByć może używasz nieaktualnej przeglądarki.\nZaktualizuj przeglądarkę lub iOS i spróbuj ponownie.\nInny powód może stanowić rozszerzenie przeglądarki, np. adblocker, które blokuje dostęp do ważnych skryptów."; + } +} diff --git a/src/localization/portuguese-brazil.ts b/src/localization/portuguese-brazil.ts new file mode 100644 index 000000000..d1cccb851 --- /dev/null +++ b/src/localization/portuguese-brazil.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveBrazilianPortuguese(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Cancelar"; + case Label.Settings: return "Configurações"; + case Label.Language: return "Idioma"; + case Label.LanguageDescription: return "Define o idioma usado no aplicativo."; + case Label.LanguageAuto: return "Automático"; + case Label.HotkeysHeading: return "Teclas de atalho"; + case Label.GeneralHeading: return "Geral"; + case Label.NetworkHeading: return "Rede"; + case Label.FrameRate: return "Taxa de quadros"; + case Label.FrameRateDescription: return "Determina a taxa de quadros em que o timer é exibido. “Sensível à bateria” tenta determinar o tipo de dispositivo e o estado de carregamento para selecionar uma boa taxa de quadros. “Correspondente à tela” faz o timer corresponder à taxa de atualização da tela."; + case Label.FrameRateBatteryAware: return "Sensível à bateria"; + case Label.FrameRateMatchScreen: return "Correspondente à tela"; + case Label.SaveOnReset: return "Salvar ao resetar"; + case Label.SaveOnResetDescription: return "Determina se os splits devem ser salvos automaticamente ao resetar o timer."; + case Label.ShowControlButtons: return "Mostrar botões de controle"; + case Label.ShowControlButtonsDescription: return "Determina se deve mostrar botões abaixo do timer que permitem controlá‑lo. Quando desativado, você deve usar as teclas de atalho."; + case Label.ShowManualGameTimeInput: return "Mostrar entrada manual do tempo de jogo"; + case Label.ShowManualGameTimeInputDescription: return "Mostra uma caixa de texto abaixo do timer que permite inserir manualmente o tempo de jogo. Você inicia o timer e faz splits pressionando a tecla Enter na caixa de texto. Certifique‑se de comparar com “Game Time”."; + case Label.ManualGameTimeMode: return "Modo de tempo de jogo manual"; + case Label.ManualGameTimeModeDescription: return "Determina se o tempo de jogo manual é inserido como tempos de segmento ou tempos de split."; + case Label.ManualGameTimeModeSegmentTimes: return "Tempos de segmento"; + case Label.ManualGameTimeModeSplitTimes: return "Tempos de split"; + case Label.AlwaysOnTop: return "Sempre no topo"; + case Label.AlwaysOnTopDescription: return "Mantém a janela sempre acima das outras janelas."; + case Label.SpeedrunComIntegration: return "Integração com Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Consulta a lista de jogos, categorias e rankings do speedrun.com."; + case Label.ServerConnection: return "Conexão com servidor"; + case Label.ServerConnectionDescription: return "Permite conectar a um servidor WebSocket que pode controlar o timer enviando vários comandos. Os comandos atualmente são um subconjunto dos comandos suportados pelo LiveSplit original."; + case Label.ServerConnectionExperimental: return "Este recurso é experimental e o protocolo provavelmente mudará no futuro."; + case Label.HotkeyAlreadyInUse: return "A tecla de atalho já está em uso."; + case Label.Start: return "Iniciar"; + case Label.Resume: return "Retomar"; + case Label.Pause: return "Pausar"; + case Label.UndoSplit: return "Desfazer split"; + case Label.Reset: return "Redefinir"; + case Label.SkipSplit: return "Pular split"; + case Label.ManualGameTimePlaceholder: return "Tempo de jogo manual"; + case Label.LiveSplitLogoAlt: return "Logo do LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Layout"; + case Label.CompareAgainst: return "Comparar com"; + case Label.RealTime: return "Tempo real"; + case Label.GameTime: return "Tempo de jogo"; + case Label.PopOut: return "Pop‑out"; + case Label.About: return "Sobre"; + case Label.Back: return "Voltar"; + case Label.AboutVersionPrefix: return "Versão:"; + case Label.AboutDescription: return "LiveSplit One é uma versão multiplataforma do LiveSplit, o timer elegante e altamente personalizável para speedrunners."; + case Label.AboutViewSource: return "Ver código‑fonte no GitHub"; + case Label.AboutRecentChanges: return "Alterações recentes"; + case Label.AboutContributors: return "Contribuidores"; + case Label.Loading: return "Carregando..."; + case Label.Add: return "Adicionar"; + case Label.Import: return "Importar"; + case Label.OpenSplits: return "Abrir splits"; + case Label.EditSplits: return "Editar splits"; + case Label.ExportSplits: return "Exportar splits"; + case Label.CopySplits: return "Copiar splits"; + case Label.RemoveSplits: return "Remover splits"; + case Label.Untitled: return "Sem título"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Descartar alterações?"; + case Label.DiscardChangesDescription: return "Seus splits atuais foram modificados e têm alterações não salvas. Deseja continuar e descartar essas alterações?"; + case Label.DeleteSplitsTitle: return "Excluir splits?"; + case Label.DeleteSplitsDescription: return "Tem certeza de que deseja excluir os splits? Esta operação não pode ser desfeita."; + case Label.SaveBestTimesTitle: return "Salvar melhores tempos?"; + case Label.SaveBestTimesDescription: return "Você superou alguns dos seus melhores tempos. Deseja atualizá-los?"; + case Label.Yes: return "Sim"; + case Label.No: return "Não"; + case Label.DontReset: return "Não reiniciar"; + case Label.FailedToExportSplits: return "Falha ao exportar os splits."; + case Label.CantImportEmptySplits: return "Não é possível importar splits vazios."; + case Label.FailedToReadFile: return "Falha ao ler o arquivo:"; + case Label.FailedToImportSplits: return "Falha ao importar os splits:"; + case Label.CouldNotParseSplits: return "Não foi possível analisar os splits."; + case Label.LoadedSplitsInvalid: return "Os splits carregados são inválidos."; + case Label.NewSegmentName: return "Tempo"; + case Label.EditWhileRunningError: return "Não é possível editar os splits enquanto o timer estiver em execução."; + case Label.Edit: return "Editar"; + case Label.Save: return "Salvar"; + case Label.Export: return "Exportar"; + case Label.FailedToParseTimeSpan: return "Não foi possível analisar TimeSpan"; + case Label.Default: return "Padrão"; + case Label.Game: return "Jogo"; + case Label.Category: return "Categoria"; + case Label.StartTimerAt: return "Iniciar timer em"; + case Label.Attempts: return "Tentativas"; + case Label.SplitsEditor: return "Editor de splits"; + case Label.Variables: return "Variáveis"; + case Label.Rules: return "Regras"; + case Label.Leaderboard: return "Leaderboard"; + case Label.InsertAbove: return "Inserir acima"; + case Label.InsertBelow: return "Inserir abaixo"; + case Label.RemoveSegment: return "Remover segmento"; + case Label.MoveUp: return "Mover para cima"; + case Label.MoveDown: return "Mover para baixo"; + case Label.AddVariable: return "Adicionar variável"; + case Label.OpenPbPage: return "Abrir página PB"; + case Label.AssociateRun: return "Associar run"; + case Label.Icon: return "Ícone"; + case Label.SegmentName: return "Nome do segmento"; + case Label.SplitTime: return "Tempo do split"; + case Label.SegmentTime: return "Tempo do segmento"; + case Label.BestSegment: return "Melhor segmento"; + case Label.SpeedrunComVariableTooltip: return "Variável do speedrun.com específica do jogo."; + case Label.Region: return "Região"; + case Label.RegionDescription: return "A região do jogo que está sendo jogado."; + case Label.Platform: return "Plataforma"; + case Label.PlatformDescription: return "A plataforma em que o jogo é jogado."; + case Label.UsesEmulator: return "Usa emulador"; + case Label.UsesEmulatorDescription: return "Se um emulador está sendo usado para jogar."; + case Label.CustomVariableTooltip: return "Variável personalizada definida por você. Pode ser exibida no componente de texto."; + case Label.NoVariables: return "No momento não há variáveis personalizadas para este jogo."; + case Label.NoVariablesWithSpeedrunCom: return "No momento não há variáveis do speedrun.com ou personalizadas para este jogo."; + case Label.TimedWithoutLoads: return "são cronometradas sem tempos de carregamento"; + case Label.TimedWithGameTime: return "são cronometradas com Game Time"; + case Label.RequireVideoProof: return "exigem prova em vídeo"; + case Label.RunsOfThisGamePrefix: return "As runs deste jogo "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "e"; + case Label.SetIcon: return "Definir ícone"; + case Label.SetIconDescription: return "Escolha uma imagem como ícone do jogo. Alguns formatos podem não funcionar em todos os lugares."; + case Label.DownloadBoxArt: return "Baixar box art"; + case Label.DownloadBoxArtDescription: return "Tenta baixar a box art do speedrun.com para definir como ícone do jogo."; + case Label.DownloadIcon: return "Baixar ícone"; + case Label.DownloadIconDescription: return "Tenta baixar o ícone do jogo do speedrun.com."; + case Label.RemoveIcon: return "Remover ícone"; + case Label.RemoveIconDescription: return "Remove o ícone do jogo."; + case Label.CleaningMenu: return "Limpeza…"; + case Label.ClearOnlyHistory: return "Limpar apenas histórico"; + case Label.ClearOnlyHistoryDescription: return "Os splits armazenam todo o histórico das runs. Esta ação limpa o histórico sem afetar PB, melhores segmentos e comparações."; + case Label.ClearAllTimes: return "Limpar todos os tempos"; + case Label.ClearAllTimesDescription: return "Remove todos os tempos e histórico, deixando os splits vazios."; + case Label.CleanSumOfBest: return "Limpar soma dos melhores"; + case Label.CleanSumOfBestDescription: return "Permite remover problemas no histórico dos segmentos que deixam a soma dos melhores segmentos imprecisa."; + case Label.ComparisonsMenu: return "Comparações…"; + case Label.AddComparison: return "Adicionar comparação"; + case Label.AddComparisonDescription: return "Adiciona uma comparação personalizada para armazenar tempos."; + case Label.ImportComparison: return "Importar comparação"; + case Label.ImportComparisonDescription: return "Importa o Personal Best de um arquivo de splits como comparação."; + case Label.GenerateGoalComparison: return "Gerar comparação de meta"; + case Label.GenerateGoalComparisonDescription: return "Gera uma comparação de meta baseada em um tempo alvo."; + case Label.CopyComparison: return "Copiar comparação"; + case Label.CopyComparisonDescription: return "Copia uma comparação existente como nova comparação personalizada."; + case Label.SetSegmentIcon: return "Definir ícone"; + case Label.SetSegmentIconDescription: return "Escolha uma imagem como ícone do segmento. Alguns formatos podem não funcionar em todos os lugares."; + case Label.RemoveSegmentIcon: return "Remover ícone"; + case Label.RemoveSegmentIconDescription: return "Remove o ícone do segmento."; + case Label.Rename: return "Renomear"; + case Label.RenameDescription: return "Escolha um novo nome para a comparação personalizada. Nomes reservados ou duplicados não são permitidos."; + case Label.CopyAction: return "Copiar"; + case Label.CopyDescription: return "Cria uma cópia da comparação personalizada."; + case Label.ACopy: return "Cópia"; + case Label.Remove: return "Remover"; + case Label.RemoveDescription: return "Remove a comparação personalizada."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Especifique o nome da comparação que deseja adicionar:"; + case Label.ComparisonAddError: return "Não foi possível adicionar a comparação. Pode ser duplicada ou reservada."; + case Label.ImportComparisonPrompt: return "Especifique o nome da comparação que deseja importar:"; + case Label.GenerateGoalComparisonPrompt: return "Especifique o tempo que deseja alcançar:"; + case Label.Generate: return "Gerar"; + case Label.GenerateGoalComparisonError: return "Falha ao gerar a comparação de meta. Verifique se o tempo é válido."; + case Label.CopyComparisonPrompt: return "Especifique o nome da comparação que deseja copiar:"; + case Label.CopyComparisonError: return "Falha ao copiar a comparação. A comparação pode não existir."; + case Label.NothingToCleanUp: return "Não há nada para limpar."; + case Label.CleanPrompt: return "Limpar?"; + case Label.AssociateRunPrompt: return "Especifique o ID ou URL speedrun.com da run:"; + case Label.Associate: return "Associar"; + case Label.InvalidSpeedrunUrl: return "ID ou URL speedrun.com inválido."; + case Label.AssociateRunError: return "Não foi possível associar a run. O ID pode ser inválido."; + case Label.AddVariablePrompt: return "Especifique o nome da variável personalizada que deseja adicionar:"; + case Label.RenameComparison: return "Renomear comparação"; + case Label.RenameComparisonPrompt: return "Especifique o novo nome da comparação:"; + case Label.ComparisonRenameError: return "Não foi possível renomear a comparação. Pode ser duplicada ou reservada."; + case Label.GameNotFound: return "Jogo não encontrado."; + case Label.NoBoxArt: return "O jogo não tem box art."; + case Label.DownloadBoxArtError: return "Falha ao baixar a box art."; + case Label.NoGameIcon: return "O jogo não tem ícone."; + case Label.DownloadIconError: return "Falha ao baixar o ícone."; + case Label.Rank: return "Classificação"; + case Label.Player: return "Jogador"; + case Label.Time: return "Tempo"; + case Label.Date: return "Data:"; + case Label.Emulator: return "Emulador"; + case Label.EmulatorTag: return "Emulador"; + case Label.ObsoleteRuns: return "Runs obsoletas"; + case Label.Shown: return "Exibidas"; + case Label.Hidden: return "Ocultas"; + case Label.OpenLeaderboard: return "Abrir leaderboard"; + case Label.Filters: return "Filtros"; + case Label.LayoutEditor: return "Editor de layout"; + case Label.Component: return "Componente"; + case Label.AddComponent: return "Adicionar componente"; + case Label.RemoveComponent: return "Remover componente"; + case Label.DuplicateComponent: return "Duplicar componente"; + case Label.MoveComponentUp: return "Mover componente para cima"; + case Label.MoveComponentDown: return "Mover componente para baixo"; + case Label.ComponentTitle: return "Título"; + case Label.ComponentTitleDescription: return "Mostra o nome do jogo e categoria, ícones, tentativas e número de finalizações."; + case Label.ComponentGraph: return "Gráfico"; + case Label.ComponentGraphDescription: return "Mostra o avanço/atraso em relação à comparação em todos os splits."; + case Label.ComponentSplitsDescription: return "O principal componente de tempos de split. Mostra uma tabela rolável."; + case Label.ComponentDetailedTimer: return "Timer detalhado"; + case Label.ComponentDetailedTimerDescription: return "Mostra o tempo total e o tempo do segmento atual."; + case Label.ComponentTimer: return "Timer"; + case Label.ComponentTimerDescription: return "Mostra o tempo total em formato digital; a cor depende da comparação."; + case Label.ComponentCurrentComparison: return "Comparação atual"; + case Label.ComponentCurrentComparisonDescription: return "Mostra o nome da comparação atual."; + case Label.ComponentCurrentPace: return "Ritmo atual"; + case Label.ComponentCurrentPaceDescription: return "Prevê o tempo final com base na comparação selecionada."; + case Label.ComponentDelta: return "Diferença"; + case Label.ComponentDeltaDescription: return "Mostra o avanço/atraso em relação à comparação."; + case Label.ComponentPbChance: return "Chance de PB"; + case Label.ComponentPbChanceDescription: return "Mostra a chance de obter um PB."; + case Label.ComponentPossibleTimeSave: return "Tempo possível de economizar"; + case Label.ComponentPossibleTimeSaveDescription: return "Mostra o tempo que pode ser economizado no segmento atual."; + case Label.ComponentPreviousSegment: return "Segmento anterior"; + case Label.ComponentPreviousSegmentDescription: return "Mostra o ganho/perda e a economia potencial do segmento anterior."; + case Label.ComponentSegmentTime: return "Tempo do segmento"; + case Label.ComponentSegmentTimeDescription: return "Mostra o tempo do segmento para a comparação selecionada."; + case Label.ComponentSumOfBest: return "Soma dos melhores"; + case Label.ComponentSumOfBestDescription: return "Mostra o tempo mais rápido possível com base no histórico."; + case Label.ComponentText: return "Texto"; + case Label.ComponentTextDescription: return "Mostra textos central/esquerda/direita e variáveis personalizadas."; + case Label.ComponentTotalPlaytime: return "Tempo total de jogo"; + case Label.ComponentTotalPlaytimeDescription: return "Mostra o tempo total de jogo na categoria."; + case Label.ComponentVariableDescription: return "Cria texto que mostra o valor da variável personalizada “{name}”."; + case Label.ComponentBlankSpace: return "Espaço em branco"; + case Label.ComponentBlankSpaceDescription: return "Componente vazio com apenas o fundo."; + case Label.ComponentSeparator: return "Separador"; + case Label.ComponentSeparatorDescription: return "Mostra uma linha separadora entre componentes."; + case Label.AccuracySeconds: return "Segundos"; + case Label.AccuracyTenths: return "Décimos"; + case Label.AccuracyHundredths: return "Centésimos"; + case Label.AccuracyMilliseconds: return "Milissegundos"; + case Label.FontStyle: return "Estilo"; + case Label.FontWeight: return "Peso"; + case Label.FontStretch: return "Alongamento"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Itálico"; + case Label.AlignmentAutomatic: return "Automático"; + case Label.AlignmentLeft: return "Esquerda"; + case Label.AlignmentCenter: return "Centro"; + case Label.GradientTransparent: return "Transparente"; + case Label.GradientPlain: return "Sólido"; + case Label.GradientVertical: return "Vertical"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Alternado"; + case Label.GradientPlainDelta: return "Delta sólido"; + case Label.GradientVerticalDelta: return "Delta vertical"; + case Label.GradientHorizontalDelta: return "Delta horizontal"; + case Label.LayoutBackgroundImage: return "Imagem"; + case Label.LayoutBackgroundBrightness: return "Brilho"; + case Label.LayoutBackgroundOpacity: return "Opacidade"; + case Label.LayoutBackgroundBlur: return "Desfoque"; + case Label.LayoutDirectionVertical: return "Vertical"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Tempo"; + case Label.ColumnKindVariable: return "Variável"; + case Label.ColumnStartWithEmpty: return "Vazio"; + case Label.ColumnStartWithComparisonTime: return "Tempo de comparação"; + case Label.ColumnStartWithComparisonSegmentTime: return "Tempo de segmento de comparação"; + case Label.ColumnStartWithPossibleTimeSave: return "Tempo possível de economizar"; + case Label.ColumnUpdateWithDontUpdate: return "Não atualizar"; + case Label.ColumnUpdateWithSplitTime: return "Tempo do split"; + case Label.ColumnUpdateWithDelta: return "Tempo à frente / atrás"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Tempo à frente / atrás ou tempo do split se vazio"; + case Label.ColumnUpdateWithSegmentTime: return "Tempo do segmento"; + case Label.ColumnUpdateWithSegmentDelta: return "Tempo ganho / perdido"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Tempo ganho / perdido ou tempo do segmento se vazio"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Ao iniciar o segmento"; + case Label.ColumnUpdateTriggerContextual: return "Contextual"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Ao terminar o segmento"; + case Label.ComparisonCurrentComparison: return "Comparação atual"; + case Label.CustomVariableNoneAvailable: return "Não há variáveis disponíveis"; + case Label.CustomVariableNoneAvailableTooltip: return "Variáveis personalizadas podem ser definidas na aba Variáveis ao editar splits. Variáveis personalizadas adicionais podem ser fornecidas automaticamente por auto splitters."; + case Label.HotkeyButtonTooltip: return "Clique para gravar uma tecla de atalho. Você também pode usar botões do gamepad. Hotkeys globais não são possíveis no momento. Botões do gamepad funcionam globalmente."; + case Label.ServerConnect: return "Conectar"; + case Label.ServerDisconnect: return "Desconectar"; + case Label.ServerConnecting: return "Conectando..."; + case Label.ServerDisconnecting: return "Desconectando..."; + case Label.ConnectToServerTitle: return "Conectar ao servidor"; + case Label.ConnectToServerDescription: return "Informe a URL do WebSocket:"; + case Label.Connect: return "Conectar"; + case Label.UpdateAvailable: return "Há uma nova versão do LiveSplit One disponível! Clique aqui para recarregar."; + case Label.UnsavedChangesBeforeUnload: return "Há alterações não salvas. Tem certeza de que deseja fechar o LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Abrir barra lateral"; + case Label.FailedToSaveLayout: return "Falha ao salvar o layout."; + case Label.FailedToSaveHotkeys: return "Falha ao salvar as configurações de atalhos."; + case Label.FailedToSaveGeneralSettings: return "Falha ao salvar as configurações gerais."; + case Label.FailedToSaveSplits: return "Falha ao salvar os splits."; + case Label.LayoutCouldNotBeLoaded: return "Não foi possível carregar o layout. Talvez não seja um layout válido do LiveSplit ou LiveSplit One."; + case Label.EmptySplitsNotSupported: return "Splits vazios não são suportados."; + case Label.BugEncountered: return "Você encontrou um bug:"; + case Label.PleaseReportIssueStart: return "Por favor, reporte este problema "; + case Label.ReportHere: return "aqui"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Para nos ajudar a corrigir este problema, inclua as etapas para reproduzi‑lo e anexe os splits e o layout que você estava usando quando o problema ocorreu."; + case Label.LoadFailedPrivateBrowsing: return "Não foi possível carregar o LiveSplit One.\nTalvez você esteja no modo de navegação privada.\nO LiveSplit One não pode armazenar splits, layouts ou outras configurações devido às limitações do modo privado do navegador.\nEssas limitações podem ser removidas no futuro.\nPara usar o LiveSplit One agora, desative a navegação privada nas configurações."; + case Label.LoadFailedOutdatedBrowser: return "Não foi possível carregar o LiveSplit One.\nTalvez você esteja usando um navegador desatualizado.\nAtualize o navegador ou sua versão do iOS e tente novamente.\nOutro motivo pode ser uma extensão do navegador, como um bloqueador de anúncios, que esteja bloqueando o acesso a scripts importantes."; + } +} diff --git a/src/localization/portuguese.ts b/src/localization/portuguese.ts new file mode 100644 index 000000000..b411e21fa --- /dev/null +++ b/src/localization/portuguese.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolvePortuguese(text: Label): string { + switch (text) { + case Label.Ok: return "OK"; + case Label.Cancel: return "Cancelar"; + case Label.Settings: return "Configurações"; + case Label.Language: return "Idioma"; + case Label.LanguageDescription: return "Define o idioma usado no aplicativo."; + case Label.LanguageAuto: return "Automático"; + case Label.HotkeysHeading: return "Teclas de atalho"; + case Label.GeneralHeading: return "Geral"; + case Label.NetworkHeading: return "Rede"; + case Label.FrameRate: return "Taxa de quadros"; + case Label.FrameRateDescription: return "Determina a taxa de quadros em que o timer é exibido. “Sensível à bateria” tenta determinar o tipo de dispositivo e o estado de carregamento para selecionar uma boa taxa de quadros. “Correspondente à tela” faz o timer corresponder à taxa de atualização da tela."; + case Label.FrameRateBatteryAware: return "Sensível à bateria"; + case Label.FrameRateMatchScreen: return "Correspondente à tela"; + case Label.SaveOnReset: return "Salvar ao resetar"; + case Label.SaveOnResetDescription: return "Determina se os splits devem ser salvos automaticamente ao resetar o timer."; + case Label.ShowControlButtons: return "Mostrar botões de controle"; + case Label.ShowControlButtonsDescription: return "Determina se deve mostrar botões abaixo do timer que permitem controlá‑lo. Quando desativado, você deve usar as teclas de atalho."; + case Label.ShowManualGameTimeInput: return "Mostrar entrada manual do tempo de jogo"; + case Label.ShowManualGameTimeInputDescription: return "Mostra uma caixa de texto abaixo do timer que permite inserir manualmente o tempo de jogo. Você inicia o timer e faz splits pressionando a tecla Enter na caixa de texto. Certifique‑se de comparar com “Game Time”."; + case Label.ManualGameTimeMode: return "Modo de tempo de jogo manual"; + case Label.ManualGameTimeModeDescription: return "Determina se o tempo de jogo manual é inserido como tempos de segmento ou tempos de split."; + case Label.ManualGameTimeModeSegmentTimes: return "Tempos de segmento"; + case Label.ManualGameTimeModeSplitTimes: return "Tempos de split"; + case Label.AlwaysOnTop: return "Sempre no topo"; + case Label.AlwaysOnTopDescription: return "Mantém a janela sempre acima das outras janelas."; + case Label.SpeedrunComIntegration: return "Integração com Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Consulta a lista de jogos, categorias e rankings do speedrun.com."; + case Label.ServerConnection: return "Conexão com servidor"; + case Label.ServerConnectionDescription: return "Permite conectar a um servidor WebSocket que pode controlar o timer enviando vários comandos. Os comandos atualmente são um subconjunto dos comandos suportados pelo LiveSplit original."; + case Label.ServerConnectionExperimental: return "Este recurso é experimental e o protocolo provavelmente mudará no futuro."; + case Label.HotkeyAlreadyInUse: return "A tecla de atalho já está em uso."; + case Label.Start: return "Iniciar"; + case Label.Resume: return "Retomar"; + case Label.Pause: return "Pausar"; + case Label.UndoSplit: return "Desfazer split"; + case Label.Reset: return "Redefinir"; + case Label.SkipSplit: return "Pular split"; + case Label.ManualGameTimePlaceholder: return "Tempo de jogo manual"; + case Label.LiveSplitLogoAlt: return "Logo do LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Layout"; + case Label.CompareAgainst: return "Comparar com"; + case Label.RealTime: return "Tempo real"; + case Label.GameTime: return "Tempo de jogo"; + case Label.PopOut: return "Pop‑out"; + case Label.About: return "Sobre"; + case Label.Back: return "Voltar"; + case Label.AboutVersionPrefix: return "Versão:"; + case Label.AboutDescription: return "LiveSplit One é uma versão multiplataforma do LiveSplit, o timer elegante e altamente personalizável para speedrunners."; + case Label.AboutViewSource: return "Ver código‑fonte no GitHub"; + case Label.AboutRecentChanges: return "Alterações recentes"; + case Label.AboutContributors: return "Contribuidores"; + case Label.Loading: return "A carregar..."; + case Label.Add: return "Adicionar"; + case Label.Import: return "Importar"; + case Label.OpenSplits: return "Abrir splits"; + case Label.EditSplits: return "Editar splits"; + case Label.ExportSplits: return "Exportar splits"; + case Label.CopySplits: return "Copiar splits"; + case Label.RemoveSplits: return "Remover splits"; + case Label.Untitled: return "Sem título"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Descartar alterações?"; + case Label.DiscardChangesDescription: return "Os splits atuais foram modificados e têm alterações não guardadas. Quer continuar e descartar essas alterações?"; + case Label.DeleteSplitsTitle: return "Eliminar splits?"; + case Label.DeleteSplitsDescription: return "Tem a certeza de que pretende eliminar os splits? Esta operação não pode ser desfeita."; + case Label.SaveBestTimesTitle: return "Guardar melhores tempos?"; + case Label.SaveBestTimesDescription: return "Você superou alguns dos seus melhores tempos. Deseja atualizá-los?"; + case Label.Yes: return "Sim"; + case Label.No: return "Não"; + case Label.DontReset: return "Não reiniciar"; + case Label.FailedToExportSplits: return "Falha ao exportar os splits."; + case Label.CantImportEmptySplits: return "Não é possível importar splits vazios."; + case Label.FailedToReadFile: return "Falha ao ler o ficheiro:"; + case Label.FailedToImportSplits: return "Falha ao importar os splits:"; + case Label.CouldNotParseSplits: return "Não foi possível analisar os splits."; + case Label.LoadedSplitsInvalid: return "Os splits carregados são inválidos."; + case Label.NewSegmentName: return "Tempo"; + case Label.EditWhileRunningError: return "Não é possível editar os splits enquanto o temporizador estiver a correr."; + case Label.Edit: return "Editar"; + case Label.Save: return "Guardar"; + case Label.Export: return "Exportar"; + case Label.FailedToParseTimeSpan: return "Não foi possível analisar TimeSpan"; + case Label.Default: return "Padrão"; + case Label.Game: return "Jogo"; + case Label.Category: return "Categoria"; + case Label.StartTimerAt: return "Iniciar temporizador em"; + case Label.Attempts: return "Tentativas"; + case Label.SplitsEditor: return "Editor de splits"; + case Label.Variables: return "Variáveis"; + case Label.Rules: return "Regras"; + case Label.Leaderboard: return "Classificação"; + case Label.InsertAbove: return "Inserir acima"; + case Label.InsertBelow: return "Inserir abaixo"; + case Label.RemoveSegment: return "Remover segmento"; + case Label.MoveUp: return "Mover para cima"; + case Label.MoveDown: return "Mover para baixo"; + case Label.AddVariable: return "Adicionar variável"; + case Label.OpenPbPage: return "Abrir página PB"; + case Label.AssociateRun: return "Associar run"; + case Label.Icon: return "Ícone"; + case Label.SegmentName: return "Nome do segmento"; + case Label.SplitTime: return "Tempo do split"; + case Label.SegmentTime: return "Tempo do segmento"; + case Label.BestSegment: return "Melhor segmento"; + case Label.SpeedrunComVariableTooltip: return "Variável do speedrun.com específica do jogo."; + case Label.Region: return "Região"; + case Label.RegionDescription: return "A região do jogo que está a ser jogado."; + case Label.Platform: return "Plataforma"; + case Label.PlatformDescription: return "A plataforma onde o jogo é jogado."; + case Label.UsesEmulator: return "Usa emulador"; + case Label.UsesEmulatorDescription: return "Se é usado um emulador para jogar."; + case Label.CustomVariableTooltip: return "Variável personalizada definida por si. Pode ser mostrada no componente de texto."; + case Label.NoVariables: return "Atualmente não existem variáveis personalizadas para este jogo."; + case Label.NoVariablesWithSpeedrunCom: return "Atualmente não existem variáveis do speedrun.com ou personalizadas para este jogo."; + case Label.TimedWithoutLoads: return "são cronometradas sem tempos de carregamento"; + case Label.TimedWithGameTime: return "são cronometradas com Game Time"; + case Label.RequireVideoProof: return "exigem prova em vídeo"; + case Label.RunsOfThisGamePrefix: return "As runs deste jogo "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "e"; + case Label.SetIcon: return "Definir ícone"; + case Label.SetIconDescription: return "Escolha uma imagem como ícone do jogo. Alguns formatos podem não funcionar em todo o lado."; + case Label.DownloadBoxArt: return "Transferir box art"; + case Label.DownloadBoxArtDescription: return "Tenta transferir a box art de speedrun.com para definir como ícone do jogo."; + case Label.DownloadIcon: return "Transferir ícone"; + case Label.DownloadIconDescription: return "Tenta transferir o ícone do jogo a partir do speedrun.com."; + case Label.RemoveIcon: return "Remover ícone"; + case Label.RemoveIconDescription: return "Remove o ícone do jogo."; + case Label.CleaningMenu: return "Limpeza…"; + case Label.ClearOnlyHistory: return "Limpar apenas histórico"; + case Label.ClearOnlyHistoryDescription: return "Os splits guardam todo o histórico de runs. Pode limpar o histórico sem afetar o PB, melhores segmentos e comparações."; + case Label.ClearAllTimes: return "Limpar todos os tempos"; + case Label.ClearAllTimesDescription: return "Remove todos os tempos e histórico, deixando os splits vazios."; + case Label.CleanSumOfBest: return "Limpar soma dos melhores"; + case Label.CleanSumOfBestDescription: return "Permite remover problemas no histórico de segmentos que tornam a soma dos melhores segmentos imprecisa."; + case Label.ComparisonsMenu: return "Comparações…"; + case Label.AddComparison: return "Adicionar comparação"; + case Label.AddComparisonDescription: return "Adiciona uma comparação personalizada onde pode guardar tempos."; + case Label.ImportComparison: return "Importar comparação"; + case Label.ImportComparisonDescription: return "Importa o Personal Best de um ficheiro de splits como comparação."; + case Label.GenerateGoalComparison: return "Gerar comparação de objetivo"; + case Label.GenerateGoalComparisonDescription: return "Gera uma comparação de objetivo com base num tempo alvo."; + case Label.CopyComparison: return "Copiar comparação"; + case Label.CopyComparisonDescription: return "Copia uma comparação existente como nova comparação personalizada."; + case Label.SetSegmentIcon: return "Definir ícone"; + case Label.SetSegmentIconDescription: return "Escolha uma imagem como ícone do segmento. Alguns formatos podem não funcionar em todo o lado."; + case Label.RemoveSegmentIcon: return "Remover ícone"; + case Label.RemoveSegmentIconDescription: return "Remove o ícone do segmento."; + case Label.Rename: return "Renomear"; + case Label.RenameDescription: return "Escolha um novo nome para a comparação personalizada. Nomes reservados ou duplicados não são permitidos."; + case Label.CopyAction: return "Copiar"; + case Label.CopyDescription: return "Cria uma cópia da comparação personalizada."; + case Label.ACopy: return "Cópia"; + case Label.Remove: return "Remover"; + case Label.RemoveDescription: return "Remove a comparação personalizada."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Especifique o nome da comparação que pretende adicionar:"; + case Label.ComparisonAddError: return "Não foi possível adicionar a comparação. Pode ser duplicada ou reservada."; + case Label.ImportComparisonPrompt: return "Especifique o nome da comparação que pretende importar:"; + case Label.GenerateGoalComparisonPrompt: return "Especifique o tempo que pretende alcançar:"; + case Label.Generate: return "Gerar"; + case Label.GenerateGoalComparisonError: return "Falha ao gerar a comparação de objetivo. Indique um tempo válido."; + case Label.CopyComparisonPrompt: return "Especifique o nome da comparação que pretende copiar:"; + case Label.CopyComparisonError: return "Falha ao copiar a comparação. A comparação pode não existir."; + case Label.NothingToCleanUp: return "Não há nada para limpar."; + case Label.CleanPrompt: return "Limpar?"; + case Label.AssociateRunPrompt: return "Especifique o ID ou URL speedrun.com da run:"; + case Label.Associate: return "Associar"; + case Label.InvalidSpeedrunUrl: return "ID ou URL speedrun.com inválido."; + case Label.AssociateRunError: return "Não foi possível associar a run. O ID pode ser inválido."; + case Label.AddVariablePrompt: return "Especifique o nome da variável personalizada que pretende adicionar:"; + case Label.RenameComparison: return "Renomear comparação"; + case Label.RenameComparisonPrompt: return "Especifique o novo nome da comparação:"; + case Label.ComparisonRenameError: return "Não foi possível renomear a comparação. Pode ser duplicada ou reservada."; + case Label.GameNotFound: return "Jogo não encontrado."; + case Label.NoBoxArt: return "O jogo não tem box art."; + case Label.DownloadBoxArtError: return "Não foi possível transferir a box art."; + case Label.NoGameIcon: return "O jogo não tem ícone."; + case Label.DownloadIconError: return "Não foi possível transferir o ícone."; + case Label.Rank: return "Classificação"; + case Label.Player: return "Jogador"; + case Label.Time: return "Tempo"; + case Label.Date: return "Data:"; + case Label.Emulator: return "Emulador"; + case Label.EmulatorTag: return "Emulador"; + case Label.ObsoleteRuns: return "Runs obsoletas"; + case Label.Shown: return "Mostradas"; + case Label.Hidden: return "Ocultas"; + case Label.OpenLeaderboard: return "Abrir classificação"; + case Label.Filters: return "Filtros"; + case Label.LayoutEditor: return "Editor de layout"; + case Label.Component: return "Componente"; + case Label.AddComponent: return "Adicionar componente"; + case Label.RemoveComponent: return "Remover componente"; + case Label.DuplicateComponent: return "Duplicar componente"; + case Label.MoveComponentUp: return "Mover componente para cima"; + case Label.MoveComponentDown: return "Mover componente para baixo"; + case Label.ComponentTitle: return "Título"; + case Label.ComponentTitleDescription: return "Mostra o nome do jogo e categoria, ícones, tentativas e número de finalizações."; + case Label.ComponentGraph: return "Gráfico"; + case Label.ComponentGraphDescription: return "Mostra o avanço/atraso em relação à comparação ao longo dos splits."; + case Label.ComponentSplitsDescription: return "O componente principal dos tempos de split. Apresenta uma tabela rolável."; + case Label.ComponentDetailedTimer: return "Temporizador detalhado"; + case Label.ComponentDetailedTimerDescription: return "Mostra o tempo total e o tempo do segmento atual."; + case Label.ComponentTimer: return "Temporizador"; + case Label.ComponentTimerDescription: return "Mostra o tempo total em formato digital; a cor depende da comparação."; + case Label.ComponentCurrentComparison: return "Comparação atual"; + case Label.ComponentCurrentComparisonDescription: return "Mostra o nome da comparação atual."; + case Label.ComponentCurrentPace: return "Ritmo atual"; + case Label.ComponentCurrentPaceDescription: return "Prevê o tempo final com base na comparação selecionada."; + case Label.ComponentDelta: return "Diferença"; + case Label.ComponentDeltaDescription: return "Mostra o avanço/atraso em relação à comparação."; + case Label.ComponentPbChance: return "Probabilidade de PB"; + case Label.ComponentPbChanceDescription: return "Mostra a probabilidade de alcançar um PB."; + case Label.ComponentPossibleTimeSave: return "Poupança de tempo possível"; + case Label.ComponentPossibleTimeSaveDescription: return "Mostra o tempo que pode ser poupado no segmento atual."; + case Label.ComponentPreviousSegment: return "Segmento anterior"; + case Label.ComponentPreviousSegmentDescription: return "Mostra o ganho/perda e a poupança potencial do segmento anterior."; + case Label.ComponentSegmentTime: return "Tempo do segmento"; + case Label.ComponentSegmentTimeDescription: return "Mostra o tempo do segmento para a comparação selecionada."; + case Label.ComponentSumOfBest: return "Soma dos melhores"; + case Label.ComponentSumOfBestDescription: return "Mostra o tempo mais rápido possível com base no histórico."; + case Label.ComponentText: return "Texto"; + case Label.ComponentTextDescription: return "Mostra textos centrais/laterais e variáveis personalizadas."; + case Label.ComponentTotalPlaytime: return "Tempo total de jogo"; + case Label.ComponentTotalPlaytimeDescription: return "Mostra o tempo total de jogo na categoria."; + case Label.ComponentVariableDescription: return "Cria texto que mostra o valor da variável personalizada “{name}”."; + case Label.ComponentBlankSpace: return "Espaço em branco"; + case Label.ComponentBlankSpaceDescription: return "Componente vazio com apenas o fundo."; + case Label.ComponentSeparator: return "Separador"; + case Label.ComponentSeparatorDescription: return "Mostra uma linha separadora entre componentes."; + case Label.AccuracySeconds: return "Segundos"; + case Label.AccuracyTenths: return "Décimos"; + case Label.AccuracyHundredths: return "Centésimos"; + case Label.AccuracyMilliseconds: return "Milissegundos"; + case Label.FontStyle: return "Estilo"; + case Label.FontWeight: return "Peso"; + case Label.FontStretch: return "Alongamento"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Itálico"; + case Label.AlignmentAutomatic: return "Automático"; + case Label.AlignmentLeft: return "Esquerda"; + case Label.AlignmentCenter: return "Centro"; + case Label.GradientTransparent: return "Transparente"; + case Label.GradientPlain: return "Sólido"; + case Label.GradientVertical: return "Vertical"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Alternado"; + case Label.GradientPlainDelta: return "Delta sólido"; + case Label.GradientVerticalDelta: return "Delta vertical"; + case Label.GradientHorizontalDelta: return "Delta horizontal"; + case Label.LayoutBackgroundImage: return "Imagem"; + case Label.LayoutBackgroundBrightness: return "Brilho"; + case Label.LayoutBackgroundOpacity: return "Opacidade"; + case Label.LayoutBackgroundBlur: return "Desfoque"; + case Label.LayoutDirectionVertical: return "Vertical"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Tempo"; + case Label.ColumnKindVariable: return "Variável"; + case Label.ColumnStartWithEmpty: return "Vazio"; + case Label.ColumnStartWithComparisonTime: return "Tempo de comparação"; + case Label.ColumnStartWithComparisonSegmentTime: return "Tempo de segmento de comparação"; + case Label.ColumnStartWithPossibleTimeSave: return "Tempo possível de economizar"; + case Label.ColumnUpdateWithDontUpdate: return "Não atualizar"; + case Label.ColumnUpdateWithSplitTime: return "Tempo do split"; + case Label.ColumnUpdateWithDelta: return "Tempo à frente / atrás"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Tempo à frente / atrás ou tempo do split se vazio"; + case Label.ColumnUpdateWithSegmentTime: return "Tempo do segmento"; + case Label.ColumnUpdateWithSegmentDelta: return "Tempo ganho / perdido"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Tempo ganho / perdido ou tempo do segmento se vazio"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Ao iniciar o segmento"; + case Label.ColumnUpdateTriggerContextual: return "Contextual"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Ao terminar o segmento"; + case Label.ComparisonCurrentComparison: return "Comparação atual"; + case Label.CustomVariableNoneAvailable: return "Não há variáveis disponíveis"; + case Label.CustomVariableNoneAvailableTooltip: return "Variáveis personalizadas podem ser definidas na aba Variáveis ao editar splits. Variáveis personalizadas adicionais podem ser fornecidas automaticamente por auto splitters."; + case Label.HotkeyButtonTooltip: return "Clique para gravar uma tecla de atalho. Também é possível usar botões de gamepad. Hotkeys globais não são possíveis no momento. Botões de gamepad funcionam globalmente."; + case Label.ServerConnect: return "Conectar"; + case Label.ServerDisconnect: return "Desconectar"; + case Label.ServerConnecting: return "Conectando..."; + case Label.ServerDisconnecting: return "Desconectando..."; + case Label.ConnectToServerTitle: return "Conectar ao servidor"; + case Label.ConnectToServerDescription: return "Indique o URL do WebSocket:"; + case Label.Connect: return "Conectar"; + case Label.UpdateAvailable: return "Há uma nova versão do LiveSplit One disponível! Clique aqui para recarregar."; + case Label.UnsavedChangesBeforeUnload: return "Há alterações não guardadas. Quer mesmo fechar o LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Abrir barra lateral"; + case Label.FailedToSaveLayout: return "Falha ao guardar o layout."; + case Label.FailedToSaveHotkeys: return "Falha ao guardar as definições de atalhos."; + case Label.FailedToSaveGeneralSettings: return "Falha ao guardar as definições gerais."; + case Label.FailedToSaveSplits: return "Falha ao guardar os splits."; + case Label.LayoutCouldNotBeLoaded: return "Não foi possível carregar o layout. Pode não ser um layout válido do LiveSplit ou LiveSplit One."; + case Label.EmptySplitsNotSupported: return "Splits vazios não são suportados."; + case Label.BugEncountered: return "Encontrou um erro:"; + case Label.PleaseReportIssueStart: return "Por favor, reporte este problema "; + case Label.ReportHere: return "aqui"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Para nos ajudar a corrigir este problema, inclua as etapas para reproduzi‑lo e anexe os splits e o layout que você estava usando quando o problema ocorreu."; + case Label.LoadFailedPrivateBrowsing: return "Não foi possível carregar o LiveSplit One.\nTalvez esteja em navegação privada.\nO LiveSplit One não pode guardar splits, layouts ou outras definições devido às limitações da navegação privada do browser.\nEstas limitações podem ser levantadas no futuro.\nPara usar o LiveSplit One por agora, desative a navegação privada nas definições."; + case Label.LoadFailedOutdatedBrowser: return "Não foi possível carregar o LiveSplit One.\nTalvez esteja a usar um browser desatualizado.\nAtualize o browser ou a versão do iOS e tente novamente.\nOutra razão pode ser uma extensão do browser, como um bloqueador de anúncios, a bloquear o acesso a scripts importantes."; + } +} diff --git a/src/localization/russian.ts b/src/localization/russian.ts new file mode 100644 index 000000000..382631097 --- /dev/null +++ b/src/localization/russian.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveRussian(text: Label): string { + switch (text) { + case Label.Ok: return "ОК"; + case Label.Cancel: return "Отмена"; + case Label.Settings: return "Настройки"; + case Label.Language: return "Язык"; + case Label.LanguageDescription: return "Устанавливает язык, используемый в приложении."; + case Label.LanguageAuto: return "Автоматически"; + case Label.HotkeysHeading: return "Горячие клавиши"; + case Label.GeneralHeading: return "Общие"; + case Label.NetworkHeading: return "Сеть"; + case Label.FrameRate: return "Частота кадров"; + case Label.FrameRateDescription: return "Определяет частоту кадров, с которой отображается таймер. «С учётом батареи» пытается определить тип устройства и состояние зарядки, чтобы выбрать подходящую частоту. «По частоте экрана» заставляет таймер соответствовать частоте обновления экрана."; + case Label.FrameRateBatteryAware: return "С учётом батареи"; + case Label.FrameRateMatchScreen: return "По частоте экрана"; + case Label.SaveOnReset: return "Сохранять при сбросе"; + case Label.SaveOnResetDescription: return "Определяет, следует ли автоматически сохранять сплиты при сбросе таймера."; + case Label.ShowControlButtons: return "Показывать кнопки управления"; + case Label.ShowControlButtonsDescription: return "Определяет, следует ли показывать кнопки под таймером для управления им. Если отключено, нужно использовать горячие клавиши."; + case Label.ShowManualGameTimeInput: return "Показывать ручной ввод игрового времени"; + case Label.ShowManualGameTimeInputDescription: return "Показывает поле ввода под таймером, позволяющее вручную вводить игровое время. Вы запускаете таймер и делаете сплиты, нажимая Enter в поле ввода. Убедитесь, что сравнение идет с «Game Time»."; + case Label.ManualGameTimeMode: return "Режим ручного игрового времени"; + case Label.ManualGameTimeModeDescription: return "Определяет, вводится ли ручное игровое время как времена сегментов или времена сплитов."; + case Label.ManualGameTimeModeSegmentTimes: return "Времена сегментов"; + case Label.ManualGameTimeModeSplitTimes: return "Времена сплитов"; + case Label.AlwaysOnTop: return "Всегда поверх"; + case Label.AlwaysOnTopDescription: return "Держит окно поверх других окон."; + case Label.SpeedrunComIntegration: return "Интеграция Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Запрашивает список игр, категорий и таблиц лидеров с speedrun.com."; + case Label.ServerConnection: return "Подключение к серверу"; + case Label.ServerConnectionDescription: return "Позволяет подключиться к серверу WebSocket, который может управлять таймером, отправляя различные команды. Команды сейчас являются подмножеством команд, поддерживаемых оригинальным LiveSplit."; + case Label.ServerConnectionExperimental: return "Эта функция экспериментальная, и протокол, вероятно, изменится в будущем."; + case Label.HotkeyAlreadyInUse: return "Эта горячая клавиша уже используется."; + case Label.Start: return "Старт"; + case Label.Resume: return "Продолжить"; + case Label.Pause: return "Пауза"; + case Label.UndoSplit: return "Отменить сплит"; + case Label.Reset: return "Сброс"; + case Label.SkipSplit: return "Пропустить сплит"; + case Label.ManualGameTimePlaceholder: return "Ручное игровое время"; + case Label.LiveSplitLogoAlt: return "Логотип LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Сплиты"; + case Label.Layout: return "Макет"; + case Label.CompareAgainst: return "Сравнить с"; + case Label.RealTime: return "Реальное время"; + case Label.GameTime: return "Игровое время"; + case Label.PopOut: return "Окно отдельно"; + case Label.About: return "О программе"; + case Label.Back: return "Назад"; + case Label.AboutVersionPrefix: return "Версия:"; + case Label.AboutDescription: return "LiveSplit One — это мультиплатформенная версия LiveSplit, элегантного и высоко настраиваемого таймера для спидраннеров."; + case Label.AboutViewSource: return "Посмотреть исходный код на GitHub"; + case Label.AboutRecentChanges: return "Недавние изменения"; + case Label.AboutContributors: return "Участники"; + case Label.Loading: return "Загрузка..."; + case Label.Add: return "Добавить"; + case Label.Import: return "Импорт"; + case Label.OpenSplits: return "Открыть сплиты"; + case Label.EditSplits: return "Редактировать сплиты"; + case Label.ExportSplits: return "Экспортировать сплиты"; + case Label.CopySplits: return "Копировать сплиты"; + case Label.RemoveSplits: return "Удалить сплиты"; + case Label.Untitled: return "Без названия"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "Отбросить изменения?"; + case Label.DiscardChangesDescription: return "Текущие сплиты изменены и содержат несохранённые изменения. Продолжить и отбросить изменения?"; + case Label.DeleteSplitsTitle: return "Удалить сплиты?"; + case Label.DeleteSplitsDescription: return "Вы уверены, что хотите удалить сплиты? Это действие нельзя отменить."; + case Label.SaveBestTimesTitle: return "Сохранить лучшие времена?"; + case Label.SaveBestTimesDescription: return "Вы побили некоторые из своих лучших времен. Хотите обновить их?"; + case Label.Yes: return "Да"; + case Label.No: return "Нет"; + case Label.DontReset: return "Не сбрасывать"; + case Label.FailedToExportSplits: return "Не удалось экспортировать сплиты."; + case Label.CantImportEmptySplits: return "Нельзя импортировать пустые сплиты."; + case Label.FailedToReadFile: return "Не удалось прочитать файл:"; + case Label.FailedToImportSplits: return "Не удалось импортировать сплиты:"; + case Label.CouldNotParseSplits: return "Не удалось разобрать сплиты."; + case Label.LoadedSplitsInvalid: return "Загруженные сплиты недействительны."; + case Label.NewSegmentName: return "Время"; + case Label.EditWhileRunningError: return "Нельзя редактировать сплиты, пока таймер запущен."; + case Label.Edit: return "Редактировать"; + case Label.Save: return "Сохранить"; + case Label.Export: return "Экспорт"; + case Label.FailedToParseTimeSpan: return "Не удалось разобрать TimeSpan"; + case Label.Default: return "По умолчанию"; + case Label.Game: return "Игра"; + case Label.Category: return "Категория"; + case Label.StartTimerAt: return "Старт таймера с"; + case Label.Attempts: return "Попытки"; + case Label.SplitsEditor: return "Редактор сплитов"; + case Label.Variables: return "Переменные"; + case Label.Rules: return "Правила"; + case Label.Leaderboard: return "Таблица лидеров"; + case Label.InsertAbove: return "Вставить выше"; + case Label.InsertBelow: return "Вставить ниже"; + case Label.RemoveSegment: return "Удалить сегмент"; + case Label.MoveUp: return "Вверх"; + case Label.MoveDown: return "Вниз"; + case Label.AddVariable: return "Добавить переменную"; + case Label.OpenPbPage: return "Открыть страницу PB"; + case Label.AssociateRun: return "Связать забег"; + case Label.Icon: return "Иконка"; + case Label.SegmentName: return "Название сегмента"; + case Label.SplitTime: return "Время сплита"; + case Label.SegmentTime: return "Время сегмента"; + case Label.BestSegment: return "Лучший сегмент"; + case Label.SpeedrunComVariableTooltip: return "Переменная speedrun.com, специфичная для игры."; + case Label.Region: return "Регион"; + case Label.RegionDescription: return "Регион игры, в которую играют."; + case Label.Platform: return "Платформа"; + case Label.PlatformDescription: return "Платформа, на которой играют."; + case Label.UsesEmulator: return "Используется эмулятор"; + case Label.UsesEmulatorDescription: return "Используется ли эмулятор для игры."; + case Label.CustomVariableTooltip: return "Пользовательская переменная, заданная вами. Можно отображать в текстовом компоненте."; + case Label.NoVariables: return "Сейчас нет пользовательских переменных для этой игры."; + case Label.NoVariablesWithSpeedrunCom: return "Сейчас нет переменных speedrun.com или пользовательских переменных для этой игры."; + case Label.TimedWithoutLoads: return "измеряются без времени загрузок"; + case Label.TimedWithGameTime: return "измеряются по игровому времени"; + case Label.RequireVideoProof: return "требуют видео‑доказательство"; + case Label.RunsOfThisGamePrefix: return "Забеги этой игры "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "и"; + case Label.SetIcon: return "Установить иконку"; + case Label.SetIconDescription: return "Выберите изображение для иконки игры. Некоторые форматы могут не поддерживаться."; + case Label.DownloadBoxArt: return "Скачать обложку"; + case Label.DownloadBoxArtDescription: return "Пытается скачать обложку игры с speedrun.com и установить как иконку."; + case Label.DownloadIcon: return "Скачать иконку"; + case Label.DownloadIconDescription: return "Пытается скачать иконку игры с speedrun.com."; + case Label.RemoveIcon: return "Удалить иконку"; + case Label.RemoveIconDescription: return "Удаляет иконку игры."; + case Label.CleaningMenu: return "Очистка…"; + case Label.ClearOnlyHistory: return "Очистить только историю"; + case Label.ClearOnlyHistoryDescription: return "Сплиты хранят всю историю забегов. Эта операция очищает историю, не затрагивая PB, лучшие сегменты и сравнения."; + case Label.ClearAllTimes: return "Очистить все времена"; + case Label.ClearAllTimesDescription: return "Удаляет все времена и историю, делая сплиты пустыми."; + case Label.CleanSumOfBest: return "Очистить сумму лучших"; + case Label.CleanSumOfBestDescription: return "Позволяет интерактивно удалять проблемы в истории сегментов, влияющие на точность суммы лучших сегментов."; + case Label.ComparisonsMenu: return "Сравнения…"; + case Label.AddComparison: return "Добавить сравнение"; + case Label.AddComparisonDescription: return "Добавляет пользовательское сравнение для хранения времен."; + case Label.ImportComparison: return "Импортировать сравнение"; + case Label.ImportComparisonDescription: return "Импортирует Personal Best из файла сплитов как сравнение."; + case Label.GenerateGoalComparison: return "Сгенерировать сравнение цели"; + case Label.GenerateGoalComparisonDescription: return "Создает сравнение на основе целевого времени."; + case Label.CopyComparison: return "Копировать сравнение"; + case Label.CopyComparisonDescription: return "Копирует существующее сравнение в новое пользовательское сравнение."; + case Label.SetSegmentIcon: return "Установить иконку"; + case Label.SetSegmentIconDescription: return "Выберите изображение для иконки сегмента. Некоторые форматы могут не поддерживаться."; + case Label.RemoveSegmentIcon: return "Удалить иконку"; + case Label.RemoveSegmentIconDescription: return "Удаляет иконку сегмента."; + case Label.Rename: return "Переименовать"; + case Label.RenameDescription: return "Выберите новое имя для пользовательского сравнения. Зарезервированные или дублирующиеся имена нельзя использовать."; + case Label.CopyAction: return "Копировать"; + case Label.CopyDescription: return "Создает копию пользовательского сравнения."; + case Label.ACopy: return "Копия"; + case Label.Remove: return "Удалить"; + case Label.RemoveDescription: return "Удаляет пользовательское сравнение."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Укажите имя сравнения, которое хотите добавить:"; + case Label.ComparisonAddError: return "Не удалось добавить сравнение. Возможно, имя дублируется или зарезервировано."; + case Label.ImportComparisonPrompt: return "Укажите имя сравнения, которое хотите импортировать:"; + case Label.GenerateGoalComparisonPrompt: return "Укажите время, которого хотите достичь:"; + case Label.Generate: return "Сгенерировать"; + case Label.GenerateGoalComparisonError: return "Не удалось сгенерировать сравнение цели. Убедитесь, что время указано корректно."; + case Label.CopyComparisonPrompt: return "Укажите имя сравнения, которое хотите скопировать:"; + case Label.CopyComparisonError: return "Не удалось скопировать сравнение. Возможно, его не существует."; + case Label.NothingToCleanUp: return "Нечего очищать."; + case Label.CleanPrompt: return "Очистить?"; + case Label.AssociateRunPrompt: return "Укажите ID или URL speedrun.com для забега:"; + case Label.Associate: return "Связать"; + case Label.InvalidSpeedrunUrl: return "Недействительный ID или URL speedrun.com."; + case Label.AssociateRunError: return "Не удалось связать забег. ID может быть неверным."; + case Label.AddVariablePrompt: return "Укажите имя пользовательской переменной для добавления:"; + case Label.RenameComparison: return "Переименовать сравнение"; + case Label.RenameComparisonPrompt: return "Укажите новое имя сравнения:"; + case Label.ComparisonRenameError: return "Не удалось переименовать сравнение. Возможно, имя дублируется или зарезервировано."; + case Label.GameNotFound: return "Игра не найдена."; + case Label.NoBoxArt: return "У игры нет обложки."; + case Label.DownloadBoxArtError: return "Не удалось скачать обложку."; + case Label.NoGameIcon: return "У игры нет иконки."; + case Label.DownloadIconError: return "Не удалось скачать иконку."; + case Label.Rank: return "Место"; + case Label.Player: return "Игрок"; + case Label.Time: return "Время"; + case Label.Date: return "Дата:"; + case Label.Emulator: return "Эмулятор"; + case Label.EmulatorTag: return "Эмулятор"; + case Label.ObsoleteRuns: return "Устаревшие забеги"; + case Label.Shown: return "Показаны"; + case Label.Hidden: return "Скрыты"; + case Label.OpenLeaderboard: return "Открыть таблицу"; + case Label.Filters: return "Фильтры"; + case Label.LayoutEditor: return "Редактор макета"; + case Label.Component: return "Компонент"; + case Label.AddComponent: return "Добавить компонент"; + case Label.RemoveComponent: return "Удалить компонент"; + case Label.DuplicateComponent: return "Дублировать компонент"; + case Label.MoveComponentUp: return "Переместить компонент вверх"; + case Label.MoveComponentDown: return "Переместить компонент вниз"; + case Label.ComponentTitle: return "Заголовок"; + case Label.ComponentTitleDescription: return "Показывает название игры и категории, иконки, попытки и количество завершений."; + case Label.ComponentGraph: return "График"; + case Label.ComponentGraphDescription: return "Показывает опережение/отставание относительно сравнения по всем сплитам."; + case Label.ComponentSplitsDescription: return "Основной компонент времен сплитов. Таблица с прокруткой."; + case Label.ComponentDetailedTimer: return "Детальный таймер"; + case Label.ComponentDetailedTimerDescription: return "Показывает общее время и время текущего сегмента."; + case Label.ComponentTimer: return "Таймер"; + case Label.ComponentTimerDescription: return "Показывает общее время в цифровом виде; цвет зависит от сравнения."; + case Label.ComponentCurrentComparison: return "Текущее сравнение"; + case Label.ComponentCurrentComparisonDescription: return "Показывает имя текущего сравнения."; + case Label.ComponentCurrentPace: return "Текущий темп"; + case Label.ComponentCurrentPaceDescription: return "Прогнозирует финальное время на основе выбранного сравнения."; + case Label.ComponentDelta: return "Разница"; + case Label.ComponentDeltaDescription: return "Показывает опережение/отставание относительно сравнения."; + case Label.ComponentPbChance: return "Шанс PB"; + case Label.ComponentPbChanceDescription: return "Показывает вероятность получения PB."; + case Label.ComponentPossibleTimeSave: return "Возможная экономия времени"; + case Label.ComponentPossibleTimeSaveDescription: return "Показывает возможную экономию времени в текущем сегменте."; + case Label.ComponentPreviousSegment: return "Предыдущий сегмент"; + case Label.ComponentPreviousSegmentDescription: return "Показывает прирост/потерю и потенциальную экономию предыдущего сегмента."; + case Label.ComponentSegmentTime: return "Время сегмента"; + case Label.ComponentSegmentTimeDescription: return "Показывает время сегмента для выбранного сравнения."; + case Label.ComponentSumOfBest: return "Сумма лучших"; + case Label.ComponentSumOfBestDescription: return "Показывает самое быстрое возможное время на основе истории."; + case Label.ComponentText: return "Текст"; + case Label.ComponentTextDescription: return "Показывает центральный/левый/правый текст и пользовательские переменные."; + case Label.ComponentTotalPlaytime: return "Общее время игры"; + case Label.ComponentTotalPlaytimeDescription: return "Показывает общее время игры в категории."; + case Label.ComponentVariableDescription: return "Создает текст, показывающий значение пользовательской переменной «{name}»."; + case Label.ComponentBlankSpace: return "Пустое место"; + case Label.ComponentBlankSpaceDescription: return "Пустой компонент только с фоном."; + case Label.ComponentSeparator: return "Разделитель"; + case Label.ComponentSeparatorDescription: return "Показывает разделительную линию между компонентами."; + case Label.AccuracySeconds: return "Секунды"; + case Label.AccuracyTenths: return "Десятые"; + case Label.AccuracyHundredths: return "Сотые"; + case Label.AccuracyMilliseconds: return "Миллисекунды"; + case Label.FontStyle: return "Стиль"; + case Label.FontWeight: return "Вес"; + case Label.FontStretch: return "Растяжение"; + case Label.FontStyleNormal: return "Обычный"; + case Label.FontStyleItalic: return "Курсив"; + case Label.AlignmentAutomatic: return "Автоматически"; + case Label.AlignmentLeft: return "Слева"; + case Label.AlignmentCenter: return "По центру"; + case Label.GradientTransparent: return "Прозрачный"; + case Label.GradientPlain: return "Однотонный"; + case Label.GradientVertical: return "Вертикальный"; + case Label.GradientHorizontal: return "Горизонтальный"; + case Label.GradientAlternating: return "Чередующийся"; + case Label.GradientPlainDelta: return "Однотонная дельта"; + case Label.GradientVerticalDelta: return "Вертикальная дельта"; + case Label.GradientHorizontalDelta: return "Горизонтальная дельта"; + case Label.LayoutBackgroundImage: return "Изображение"; + case Label.LayoutBackgroundBrightness: return "Яркость"; + case Label.LayoutBackgroundOpacity: return "Непрозрачность"; + case Label.LayoutBackgroundBlur: return "Размытие"; + case Label.LayoutDirectionVertical: return "Вертикальный"; + case Label.LayoutDirectionHorizontal: return "Горизонтальный"; + case Label.ColumnKindTime: return "Время"; + case Label.ColumnKindVariable: return "Переменная"; + case Label.ColumnStartWithEmpty: return "Пусто"; + case Label.ColumnStartWithComparisonTime: return "Время сравнения"; + case Label.ColumnStartWithComparisonSegmentTime: return "Время сегмента сравнения"; + case Label.ColumnStartWithPossibleTimeSave: return "Возможная экономия времени"; + case Label.ColumnUpdateWithDontUpdate: return "Не обновлять"; + case Label.ColumnUpdateWithSplitTime: return "Время сплита"; + case Label.ColumnUpdateWithDelta: return "Опережение / отставание"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Опережение / отставание или время сплита, если пусто"; + case Label.ColumnUpdateWithSegmentTime: return "Время сегмента"; + case Label.ColumnUpdateWithSegmentDelta: return "Время сэкономлено / потеряно"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Время сэкономлено / потеряно или время сегмента, если пусто"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "При начале сегмента"; + case Label.ColumnUpdateTriggerContextual: return "Контекстно"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "При завершении сегмента"; + case Label.ComparisonCurrentComparison: return "Текущее сравнение"; + case Label.CustomVariableNoneAvailable: return "Нет доступных переменных"; + case Label.CustomVariableNoneAvailableTooltip: return "Пользовательские переменные можно определить на вкладке «Переменные» при редактировании сплитов. Дополнительные пользовательские переменные могут автоматически предоставляться авто‑сплиттерами."; + case Label.HotkeyButtonTooltip: return "Нажмите, чтобы записать горячую клавишу. Также можно использовать кнопки геймпада. Глобальные горячие клавиши сейчас невозможны. Кнопки геймпада работают глобально."; + case Label.ServerConnect: return "Подключиться"; + case Label.ServerDisconnect: return "Отключиться"; + case Label.ServerConnecting: return "Подключение..."; + case Label.ServerDisconnecting: return "Отключение..."; + case Label.ConnectToServerTitle: return "Подключиться к серверу"; + case Label.ConnectToServerDescription: return "Укажите URL WebSocket:"; + case Label.Connect: return "Подключиться"; + case Label.UpdateAvailable: return "Доступна новая версия LiveSplit One! Нажмите здесь, чтобы перезагрузить."; + case Label.UnsavedChangesBeforeUnload: return "Есть несохранённые изменения. Вы действительно хотите закрыть LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Открыть боковую панель"; + case Label.FailedToSaveLayout: return "Не удалось сохранить раскладку."; + case Label.FailedToSaveHotkeys: return "Не удалось сохранить настройки горячих клавиш."; + case Label.FailedToSaveGeneralSettings: return "Не удалось сохранить общие настройки."; + case Label.FailedToSaveSplits: return "Не удалось сохранить сплиты."; + case Label.LayoutCouldNotBeLoaded: return "Не удалось загрузить раскладку. Возможно, это недействительная раскладка LiveSplit или LiveSplit One."; + case Label.EmptySplitsNotSupported: return "Пустые сплиты не поддерживаются."; + case Label.BugEncountered: return "Вы столкнулись с ошибкой:"; + case Label.PleaseReportIssueStart: return "Пожалуйста, сообщите об этой проблеме "; + case Label.ReportHere: return "здесь"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Чтобы помочь нам исправить эту проблему, укажите шаги для воспроизведения и приложите сплиты и раскладку, которые вы использовали, когда возникла проблема."; + case Label.LoadFailedPrivateBrowsing: return "Не удалось загрузить LiveSplit One.\nВозможно, вы используете режим приватного просмотра.\nLiveSplit One не может сохранять сплиты, раскладки или другие настройки из‑за ограничений приватного режима браузера.\nЭти ограничения могут быть сняты в будущем.\nЧтобы использовать LiveSplit One сейчас, отключите приватный режим в настройках."; + case Label.LoadFailedOutdatedBrowser: return "Не удалось загрузить LiveSplit One.\nВозможно, вы используете устаревший браузер.\nОбновите браузер или версию iOS и попробуйте снова.\nДругая причина может быть в расширении браузера, например блокировщике рекламы, которое блокирует доступ к важным скриптам."; + } +} diff --git a/src/localization/spanish.ts b/src/localization/spanish.ts new file mode 100644 index 000000000..224deb2b8 --- /dev/null +++ b/src/localization/spanish.ts @@ -0,0 +1,310 @@ +import { Label } from "."; + +export function resolveSpanish(text: Label): string { + switch (text) { + case Label.Ok: return "Aceptar"; + case Label.Cancel: return "Cancelar"; + case Label.Settings: return "Configuración"; + case Label.Language: return "Idioma"; + case Label.LanguageDescription: return "Establece el idioma utilizado en la aplicación."; + case Label.LanguageAuto: return "Automático"; + case Label.HotkeysHeading: return "Atajos de teclado"; + case Label.GeneralHeading: return "General"; + case Label.NetworkHeading: return "Red"; + case Label.FrameRate: return "Tasa de fotogramas"; + case Label.FrameRateDescription: return "Determina la tasa de fotogramas a la que se muestra el temporizador. «Consciente de la batería» intenta determinar el tipo de dispositivo y el estado de carga para elegir una buena tasa de fotogramas. «Igualar a la pantalla» hace que el temporizador coincida con la tasa de refresco de la pantalla."; + case Label.FrameRateBatteryAware: return "Consciente de la batería"; + case Label.FrameRateMatchScreen: return "Igualar a la pantalla"; + case Label.SaveOnReset: return "Guardar al reiniciar"; + case Label.SaveOnResetDescription: return "Determina si los splits se guardan automáticamente al reiniciar el temporizador."; + case Label.ShowControlButtons: return "Mostrar botones de control"; + case Label.ShowControlButtonsDescription: return "Determina si se muestran botones debajo del temporizador que permiten controlarlo. Cuando está desactivado, debes usar los atajos de teclado."; + case Label.ShowManualGameTimeInput: return "Mostrar entrada manual del tiempo de juego"; + case Label.ShowManualGameTimeInputDescription: return "Muestra un cuadro de texto debajo del temporizador que te permite introducir manualmente el tiempo de juego. Inicias el temporizador y haces splits presionando la tecla Enter en el cuadro de texto. Asegúrate de comparar con «Game Time»."; + case Label.ManualGameTimeMode: return "Modo de tiempo de juego manual"; + case Label.ManualGameTimeModeDescription: return "Determina si el tiempo de juego manual se introduce como tiempos de segmento o tiempos de split."; + case Label.ManualGameTimeModeSegmentTimes: return "Tiempos de segmento"; + case Label.ManualGameTimeModeSplitTimes: return "Tiempos de split"; + case Label.AlwaysOnTop: return "Siempre encima"; + case Label.AlwaysOnTopDescription: return "Mantiene la ventana siempre encima de otras ventanas."; + case Label.SpeedrunComIntegration: return "Integración con Speedrun.com"; + case Label.SpeedrunComIntegrationDescription: return "Consulta la lista de juegos, categorías y tablas de clasificación de speedrun.com."; + case Label.ServerConnection: return "Conexión al servidor"; + case Label.ServerConnectionDescription: return "Permite conectarte a un servidor WebSocket que puede controlar el temporizador enviando varios comandos. Los comandos actualmente son un subconjunto de los comandos compatibles con el LiveSplit original."; + case Label.ServerConnectionExperimental: return "Esta función es experimental y es probable que el protocolo cambie en el futuro."; + case Label.HotkeyAlreadyInUse: return "El atajo de teclado ya está en uso."; + case Label.Start: return "Iniciar"; + case Label.Resume: return "Reanudar"; + case Label.Pause: return "Pausar"; + case Label.UndoSplit: return "Deshacer split"; + case Label.Reset: return "Reiniciar"; + case Label.SkipSplit: return "Saltar split"; + case Label.ManualGameTimePlaceholder: return "Tiempo de juego manual"; + case Label.LiveSplitLogoAlt: return "Logotipo de LiveSplit"; + case Label.LiveSplitOne: return "LiveSplit One"; + case Label.Splits: return "Splits"; + case Label.Layout: return "Diseño"; + case Label.CompareAgainst: return "Comparar con"; + case Label.RealTime: return "Tiempo real"; + case Label.GameTime: return "Tiempo de juego"; + case Label.PopOut: return "Ventana emergente"; + case Label.About: return "Acerca de"; + case Label.Back: return "Atrás"; + case Label.AboutVersionPrefix: return "Versión:"; + case Label.AboutDescription: return "LiveSplit One es una versión multiplataforma de LiveSplit, el elegante y altamente personalizable temporizador para speedrunners."; + case Label.AboutViewSource: return "Ver el código fuente en GitHub"; + case Label.AboutRecentChanges: return "Cambios recientes"; + case Label.AboutContributors: return "Colaboradores"; + case Label.Loading: return "Cargando..."; + case Label.Add: return "Agregar"; + case Label.Import: return "Importar"; + case Label.OpenSplits: return "Abrir splits"; + case Label.EditSplits: return "Editar splits"; + case Label.ExportSplits: return "Exportar splits"; + case Label.CopySplits: return "Copiar splits"; + case Label.RemoveSplits: return "Eliminar splits"; + case Label.Untitled: return "Sin título"; + case Label.NoCategory: return "—"; + case Label.DiscardChangesTitle: return "¿Descartar cambios?"; + case Label.DiscardChangesDescription: return "Tus splits actuales están modificados y tienen cambios sin guardar. ¿Quieres continuar y descartar esos cambios?"; + case Label.DeleteSplitsTitle: return "¿Eliminar splits?"; + case Label.DeleteSplitsDescription: return "¿Seguro que quieres eliminar los splits? Esta operación no se puede deshacer."; + case Label.SaveBestTimesTitle: return "¿Guardar mejores tiempos?"; + case Label.SaveBestTimesDescription: return "Has superado algunos de tus mejores tiempos. ¿Quieres actualizarlos?"; + case Label.Yes: return "Sí"; + case Label.No: return "No"; + case Label.DontReset: return "No reiniciar"; + case Label.FailedToExportSplits: return "No se pudieron exportar los splits."; + case Label.CantImportEmptySplits: return "No se pueden importar splits vacíos."; + case Label.FailedToReadFile: return "No se pudo leer el archivo:"; + case Label.FailedToImportSplits: return "No se pudieron importar los splits:"; + case Label.CouldNotParseSplits: return "No se pudieron analizar los splits."; + case Label.LoadedSplitsInvalid: return "Los splits cargados no son válidos."; + case Label.NewSegmentName: return "Tiempo"; + case Label.EditWhileRunningError: return "No puedes editar los splits mientras el temporizador está en marcha."; + case Label.Edit: return "Editar"; + case Label.Save: return "Guardar"; + case Label.Export: return "Exportar"; + case Label.FailedToParseTimeSpan: return "No se pudo analizar TimeSpan"; + case Label.Default: return "Predeterminado"; + case Label.Game: return "Juego"; + case Label.Category: return "Categoría"; + case Label.StartTimerAt: return "Iniciar temporizador en"; + case Label.Attempts: return "Intentos"; + case Label.SplitsEditor: return "Editor de splits"; + case Label.Variables: return "Variables"; + case Label.Rules: return "Reglas"; + case Label.Leaderboard: return "Clasificación"; + case Label.InsertAbove: return "Insertar arriba"; + case Label.InsertBelow: return "Insertar abajo"; + case Label.RemoveSegment: return "Eliminar segmento"; + case Label.MoveUp: return "Subir"; + case Label.MoveDown: return "Bajar"; + case Label.AddVariable: return "Agregar variable"; + case Label.OpenPbPage: return "Abrir página PB"; + case Label.AssociateRun: return "Asociar run"; + case Label.Icon: return "Icono"; + case Label.SegmentName: return "Nombre del segmento"; + case Label.SplitTime: return "Tiempo del split"; + case Label.SegmentTime: return "Tiempo del segmento"; + case Label.BestSegment: return "Mejor segmento"; + case Label.SpeedrunComVariableTooltip: return "Variable de speedrun.com específica del juego."; + case Label.Region: return "Región"; + case Label.RegionDescription: return "La región del juego que se está jugando."; + case Label.Platform: return "Plataforma"; + case Label.PlatformDescription: return "La plataforma en la que se juega."; + case Label.UsesEmulator: return "Usa emulador"; + case Label.UsesEmulatorDescription: return "Si se está usando un emulador para jugar."; + case Label.CustomVariableTooltip: return "Variable personalizada definida por ti. Puede mostrarse con el componente de texto."; + case Label.NoVariables: return "Actualmente no hay variables personalizadas para este juego."; + case Label.NoVariablesWithSpeedrunCom: return "Actualmente no hay variables de speedrun.com ni variables personalizadas para este juego."; + case Label.TimedWithoutLoads: return "se cronometran sin tiempos de carga"; + case Label.TimedWithGameTime: return "se cronometran con Game Time"; + case Label.RequireVideoProof: return "requieren prueba en vídeo"; + case Label.RunsOfThisGamePrefix: return "Las runs de este juego "; + case Label.RunsOfThisGameSuffix: return "."; + case Label.And: return "y"; + case Label.SetIcon: return "Establecer icono"; + case Label.SetIconDescription: return "Elige una imagen como icono del juego. Algunos formatos pueden no funcionar en todas partes."; + case Label.DownloadBoxArt: return "Descargar carátula"; + case Label.DownloadBoxArtDescription: return "Intenta descargar la carátula de speedrun.com para usarla como icono del juego."; + case Label.DownloadIcon: return "Descargar icono"; + case Label.DownloadIconDescription: return "Intenta descargar el icono del juego desde speedrun.com."; + case Label.RemoveIcon: return "Quitar icono"; + case Label.RemoveIconDescription: return "Quita el icono del juego."; + case Label.CleaningMenu: return "Limpieza…"; + case Label.ClearOnlyHistory: return "Borrar solo historial"; + case Label.ClearOnlyHistoryDescription: return "Los splits guardan todo el historial de runs. Esto borra el historial sin afectar PB, mejores segmentos ni comparaciones."; + case Label.ClearAllTimes: return "Borrar todos los tiempos"; + case Label.ClearAllTimesDescription: return "Elimina todos los tiempos y el historial, dejando los splits vacíos."; + case Label.CleanSumOfBest: return "Limpiar suma de mejores"; + case Label.CleanSumOfBestDescription: return "Permite eliminar problemas en el historial de segmentos que hacen que la suma de mejores segmentos sea inexacta."; + case Label.ComparisonsMenu: return "Comparaciones…"; + case Label.AddComparison: return "Agregar comparación"; + case Label.AddComparisonDescription: return "Agrega una comparación personalizada donde puedes guardar tiempos."; + case Label.ImportComparison: return "Importar comparación"; + case Label.ImportComparisonDescription: return "Importa el Personal Best de un archivo de splits como comparación."; + case Label.GenerateGoalComparison: return "Generar comparación de objetivo"; + case Label.GenerateGoalComparisonDescription: return "Genera una comparación de objetivo basada en un tiempo objetivo."; + case Label.CopyComparison: return "Copiar comparación"; + case Label.CopyComparisonDescription: return "Copia una comparación existente como nueva comparación personalizada."; + case Label.SetSegmentIcon: return "Establecer icono"; + case Label.SetSegmentIconDescription: return "Elige una imagen como icono del segmento. Algunos formatos pueden no funcionar en todas partes."; + case Label.RemoveSegmentIcon: return "Quitar icono"; + case Label.RemoveSegmentIconDescription: return "Quita el icono del segmento."; + case Label.Rename: return "Renombrar"; + case Label.RenameDescription: return "Elige un nuevo nombre para la comparación personalizada. Nombres reservados o duplicados no están permitidos."; + case Label.CopyAction: return "Copiar"; + case Label.CopyDescription: return "Crea una copia de la comparación personalizada."; + case Label.ACopy: return "Copia"; + case Label.Remove: return "Eliminar"; + case Label.RemoveDescription: return "Elimina la comparación personalizada."; + case Label.AnyPercent: return "Any%"; + case Label.LowPercent: return "Low%"; + case Label.HundredPercent: return "100%"; + case Label.AddComparisonPrompt: return "Especifica el nombre de la comparación que quieres agregar:"; + case Label.ComparisonAddError: return "No se pudo agregar la comparación. Puede estar duplicada o ser un nombre reservado."; + case Label.ImportComparisonPrompt: return "Especifica el nombre de la comparación que quieres importar:"; + case Label.GenerateGoalComparisonPrompt: return "Especifica el tiempo que quieres alcanzar:"; + case Label.Generate: return "Generar"; + case Label.GenerateGoalComparisonError: return "Error al generar la comparación de objetivo. Asegúrate de indicar un tiempo válido."; + case Label.CopyComparisonPrompt: return "Especifica el nombre de la comparación que quieres copiar:"; + case Label.CopyComparisonError: return "Error al copiar la comparación. La comparación puede no existir."; + case Label.NothingToCleanUp: return "No hay nada que limpiar."; + case Label.CleanPrompt: return "¿Limpiar?"; + case Label.AssociateRunPrompt: return "Especifica el ID o URL de speedrun.com de la run:"; + case Label.Associate: return "Asociar"; + case Label.InvalidSpeedrunUrl: return "ID o URL de speedrun.com inválido."; + case Label.AssociateRunError: return "No se pudo asociar la run. El ID puede no ser válido."; + case Label.AddVariablePrompt: return "Especifica el nombre de la variable personalizada que quieres agregar:"; + case Label.RenameComparison: return "Renombrar comparación"; + case Label.RenameComparisonPrompt: return "Especifica el nuevo nombre de la comparación:"; + case Label.ComparisonRenameError: return "No se pudo renombrar la comparación. Puede estar duplicada o ser un nombre reservado."; + case Label.GameNotFound: return "No se encontró el juego."; + case Label.NoBoxArt: return "El juego no tiene carátula."; + case Label.DownloadBoxArtError: return "No se pudo descargar la carátula."; + case Label.NoGameIcon: return "El juego no tiene icono."; + case Label.DownloadIconError: return "No se pudo descargar el icono."; + case Label.Rank: return "Puesto"; + case Label.Player: return "Jugador"; + case Label.Time: return "Tiempo"; + case Label.Date: return "Fecha:"; + case Label.Emulator: return "Emulador"; + case Label.EmulatorTag: return "Emulador"; + case Label.ObsoleteRuns: return "Runs obsoletas"; + case Label.Shown: return "Mostradas"; + case Label.Hidden: return "Ocultas"; + case Label.OpenLeaderboard: return "Abrir clasificación"; + case Label.Filters: return "Filtros"; + case Label.LayoutEditor: return "Editor de diseño"; + case Label.Component: return "Componente"; + case Label.AddComponent: return "Agregar componente"; + case Label.RemoveComponent: return "Eliminar componente"; + case Label.DuplicateComponent: return "Duplicar componente"; + case Label.MoveComponentUp: return "Mover componente hacia arriba"; + case Label.MoveComponentDown: return "Mover componente hacia abajo"; + case Label.ComponentTitle: return "Título"; + case Label.ComponentTitleDescription: return "Muestra el nombre del juego y la categoría, iconos, intentos y número de finalizaciones."; + case Label.ComponentGraph: return "Gráfico"; + case Label.ComponentGraphDescription: return "Muestra el adelanto/retraso respecto a la comparación en todos los splits."; + case Label.ComponentSplitsDescription: return "El componente principal de los tiempos de split. Muestra una tabla desplazable."; + case Label.ComponentDetailedTimer: return "Temporizador detallado"; + case Label.ComponentDetailedTimerDescription: return "Muestra el tiempo total y el tiempo del segmento actual."; + case Label.ComponentTimer: return "Temporizador"; + case Label.ComponentTimerDescription: return "Muestra el tiempo total en formato digital; el color depende de la comparación."; + case Label.ComponentCurrentComparison: return "Comparación actual"; + case Label.ComponentCurrentComparisonDescription: return "Muestra el nombre de la comparación actual."; + case Label.ComponentCurrentPace: return "Ritmo actual"; + case Label.ComponentCurrentPaceDescription: return "Predice el tiempo final según la comparación seleccionada."; + case Label.ComponentDelta: return "Diferencia"; + case Label.ComponentDeltaDescription: return "Muestra el adelanto/retraso respecto a la comparación."; + case Label.ComponentPbChance: return "Probabilidad de PB"; + case Label.ComponentPbChanceDescription: return "Muestra la probabilidad de conseguir un PB."; + case Label.ComponentPossibleTimeSave: return "Ahorro de tiempo posible"; + case Label.ComponentPossibleTimeSaveDescription: return "Muestra el tiempo que se puede ahorrar en el segmento actual."; + case Label.ComponentPreviousSegment: return "Segmento anterior"; + case Label.ComponentPreviousSegmentDescription: return "Muestra la ganancia/pérdida y el ahorro potencial del segmento anterior."; + case Label.ComponentSegmentTime: return "Tiempo de segmento"; + case Label.ComponentSegmentTimeDescription: return "Muestra el tiempo del segmento para la comparación seleccionada."; + case Label.ComponentSumOfBest: return "Suma de mejores"; + case Label.ComponentSumOfBestDescription: return "Muestra el tiempo más rápido posible según el historial."; + case Label.ComponentText: return "Texto"; + case Label.ComponentTextDescription: return "Muestra texto central/izquierda/derecha y variables personalizadas."; + case Label.ComponentTotalPlaytime: return "Tiempo total de juego"; + case Label.ComponentTotalPlaytimeDescription: return "Muestra el tiempo total jugado en la categoría."; + case Label.ComponentVariableDescription: return "Crea texto que muestra el valor de la variable personalizada «{name}»."; + case Label.ComponentBlankSpace: return "Espacio en blanco"; + case Label.ComponentBlankSpaceDescription: return "Componente vacío con solo el fondo."; + case Label.ComponentSeparator: return "Separador"; + case Label.ComponentSeparatorDescription: return "Muestra una línea separadora entre componentes."; + case Label.AccuracySeconds: return "Segundos"; + case Label.AccuracyTenths: return "Décimas"; + case Label.AccuracyHundredths: return "Centésimas"; + case Label.AccuracyMilliseconds: return "Milisegundos"; + case Label.FontStyle: return "Estilo"; + case Label.FontWeight: return "Peso"; + case Label.FontStretch: return "Estiramiento"; + case Label.FontStyleNormal: return "Normal"; + case Label.FontStyleItalic: return "Cursiva"; + case Label.AlignmentAutomatic: return "Automático"; + case Label.AlignmentLeft: return "Izquierda"; + case Label.AlignmentCenter: return "Centro"; + case Label.GradientTransparent: return "Transparente"; + case Label.GradientPlain: return "Sólido"; + case Label.GradientVertical: return "Vertical"; + case Label.GradientHorizontal: return "Horizontal"; + case Label.GradientAlternating: return "Alternado"; + case Label.GradientPlainDelta: return "Delta sólido"; + case Label.GradientVerticalDelta: return "Delta vertical"; + case Label.GradientHorizontalDelta: return "Delta horizontal"; + case Label.LayoutBackgroundImage: return "Imagen"; + case Label.LayoutBackgroundBrightness: return "Brillo"; + case Label.LayoutBackgroundOpacity: return "Opacidad"; + case Label.LayoutBackgroundBlur: return "Desenfoque"; + case Label.LayoutDirectionVertical: return "Vertical"; + case Label.LayoutDirectionHorizontal: return "Horizontal"; + case Label.ColumnKindTime: return "Tiempo"; + case Label.ColumnKindVariable: return "Variable"; + case Label.ColumnStartWithEmpty: return "Vacío"; + case Label.ColumnStartWithComparisonTime: return "Tiempo de comparación"; + case Label.ColumnStartWithComparisonSegmentTime: return "Tiempo de segmento de comparación"; + case Label.ColumnStartWithPossibleTimeSave: return "Tiempo posible de ahorrar"; + case Label.ColumnUpdateWithDontUpdate: return "No actualizar"; + case Label.ColumnUpdateWithSplitTime: return "Tiempo del split"; + case Label.ColumnUpdateWithDelta: return "Tiempo a favor / en contra"; + case Label.ColumnUpdateWithDeltaWithFallback: return "Tiempo a favor / en contra o tiempo del split si está vacío"; + case Label.ColumnUpdateWithSegmentTime: return "Tiempo de segmento"; + case Label.ColumnUpdateWithSegmentDelta: return "Tiempo ganado / perdido"; + case Label.ColumnUpdateWithSegmentDeltaWithFallback: return "Tiempo ganado / perdido o tiempo de segmento si está vacío"; + case Label.ColumnUpdateTriggerOnStartingSegment: return "Al iniciar el segmento"; + case Label.ColumnUpdateTriggerContextual: return "Contextual"; + case Label.ColumnUpdateTriggerOnEndingSegment: return "Al terminar el segmento"; + case Label.ComparisonCurrentComparison: return "Comparación actual"; + case Label.CustomVariableNoneAvailable: return "No hay variables disponibles"; + case Label.CustomVariableNoneAvailableTooltip: return "Las variables personalizadas se pueden definir en la pestaña Variables al editar splits. Variables personalizadas adicionales pueden ser proporcionadas automáticamente por auto splitters."; + case Label.HotkeyButtonTooltip: return "Haz clic para grabar un atajo. También puedes usar botones de gamepad. Los atajos globales no son posibles actualmente. Los botones del gamepad funcionan de forma global."; + case Label.ServerConnect: return "Conectar"; + case Label.ServerDisconnect: return "Desconectar"; + case Label.ServerConnecting: return "Conectando..."; + case Label.ServerDisconnecting: return "Desconectando..."; + case Label.ConnectToServerTitle: return "Conectar al servidor"; + case Label.ConnectToServerDescription: return "Indica la URL de WebSocket:"; + case Label.Connect: return "Conectar"; + case Label.UpdateAvailable: return "¡Hay una nueva versión de LiveSplit One disponible! Haz clic aquí para recargar."; + case Label.UnsavedChangesBeforeUnload: return "Hay cambios sin guardar. ¿Seguro que quieres cerrar LiveSplit One?"; + case Label.OpenSidebarAriaLabel: return "Abrir barra lateral"; + case Label.FailedToSaveLayout: return "No se pudo guardar el diseño."; + case Label.FailedToSaveHotkeys: return "No se pudieron guardar los atajos de teclado."; + case Label.FailedToSaveGeneralSettings: return "No se pudieron guardar los ajustes generales."; + case Label.FailedToSaveSplits: return "No se pudieron guardar los splits."; + case Label.LayoutCouldNotBeLoaded: return "No se pudo cargar el diseño. Es posible que no sea un diseño válido de LiveSplit o LiveSplit One."; + case Label.EmptySplitsNotSupported: return "No se admiten splits vacíos."; + case Label.BugEncountered: return "Encontraste un error:"; + case Label.PleaseReportIssueStart: return "Por favor, informa de este problema "; + case Label.ReportHere: return "aquí"; + case Label.PleaseReportIssueEnd: return "."; + case Label.BugReportInstructions: return "Para ayudarnos a corregir este problema, incluye los pasos para reproducirlo y adjunta los splits y el diseño que estabas usando cuando ocurrió el problema."; + case Label.LoadFailedPrivateBrowsing: return "No se pudo cargar LiveSplit One.\nEs posible que estés en modo de navegación privada.\nLiveSplit One no puede almacenar splits, diseños u otros ajustes debido a las limitaciones de la navegación privada del navegador.\nEstas limitaciones podrían eliminarse en el futuro.\nPara usar LiveSplit One por ahora, desactiva la navegación privada en tus ajustes."; + case Label.LoadFailedOutdatedBrowser: return "No se pudo cargar LiveSplit One.\nEs posible que estés usando un navegador desactualizado.\nActualiza tu navegador o tu versión de iOS e inténtalo de nuevo.\nOtra posible causa es una extensión del navegador, como un bloqueador de anuncios, que esté bloqueando el acceso a scripts importantes."; + } +} diff --git a/src/platform/Hotkeys.ts b/src/platform/Hotkeys.ts index 6a1802141..b8a3351b4 100644 --- a/src/platform/Hotkeys.ts +++ b/src/platform/Hotkeys.ts @@ -1,9 +1,9 @@ -import { CommandSinkRef, HotkeyConfig, HotkeySystem } from "../livesplit-core"; +import { CommandSinkRef, HotkeyConfig, HotkeySystem, Language } from "../livesplit-core"; import { expect } from "../util/OptionUtil"; export interface HotkeyImplementation { ptr?: number; - config(): Promise | HotkeyConfig; + config(lang: Language | undefined): Promise | HotkeyConfig; setConfig(config: HotkeyConfig): void; activate(): void; deactivate(): void; @@ -13,12 +13,13 @@ export interface HotkeyImplementation { class GlobalHotkeys implements HotkeyImplementation { constructor(private hotkeySystem?: HotkeySystem) { } - public async config(): Promise { + public async config(lang: Language | undefined): Promise { return expect( HotkeyConfig.parseJson( await window.__TAURI__!.core.invoke("get_hotkey_config"), ), "Couldn't parse the hotkey config.", + lang, ); } @@ -67,6 +68,7 @@ class GlobalHotkeys implements HotkeyImplementation { export function createHotkeys( commandSink: CommandSinkRef, configJson: unknown, + lang: Language | undefined, ): HotkeyImplementation { let hotkeySystem: HotkeySystem | null = null; @@ -86,6 +88,7 @@ export function createHotkeys( hotkeySystem = expect( HotkeySystem.new(commandSink), "Couldn't initialize the hotkeys", + lang, ); } } diff --git a/src/storage/index.ts b/src/storage/index.ts index 11bd2086f..2e54c19ec 100644 --- a/src/storage/index.ts +++ b/src/storage/index.ts @@ -1,11 +1,12 @@ import { openDB, IDBPDatabase } from "idb"; import { Option, assert } from "../util/OptionUtil"; -import { RunRef, Run, TimingMethod } from "../livesplit-core"; +import { RunRef, Run, TimingMethod, Language } from "../livesplit-core"; import { GeneralSettings, MANUAL_GAME_TIME_SETTINGS_DEFAULT, } from "../ui/views/MainSettings"; import { FRAME_RATE_AUTOMATIC } from "../util/FrameRate"; +import { fromLocaleOpt, getLocaleOpt, setHtmlLang } from "../localization"; export type HotkeyConfigSettings = unknown; export type LayoutSettings = unknown; @@ -114,15 +115,16 @@ function getDb(): Promise> { export async function storeRunWithoutDisposing( run: RunRef, key: number | undefined, + lang: Language | undefined, ) { await storeSplits((callback) => { callback(run, run.saveAsLssBytes()); - }, key); + }, key, lang); } -export async function storeRunAndDispose(run: Run, key: number | undefined) { +export async function storeRunAndDispose(run: Run, key: number | undefined, lang: Language | undefined) { try { - await storeRunWithoutDisposing(run, key); + await storeRunWithoutDisposing(run, key, lang); } finally { run[Symbol.dispose](); } @@ -131,6 +133,7 @@ export async function storeRunAndDispose(run: Run, key: number | undefined) { export async function storeSplits( callback: (callback: (run: RunRef, lssBytes: Uint8Array) => void) => void, key: number | undefined, + lang: Language | undefined, ): Promise { const db = await getDb(); @@ -146,7 +149,7 @@ export async function storeSplits( await tx.done; - assert(promise !== null, "Callback needs to actually run"); + assert(promise !== null, "Callback needs to actually run", lang); return promise; } @@ -245,7 +248,12 @@ export async function loadSplitsKey(): Promise { export async function storeGeneralSettings(generalSettings: GeneralSettings) { const db = await getDb(); - await db.put("settings", generalSettings, "generalSettings"); + const storedSettings = { + ...generalSettings, + lang: getLocaleOpt(generalSettings.lang), + }; + + await db.put("settings", storedSettings, "generalSettings"); } export async function loadGeneralSettings(): Promise { @@ -259,6 +267,10 @@ export async function loadGeneralSettings(): Promise { generalSettings.showManualGameTime = MANUAL_GAME_TIME_SETTINGS_DEFAULT; } + const lang = fromLocaleOpt(generalSettings.lang); + + setHtmlLang(lang); + return { frameRate: generalSettings.frameRate ?? FRAME_RATE_AUTOMATIC, showControlButtons: generalSettings.showControlButtons ?? !isTauri, @@ -268,6 +280,7 @@ export async function loadGeneralSettings(): Promise { serverUrl: generalSettings.serverUrl, alwaysOnTop: generalSettings.alwaysOnTop ?? (isTauri ? true : undefined), + lang, }; } diff --git a/src/type-definitions/webpack-globals.d.ts b/src/type-definitions/webpack-globals.d.ts index bcfec398e..01b663f0a 100644 --- a/src/type-definitions/webpack-globals.d.ts +++ b/src/type-definitions/webpack-globals.d.ts @@ -11,5 +11,6 @@ declare interface Contributor { declare interface ChangelogEntry { id: string; message: string; + messages?: Record; date: string; } diff --git a/src/ui/LiveSplit.tsx b/src/ui/LiveSplit.tsx index f3abb424d..0d71439ef 100644 --- a/src/ui/LiveSplit.tsx +++ b/src/ui/LiveSplit.tsx @@ -14,6 +14,7 @@ import { TimerPhase, Event, LayoutRefMut, + Language, } from "../livesplit-core"; import { Layout as ShowLayout } from "./components/Layout"; import { @@ -65,6 +66,7 @@ import "react-toastify/dist/ReactToastify.css"; import * as classes from "../css/LiveSplit.module.scss"; import * as sidebarClasses from "../css/Sidebar.module.scss"; import * as toastClasses from "../css/Toast.module.scss"; +import { Label, orAutoLang, resolve, setHtmlLang } from "../localization"; const buttonHeight = parseFloat(variables.buttonHeight); const largeMargin = parseFloat(variables.largeMargin); @@ -183,6 +185,7 @@ export class LiveSplit extends React.Component { const timer = expect( Timer.new(run), "The Default Run should be a valid Run", + props.generalSettings.lang, ); const commandSink = new LSOCommandSink(timer, this); @@ -190,6 +193,7 @@ export class LiveSplit extends React.Component { hotkeySystem = createHotkeys( commandSink.getCommandSink(), props.hotkeys, + props.generalSettings.lang, ); if (props.splits !== undefined) { @@ -215,7 +219,9 @@ export class LiveSplit extends React.Component { /* Looks like the storage has no valid data */ } if (layout === null) { - layout = Layout.defaultLayout(); + layout = Layout.defaultLayout( + orAutoLang(props.generalSettings.lang), + ); } const isDesktop = this.isDesktopQuery.matches; @@ -270,12 +276,16 @@ export class LiveSplit extends React.Component { this.mediaQueryChanged = this.mediaQueryChanged.bind(this); } - private notifyAboutUpdate(this: void) { + public getLang(): Language | undefined { + return this.state.generalSettings.lang; + } + + private notifyAboutUpdate() { const { serviceWorker } = navigator; if (serviceWorker && serviceWorker.controller) { // Don't prompt for update when service worker gets removed toast.warn( - "A new version of LiveSplit One is available! Click here to reload.", + resolve(Label.UpdateAvailable, this.state.generalSettings.lang), { closeOnClick: true, onClick: () => window.location.reload(), @@ -296,7 +306,10 @@ export class LiveSplit extends React.Component { window.onbeforeunload = () => { if (this.state.splitsModified || this.state.layoutModified) { - return "There are unsaved changes. Do you really want to close LiveSplit One?"; + return resolve( + Label.UnsavedChangesBeforeUnload, + this.state.generalSettings.lang, + ); } else { return; } @@ -311,9 +324,8 @@ export class LiveSplit extends React.Component { const { serviceWorker } = navigator; if (serviceWorker && serviceWorker.controller) { // Don't prompt for update when there was no service worker previously installed - serviceWorker.addEventListener( - "controllerchange", - this.notifyAboutUpdate, + serviceWorker.addEventListener("controllerchange", () => + this.notifyAboutUpdate(), ); } } @@ -325,15 +337,27 @@ export class LiveSplit extends React.Component { public componentWillUnmount() { window.removeEventListener( "wheel", - expect(this.scrollEvent, "A Scroll Event should exist"), + expect( + this.scrollEvent, + "A Scroll Event should exist", + this.state.generalSettings.lang, + ), ); window.removeEventListener( "contextmenu", - expect(this.rightClickEvent, "A Right Click Event should exist"), + expect( + this.rightClickEvent, + "A Right Click Event should exist", + this.state.generalSettings.lang, + ), ); window.removeEventListener( "resize", - expect(this.resizeEvent, "A Resize Event should exist"), + expect( + this.resizeEvent, + "A Resize Event should exist", + this.state.generalSettings.lang, + ), ); this.state.commandSink[Symbol.dispose](); this.state.layout[Symbol.dispose](); @@ -348,15 +372,15 @@ export class LiveSplit extends React.Component { const { serviceWorker } = navigator; if (serviceWorker) { - serviceWorker.removeEventListener( - "controllerchange", - this.notifyAboutUpdate, + serviceWorker.removeEventListener("controllerchange", () => + this.notifyAboutUpdate(), ); } } public render() { let view: React.JSX.Element | undefined; + if (this.state.menu.kind === MenuKind.RunEditor) { view = ( { /> ); } else if (this.state.menu.kind === MenuKind.About) { - view = ; + view = ( + + ); } else if (this.state.menu.kind === MenuKind.Splits) { view = ( { > {!this.state.isDesktop && !this.state.sidebarOpen && (