From 6334e74676f17f40a2541a5b4bc74a0a5b651811 Mon Sep 17 00:00:00 2001 From: Florian Heuberger Date: Wed, 4 Feb 2026 22:16:42 +0100 Subject: [PATCH 1/4] feat: show fixed version for vulnerabilities --- app/components/Package/VulnerabilityTree.vue | 7 ++++ i18n/locales/ar.json | 3 +- i18n/locales/az.json | 3 +- i18n/locales/cs-CZ.json | 3 +- i18n/locales/de-DE.json | 3 +- i18n/locales/en.json | 3 +- i18n/locales/es.json | 3 +- i18n/locales/fr-FR.json | 3 +- i18n/locales/hi-IN.json | 3 +- i18n/locales/hu-HU.json | 3 +- i18n/locales/id-ID.json | 3 +- i18n/locales/it-IT.json | 3 +- i18n/locales/ja-JP.json | 3 +- i18n/locales/ne-NP.json | 3 +- i18n/locales/pl-PL.json | 3 +- i18n/locales/pt-BR.json | 3 +- i18n/locales/ru-RU.json | 3 +- i18n/locales/uk-UA.json | 3 +- i18n/locales/zh-CN.json | 3 +- lunaria/files/ar-EG.json | 3 +- lunaria/files/az.json | 3 +- lunaria/files/cs-CZ.json | 3 +- lunaria/files/de-DE.json | 3 +- lunaria/files/en-GB.json | 3 +- lunaria/files/en-US.json | 3 +- lunaria/files/es-419.json | 3 +- lunaria/files/es-ES.json | 3 +- lunaria/files/fr-FR.json | 3 +- lunaria/files/hi-IN.json | 3 +- lunaria/files/hu-HU.json | 3 +- lunaria/files/id-ID.json | 3 +- lunaria/files/it-IT.json | 3 +- lunaria/files/ja-JP.json | 3 +- lunaria/files/ne-NP.json | 3 +- lunaria/files/pl-PL.json | 3 +- lunaria/files/pt-BR.json | 3 +- lunaria/files/ru-RU.json | 3 +- lunaria/files/uk-UA.json | 3 +- lunaria/files/zh-CN.json | 3 +- server/utils/dependency-analysis.ts | 30 +++++++++++++++++ shared/types/dependency-analysis.ts | 34 ++++++++++++++++++++ 41 files changed, 147 insertions(+), 38 deletions(-) diff --git a/app/components/Package/VulnerabilityTree.vue b/app/components/Package/VulnerabilityTree.vue index 9b505ea0d..52b732ba4 100644 --- a/app/components/Package/VulnerabilityTree.vue +++ b/app/components/Package/VulnerabilityTree.vue @@ -150,6 +150,13 @@ function getDepthStyle(depth: string | undefined) { {{ vuln.id }} {{ vuln.summary }} + + → {{ vuln.fixedIn }} +
  • a.package.ecosystem === 'npm' && a.package.name === packageName, + ) + if (!packageAffected?.ranges) return undefined + + // Look through ranges to find a 'fixed' event + for (const range of packageAffected.ranges) { + for (const event of range.events) { + if (event.fixed) { + return event.fixed + } + } + } + + return undefined +} + function getSeverityLevel(vuln: OsvVulnerability): OsvSeverityLevel { const dbSeverity = vuln.database_specific?.severity?.toLowerCase() if (dbSeverity) { diff --git a/shared/types/dependency-analysis.ts b/shared/types/dependency-analysis.ts index 2f768132a..a733c302e 100644 --- a/shared/types/dependency-analysis.ts +++ b/shared/types/dependency-analysis.ts @@ -36,6 +36,37 @@ export interface OsvReference { url: string } +/** + * Version range event from OSV affected data + * @see https://ossf.github.io/osv-schema/#affectedrangesevents-fields + */ +export interface OsvRangeEvent { + introduced?: string + fixed?: string + last_affected?: string + limit?: string +} + +/** + * Version range from OSV affected data + */ +export interface OsvRange { + type: 'SEMVER' | 'ECOSYSTEM' | 'GIT' + events: OsvRangeEvent[] +} + +/** + * Affected package info from OSV + */ +export interface OsvAffected { + package: { + ecosystem: string + name: string + } + ranges?: OsvRange[] + versions?: string[] +} + /** * Individual vulnerability record from OSV */ @@ -48,6 +79,7 @@ export interface OsvVulnerability { published?: string severity?: OsvSeverity[] references?: OsvReference[] + affected?: OsvAffected[] database_specific?: { severity?: string cwe_ids?: string[] @@ -97,6 +129,8 @@ export interface VulnerabilitySummary { severity: OsvSeverityLevel aliases: string[] url: string + /** Version that fixes this vulnerability (if known) */ + fixedIn?: string } /** From 1c637440e6d786368e7e49e73193eb7291d03952 Mon Sep 17 00:00:00 2001 From: Florian Heuberger Date: Thu, 5 Feb 2026 18:54:05 +0100 Subject: [PATCH 2/4] fix: pick correct fixed version --- server/utils/dependency-analysis.ts | 54 +++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/server/utils/dependency-analysis.ts b/server/utils/dependency-analysis.ts index 5a0535287..831c9ebf3 100644 --- a/server/utils/dependency-analysis.ts +++ b/server/utils/dependency-analysis.ts @@ -9,9 +9,11 @@ import type { VulnerabilityTreeResult, DeprecatedPackageInfo, OsvAffected, + OsvRange, } from '#shared/types/dependency-analysis' import { mapWithConcurrency } from '#shared/utils/async' import { resolveDependencyTree } from './dependency-resolver' +import * as semver from 'semver' /** Maximum concurrent requests for fetching vulnerability details */ const OSV_DETAIL_CONCURRENCY = 25 @@ -116,7 +118,7 @@ async function queryOsvDetails(pkg: PackageQueryInfo): Promise e.introduced)?.introduced + const fixed = range.events.find(e => e.fixed)?.fixed + + if (!introduced) return false + + // Handle "0" as "0.0.0" for semver comparison + const introVersion = introduced === '0' ? '0.0.0' : introduced + + try { + // Version must be >= introduced AND < fixed (if fixed exists) + return semver.gte(version, introVersion) && (!fixed || semver.lt(version, fixed)) + } catch { + // If semver parsing fails, skip this range + return false + } +} + +/** + * Extract the fixed version for a specific package version from vulnerability data. + * Finds the range that contains the current version and returns its fixed version. + * @see https://ossf.github.io/osv-schema/#affectedrangesevents-fields */ function getFixedVersion( affected: OsvAffected[] | undefined, packageName: string, + currentVersion: string, ): string | undefined { if (!affected) return undefined - // Find the affected entry for this specific package - const packageAffected = affected.find( + // Find all affected entries for this specific package + const packageAffectedEntries = affected.filter( a => a.package.ecosystem === 'npm' && a.package.name === packageName, ) - if (!packageAffected?.ranges) return undefined - // Look through ranges to find a 'fixed' event - for (const range of packageAffected.ranges) { - for (const event of range.events) { - if (event.fixed) { - return event.fixed + // Check each entry's ranges to find one that contains the current version + for (const entry of packageAffectedEntries) { + if (!entry.ranges) continue + + for (const range of entry.ranges) { + // Only handle SEMVER ranges (most common for npm) + if (range.type !== 'SEMVER') continue + + if (isVersionInRange(currentVersion, range)) { + // Found the matching range - return its fixed version + const fixedEvent = range.events.find(e => e.fixed) + if (fixedEvent?.fixed) return fixedEvent.fixed } } } From 9300c9712b8821c4de9597cbbc2b33209bbda7f9 Mon Sep 17 00:00:00 2001 From: Florian Heuberger Date: Thu, 5 Feb 2026 18:54:15 +0100 Subject: [PATCH 3/4] chore: add tests --- .../server/utils/dependency-analysis.spec.ts | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) diff --git a/test/unit/server/utils/dependency-analysis.spec.ts b/test/unit/server/utils/dependency-analysis.spec.ts index 175decba7..6554920d8 100644 --- a/test/unit/server/utils/dependency-analysis.spec.ts +++ b/test/unit/server/utils/dependency-analysis.spec.ts @@ -595,6 +595,174 @@ describe('dependency-analysis', () => { expect(result.deprecatedPackages[2]?.depth).toBe('transitive') }) + it('extracts correct fixedIn version for the current version range', async () => { + const mockResolved = new Map([ + [ + 'minimist@1.0.0', + { + name: 'minimist', + version: '1.0.0', + size: 1000, + optional: false, + depth: 'root' as const, + path: ['minimist@1.0.0'], + }, + ], + ]) + vi.mocked(resolveDependencyTree).mockResolvedValue(mockResolved) + + // Mock OSV response with multiple affected ranges (like minimist) + // Range 1: 0 - 0.2.1, Range 2: 1.0.0 - 1.2.3 + // Version 1.0.0 should match Range 2, so fixedIn should be 1.2.3 + mockOsvApi( + [{ vulns: [{ id: 'GHSA-vh95-rmgr-6w4m', modified: '2024-01-01' }] }], + new Map([ + [ + 'minimist@1.0.0', + { + vulns: [ + { + id: 'GHSA-vh95-rmgr-6w4m', + summary: 'Prototype Pollution in minimist', + database_specific: { severity: 'MODERATE' }, + affected: [ + { + package: { ecosystem: 'npm', name: 'minimist' }, + ranges: [ + { + type: 'SEMVER', + events: [{ introduced: '0' }, { fixed: '0.2.1' }], + }, + ], + }, + { + package: { ecosystem: 'npm', name: 'minimist' }, + ranges: [ + { + type: 'SEMVER', + events: [{ introduced: '1.0.0' }, { fixed: '1.2.3' }], + }, + ], + }, + ], + }, + ], + }, + ], + ]), + ) + + const result = await analyzeDependencyTree('minimist', '1.0.0') + + expect(result.vulnerablePackages).toHaveLength(1) + expect(result.vulnerablePackages[0]?.vulnerabilities[0]?.fixedIn).toBe('1.2.3') + }) + + it('extracts correct fixedIn for prerelease versions (e.g., 16.0.0-beta.0)', async () => { + const mockResolved = new Map([ + [ + 'next@16.0.0-beta.0', + { + name: 'next', + version: '16.0.0-beta.0', + size: 1000, + optional: false, + depth: 'root' as const, + path: ['next@16.0.0-beta.0'], + }, + ], + ]) + vi.mocked(resolveDependencyTree).mockResolvedValue(mockResolved) + + // Mock OSV response with multiple ranges including prerelease + // Version 16.0.0-beta.0 should NOT match 13.0.0-15.0.8, but SHOULD match 16.0.0-beta.0-16.0.11 + mockOsvApi( + [{ vulns: [{ id: 'GHSA-test', modified: '2024-01-01' }] }], + new Map([ + [ + 'next@16.0.0-beta.0', + { + vulns: [ + { + id: 'GHSA-test', + summary: 'Test vulnerability', + database_specific: { severity: 'HIGH' }, + affected: [ + { + package: { ecosystem: 'npm', name: 'next' }, + ranges: [ + { + type: 'SEMVER', + events: [{ introduced: '13.0.0' }, { fixed: '15.0.8' }], + }, + ], + }, + { + package: { ecosystem: 'npm', name: 'next' }, + ranges: [ + { + type: 'SEMVER', + events: [{ introduced: '16.0.0-beta.0' }, { fixed: '16.0.11' }], + }, + ], + }, + ], + }, + ], + }, + ], + ]), + ) + + const result = await analyzeDependencyTree('next', '16.0.0-beta.0') + + expect(result.vulnerablePackages).toHaveLength(1) + // Should match the 16.x range, not the 13-15 range + expect(result.vulnerablePackages[0]?.vulnerabilities[0]?.fixedIn).toBe('16.0.11') + }) + + it('returns undefined fixedIn when no matching range has a fixed version', async () => { + const mockResolved = new Map([ + [ + 'pkg@1.0.0', + { + name: 'pkg', + version: '1.0.0', + size: 1000, + optional: false, + depth: 'root' as const, + path: ['pkg@1.0.0'], + }, + ], + ]) + vi.mocked(resolveDependencyTree).mockResolvedValue(mockResolved) + + // Mock OSV response without affected data + mockOsvApi( + [{ vulns: [{ id: 'GHSA-no-fix', modified: '2024-01-01' }] }], + new Map([ + [ + 'pkg@1.0.0', + { + vulns: [ + { + id: 'GHSA-no-fix', + summary: 'Vuln without fix info', + database_specific: { severity: 'LOW' }, + // No affected field + }, + ], + }, + ], + ]), + ) + + const result = await analyzeDependencyTree('pkg', '1.0.0') + + expect(result.vulnerablePackages).toHaveLength(1) + expect(result.vulnerablePackages[0]?.vulnerabilities[0]?.fixedIn).toBeUndefined() + }) + it('returns both vulnerabilities and deprecated packages together', async () => { const mockResolved = new Map([ [ From 0571e1ddbe578b2988504383c09028b0a22a6e8d Mon Sep 17 00:00:00 2001 From: Florian Heuberger Date: Thu, 5 Feb 2026 18:57:31 +0100 Subject: [PATCH 4/4] fix: remove translation from all expect de and en --- i18n/locales/ar.json | 3 +-- i18n/locales/az.json | 3 +-- i18n/locales/cs-CZ.json | 3 +-- i18n/locales/es.json | 3 +-- i18n/locales/fr-FR.json | 3 +-- i18n/locales/hi-IN.json | 3 +-- i18n/locales/hu-HU.json | 3 +-- i18n/locales/id-ID.json | 3 +-- i18n/locales/it-IT.json | 3 +-- i18n/locales/ja-JP.json | 3 +-- i18n/locales/ne-NP.json | 3 +-- i18n/locales/pl-PL.json | 3 +-- i18n/locales/pt-BR.json | 3 +-- i18n/locales/ru-RU.json | 3 +-- i18n/locales/uk-UA.json | 3 +-- i18n/locales/zh-CN.json | 3 +-- lunaria/files/ar-EG.json | 3 +-- lunaria/files/az.json | 3 +-- lunaria/files/cs-CZ.json | 3 +-- lunaria/files/es-419.json | 3 +-- lunaria/files/es-ES.json | 3 +-- lunaria/files/fr-FR.json | 3 +-- lunaria/files/hi-IN.json | 3 +-- lunaria/files/hu-HU.json | 3 +-- lunaria/files/id-ID.json | 3 +-- lunaria/files/it-IT.json | 3 +-- lunaria/files/ja-JP.json | 3 +-- lunaria/files/ne-NP.json | 3 +-- lunaria/files/pl-PL.json | 3 +-- lunaria/files/pt-BR.json | 3 +-- lunaria/files/ru-RU.json | 3 +-- lunaria/files/uk-UA.json | 3 +-- lunaria/files/zh-CN.json | 3 +-- 33 files changed, 33 insertions(+), 66 deletions(-) diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json index 0108f8bfb..aefdbb25b 100644 --- a/i18n/locales/ar.json +++ b/i18n/locales/ar.json @@ -328,8 +328,7 @@ "high": "عالية", "moderate": "متوسطة", "low": "منخفضة" - }, - "fixed_in_title": "تم الإصلاح في الإصدار {version}" + } }, "deprecated": { "label": "مهمل", diff --git a/i18n/locales/az.json b/i18n/locales/az.json index 0c414ab6d..30c70f840 100644 --- a/i18n/locales/az.json +++ b/i18n/locales/az.json @@ -288,8 +288,7 @@ "high": "yüksək", "moderate": "orta", "low": "aşağı" - }, - "fixed_in_title": "{version} versiyasında düzəldilib" + } }, "deprecated": { "label": "Köhnəlmiş", diff --git a/i18n/locales/cs-CZ.json b/i18n/locales/cs-CZ.json index 811f739a7..e67b44fff 100644 --- a/i18n/locales/cs-CZ.json +++ b/i18n/locales/cs-CZ.json @@ -328,8 +328,7 @@ "high": "vysoká", "moderate": "střední", "low": "nízká" - }, - "fixed_in_title": "Opraveno ve verzi {version}" + } }, "deprecated": { "label": "Zastaralé", diff --git a/i18n/locales/es.json b/i18n/locales/es.json index 84a9312c7..fe40402f0 100644 --- a/i18n/locales/es.json +++ b/i18n/locales/es.json @@ -334,8 +334,7 @@ "high": "alta", "moderate": "moderada", "low": "baja" - }, - "fixed_in_title": "Corregido en la versión {version}" + } }, "deprecated": { "label": "Obsoleto", diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json index d5e67bc09..246460c0e 100644 --- a/i18n/locales/fr-FR.json +++ b/i18n/locales/fr-FR.json @@ -332,8 +332,7 @@ "high": "élevée", "moderate": "modérée", "low": "faible" - }, - "fixed_in_title": "Corrigé dans la version {version}" + } }, "deprecated": { "label": "Obsolète", diff --git a/i18n/locales/hi-IN.json b/i18n/locales/hi-IN.json index c658f649d..579465b8f 100644 --- a/i18n/locales/hi-IN.json +++ b/i18n/locales/hi-IN.json @@ -323,8 +323,7 @@ "high": "उच्च", "moderate": "मध्यम", "low": "निम्न" - }, - "fixed_in_title": "संस्करण {version} में ठीक किया गया" + } }, "deprecated": { "label": "डेप्रीकेटेड", diff --git a/i18n/locales/hu-HU.json b/i18n/locales/hu-HU.json index 30f164a02..95c9dbf84 100644 --- a/i18n/locales/hu-HU.json +++ b/i18n/locales/hu-HU.json @@ -287,8 +287,7 @@ "high": "magas", "moderate": "közepes", "low": "alacsony" - }, - "fixed_in_title": "Javítva a(z) {version} verzióban" + } }, "deprecated": { "label": "Elavult", diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json index 5bc5be222..15493c369 100644 --- a/i18n/locales/id-ID.json +++ b/i18n/locales/id-ID.json @@ -306,8 +306,7 @@ "high": "tinggi", "moderate": "sedang", "low": "rendah" - }, - "fixed_in_title": "Diperbaiki di versi {version}" + } }, "deprecated": { "label": "Usang", diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json index ede295547..4d5c4b4b4 100644 --- a/i18n/locales/it-IT.json +++ b/i18n/locales/it-IT.json @@ -353,8 +353,7 @@ "high": "alta", "moderate": "moderata", "low": "bassa" - }, - "fixed_in_title": "Corretto nella versione {version}" + } }, "deprecated": { "label": "Deprecato", diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json index 2cc321de7..3101c388f 100644 --- a/i18n/locales/ja-JP.json +++ b/i18n/locales/ja-JP.json @@ -353,8 +353,7 @@ "high": "高", "moderate": "中", "low": "低" - }, - "fixed_in_title": "バージョン {version} で修正済み" + } }, "deprecated": { "label": "非推奨", diff --git a/i18n/locales/ne-NP.json b/i18n/locales/ne-NP.json index e56a83fad..23c849342 100644 --- a/i18n/locales/ne-NP.json +++ b/i18n/locales/ne-NP.json @@ -306,8 +306,7 @@ "high": "उच्च", "moderate": "मध्यम", "low": "कम" - }, - "fixed_in_title": "संस्करण {version} मा समाधान गरियो" + } }, "deprecated": { "label": "अप्रचलित", diff --git a/i18n/locales/pl-PL.json b/i18n/locales/pl-PL.json index 475dddd61..16f073f0a 100644 --- a/i18n/locales/pl-PL.json +++ b/i18n/locales/pl-PL.json @@ -338,8 +338,7 @@ "high": "wysoka", "moderate": "umiarkowana", "low": "niska" - }, - "fixed_in_title": "Naprawiono w wersji {version}" + } }, "deprecated": { "label": "Przestarzałe", diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json index b8b46b9ac..0f3e84395 100644 --- a/i18n/locales/pt-BR.json +++ b/i18n/locales/pt-BR.json @@ -324,8 +324,7 @@ "high": "alta", "moderate": "moderada", "low": "baixa" - }, - "fixed_in_title": "Corrigido na versão {version}" + } }, "deprecated": { "label": "Descontinuado", diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json index 78fbd7b70..aef49d816 100644 --- a/i18n/locales/ru-RU.json +++ b/i18n/locales/ru-RU.json @@ -285,8 +285,7 @@ "high": "высокая", "moderate": "средняя", "low": "низкая" - }, - "fixed_in_title": "Исправлено в версии {version}" + } }, "deprecated": { "label": "Устаревшие", diff --git a/i18n/locales/uk-UA.json b/i18n/locales/uk-UA.json index 36bcc5781..2eea4904f 100644 --- a/i18n/locales/uk-UA.json +++ b/i18n/locales/uk-UA.json @@ -288,8 +288,7 @@ "high": "висока", "moderate": "середня", "low": "низька" - }, - "fixed_in_title": "Виправлено у версії {version}" + } }, "deprecated": { "label": "Припинено", diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json index 0f83c7e34..1e90c1211 100644 --- a/i18n/locales/zh-CN.json +++ b/i18n/locales/zh-CN.json @@ -357,8 +357,7 @@ "high": "高", "moderate": "中等", "low": "低" - }, - "fixed_in_title": "已在版本 {version} 中修复" + } }, "deprecated": { "label": "已弃用", diff --git a/lunaria/files/ar-EG.json b/lunaria/files/ar-EG.json index 0108f8bfb..aefdbb25b 100644 --- a/lunaria/files/ar-EG.json +++ b/lunaria/files/ar-EG.json @@ -328,8 +328,7 @@ "high": "عالية", "moderate": "متوسطة", "low": "منخفضة" - }, - "fixed_in_title": "تم الإصلاح في الإصدار {version}" + } }, "deprecated": { "label": "مهمل", diff --git a/lunaria/files/az.json b/lunaria/files/az.json index 0c414ab6d..30c70f840 100644 --- a/lunaria/files/az.json +++ b/lunaria/files/az.json @@ -288,8 +288,7 @@ "high": "yüksək", "moderate": "orta", "low": "aşağı" - }, - "fixed_in_title": "{version} versiyasında düzəldilib" + } }, "deprecated": { "label": "Köhnəlmiş", diff --git a/lunaria/files/cs-CZ.json b/lunaria/files/cs-CZ.json index 811f739a7..e67b44fff 100644 --- a/lunaria/files/cs-CZ.json +++ b/lunaria/files/cs-CZ.json @@ -328,8 +328,7 @@ "high": "vysoká", "moderate": "střední", "low": "nízká" - }, - "fixed_in_title": "Opraveno ve verzi {version}" + } }, "deprecated": { "label": "Zastaralé", diff --git a/lunaria/files/es-419.json b/lunaria/files/es-419.json index a77a7bb61..2e650460e 100644 --- a/lunaria/files/es-419.json +++ b/lunaria/files/es-419.json @@ -334,8 +334,7 @@ "high": "alta", "moderate": "moderada", "low": "baja" - }, - "fixed_in_title": "Corregido en la versión {version}" + } }, "deprecated": { "label": "Obsoleto", diff --git a/lunaria/files/es-ES.json b/lunaria/files/es-ES.json index 84a9312c7..fe40402f0 100644 --- a/lunaria/files/es-ES.json +++ b/lunaria/files/es-ES.json @@ -334,8 +334,7 @@ "high": "alta", "moderate": "moderada", "low": "baja" - }, - "fixed_in_title": "Corregido en la versión {version}" + } }, "deprecated": { "label": "Obsoleto", diff --git a/lunaria/files/fr-FR.json b/lunaria/files/fr-FR.json index d5e67bc09..246460c0e 100644 --- a/lunaria/files/fr-FR.json +++ b/lunaria/files/fr-FR.json @@ -332,8 +332,7 @@ "high": "élevée", "moderate": "modérée", "low": "faible" - }, - "fixed_in_title": "Corrigé dans la version {version}" + } }, "deprecated": { "label": "Obsolète", diff --git a/lunaria/files/hi-IN.json b/lunaria/files/hi-IN.json index c658f649d..579465b8f 100644 --- a/lunaria/files/hi-IN.json +++ b/lunaria/files/hi-IN.json @@ -323,8 +323,7 @@ "high": "उच्च", "moderate": "मध्यम", "low": "निम्न" - }, - "fixed_in_title": "संस्करण {version} में ठीक किया गया" + } }, "deprecated": { "label": "डेप्रीकेटेड", diff --git a/lunaria/files/hu-HU.json b/lunaria/files/hu-HU.json index 30f164a02..95c9dbf84 100644 --- a/lunaria/files/hu-HU.json +++ b/lunaria/files/hu-HU.json @@ -287,8 +287,7 @@ "high": "magas", "moderate": "közepes", "low": "alacsony" - }, - "fixed_in_title": "Javítva a(z) {version} verzióban" + } }, "deprecated": { "label": "Elavult", diff --git a/lunaria/files/id-ID.json b/lunaria/files/id-ID.json index 5bc5be222..15493c369 100644 --- a/lunaria/files/id-ID.json +++ b/lunaria/files/id-ID.json @@ -306,8 +306,7 @@ "high": "tinggi", "moderate": "sedang", "low": "rendah" - }, - "fixed_in_title": "Diperbaiki di versi {version}" + } }, "deprecated": { "label": "Usang", diff --git a/lunaria/files/it-IT.json b/lunaria/files/it-IT.json index ede295547..4d5c4b4b4 100644 --- a/lunaria/files/it-IT.json +++ b/lunaria/files/it-IT.json @@ -353,8 +353,7 @@ "high": "alta", "moderate": "moderata", "low": "bassa" - }, - "fixed_in_title": "Corretto nella versione {version}" + } }, "deprecated": { "label": "Deprecato", diff --git a/lunaria/files/ja-JP.json b/lunaria/files/ja-JP.json index 2cc321de7..3101c388f 100644 --- a/lunaria/files/ja-JP.json +++ b/lunaria/files/ja-JP.json @@ -353,8 +353,7 @@ "high": "高", "moderate": "中", "low": "低" - }, - "fixed_in_title": "バージョン {version} で修正済み" + } }, "deprecated": { "label": "非推奨", diff --git a/lunaria/files/ne-NP.json b/lunaria/files/ne-NP.json index e56a83fad..23c849342 100644 --- a/lunaria/files/ne-NP.json +++ b/lunaria/files/ne-NP.json @@ -306,8 +306,7 @@ "high": "उच्च", "moderate": "मध्यम", "low": "कम" - }, - "fixed_in_title": "संस्करण {version} मा समाधान गरियो" + } }, "deprecated": { "label": "अप्रचलित", diff --git a/lunaria/files/pl-PL.json b/lunaria/files/pl-PL.json index 475dddd61..16f073f0a 100644 --- a/lunaria/files/pl-PL.json +++ b/lunaria/files/pl-PL.json @@ -338,8 +338,7 @@ "high": "wysoka", "moderate": "umiarkowana", "low": "niska" - }, - "fixed_in_title": "Naprawiono w wersji {version}" + } }, "deprecated": { "label": "Przestarzałe", diff --git a/lunaria/files/pt-BR.json b/lunaria/files/pt-BR.json index b8b46b9ac..0f3e84395 100644 --- a/lunaria/files/pt-BR.json +++ b/lunaria/files/pt-BR.json @@ -324,8 +324,7 @@ "high": "alta", "moderate": "moderada", "low": "baixa" - }, - "fixed_in_title": "Corrigido na versão {version}" + } }, "deprecated": { "label": "Descontinuado", diff --git a/lunaria/files/ru-RU.json b/lunaria/files/ru-RU.json index 78fbd7b70..aef49d816 100644 --- a/lunaria/files/ru-RU.json +++ b/lunaria/files/ru-RU.json @@ -285,8 +285,7 @@ "high": "высокая", "moderate": "средняя", "low": "низкая" - }, - "fixed_in_title": "Исправлено в версии {version}" + } }, "deprecated": { "label": "Устаревшие", diff --git a/lunaria/files/uk-UA.json b/lunaria/files/uk-UA.json index 36bcc5781..2eea4904f 100644 --- a/lunaria/files/uk-UA.json +++ b/lunaria/files/uk-UA.json @@ -288,8 +288,7 @@ "high": "висока", "moderate": "середня", "low": "низька" - }, - "fixed_in_title": "Виправлено у версії {version}" + } }, "deprecated": { "label": "Припинено", diff --git a/lunaria/files/zh-CN.json b/lunaria/files/zh-CN.json index 0f83c7e34..1e90c1211 100644 --- a/lunaria/files/zh-CN.json +++ b/lunaria/files/zh-CN.json @@ -357,8 +357,7 @@ "high": "高", "moderate": "中等", "low": "低" - }, - "fixed_in_title": "已在版本 {version} 中修复" + } }, "deprecated": { "label": "已弃用",