import { ref, computed } from 'vue'
import { VueUiHorizontalBar } from 'vue-data-ui/vue-ui-horizontal-bar'
+import { VueUiPatternSeed } from 'vue-data-ui/vue-ui-pattern-seed'
import type { VueUiHorizontalBarConfig, VueUiHorizontalBarDatasetItem } from 'vue-data-ui'
import { getFrameworkColor, isListedFramework } from '~/utils/frameworks'
-import { createChartPatternSlotMarkup } from '~/utils/charts'
+import { createPatternDef } from 'vue-data-ui/utils'
import { drawSmallNpmxLogoAndTaglineWatermark } from '~/composables/useChartWatermark'
import {
@@ -12,6 +13,7 @@ import {
sanitise,
applyEllipsis,
copyAltTextForCompareFacetBarChart,
+ CHART_PATTERN_CONFIG,
} from '~/utils/charts'
import('vue-data-ui/style.css')
@@ -227,14 +229,15 @@ const config = computed
(() => {
const patternId = `tooltip-pattern-${safeSeriesIndex}`
const usePattern = safeSeriesIndex !== 0
- const patternMarkup = usePattern
- ? createChartPatternSlotMarkup({
+ const patternDef = usePattern
+ ? createPatternDef({
id: patternId,
seed: safeSeriesIndex,
foregroundColor: colors.value.bg!,
- fallbackColor: 'transparent',
- maxSize: 24,
- minSize: 16,
+ backgroundColor: 'transparent',
+ maxSize: CHART_PATTERN_CONFIG.maxSize,
+ minSize: CHART_PATTERN_CONFIG.minSize,
+ disambiguator: CHART_PATTERN_CONFIG.disambiguator,
})
: ''
@@ -252,9 +255,7 @@ const config = computed(() => {
-
- ${patternMarkup}
-
+ ${patternDef}
${markerMarkup}
@@ -286,14 +287,15 @@ const config = computed
(() => {
-
diff --git a/app/composables/useSettings.ts b/app/composables/useSettings.ts
index a79c746c2..533c03042 100644
--- a/app/composables/useSettings.ts
+++ b/app/composables/useSettings.ts
@@ -38,6 +38,7 @@ export interface AppSettings {
/** Automatically open the web auth page in the browser */
autoOpenURL: boolean
}
+ codeContainerFull: boolean
sidebar: {
collapsed: string[]
}
@@ -63,6 +64,7 @@ const DEFAULT_SETTINGS: AppSettings = {
connector: {
autoOpenURL: false,
},
+ codeContainerFull: false,
sidebar: {
collapsed: [],
},
@@ -236,3 +238,18 @@ export function useBackgroundTheme() {
setBackgroundTheme,
}
}
+
+export function useCodeContainer() {
+ const { settings } = useSettings()
+
+ const codeContainerFull = computed(() => settings.value.codeContainerFull)
+
+ function toggleCodeContainer() {
+ settings.value.codeContainerFull = !settings.value.codeContainerFull
+ }
+
+ return {
+ codeContainerFull,
+ toggleCodeContainer,
+ }
+}
diff --git a/app/pages/blog/first-post.md b/app/pages/blog/first-post.md
deleted file mode 100644
index c63264d4a..000000000
--- a/app/pages/blog/first-post.md
+++ /dev/null
@@ -1,318 +0,0 @@
----
-authors:
- - name: Daniel Roe
- blueskyHandle: danielroe.dev
- - name: Salma Alam-Naylor
- blueskyHandle: whitep4nth3r.com
-title: 'Hello World'
-tags: ['OpenSource', 'Nuxt']
-excerpt: 'My first post'
-date: '2026-01-28T15:30:00Z'
-slug: 'first-post'
-description: 'My first post on the blog'
-draft: true
----
-
-# Markdown: Syntax
-
-- [Overview](#overview)
- - [Philosophy](#philosophy)
-- [Block Elements](#block-elements)
- - [Paragraphs and Line Breaks](#paragraphs-and-line-breaks)
- - [Headers](#headers)
- - [Blockquotes](#blockquotes)
- - [Lists](#lists)
- - [Code Blocks](#code-blocks)
-- [Span Elements](#span-elements)
- - [Links](#links)
- - [Emphasis](#emphasis)
- - [Code](#code)
-
-**Note:** This document is itself written using Markdown; you
-can [see the source for it by adding '.text' to the URL](/projects/markdown/syntax.text).
-
----
-
-## Overview
-
-### Philosophy
-
-Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
-
-Readability, however, is emphasized above all else. A Markdown-formatted
-document should be publishable as-is, as plain text, without looking
-like it's been marked up with tags or formatting instructions. While
-Markdown's syntax has been influenced by several existing text-to-HTML
-filters -- including [Setext](http://docutils.sourceforge.net/mirror/setext.html), [atx](http://www.aaronsw.com/2002/atx/), [Textile](http://textism.com/tools/textile/), [reStructuredText](http://docutils.sourceforge.net/rst.html),
-[Grutatext](http://www.triptico.com/software/grutatxt.html), and [EtText](http://ettext.taint.org/doc/) -- the single biggest source of
-inspiration for Markdown's syntax is the format of plain text email.
-
-## Block Elements
-
-### Paragraphs and Line Breaks
-
-A paragraph is simply one or more consecutive lines of text, separated
-by one or more blank lines. (A blank line is any line that looks like a
-blank line -- a line containing nothing but spaces or tabs is considered
-blank.) Normal paragraphs should not be indented with spaces or tabs.
-
-The implication of the "one or more consecutive lines of text" rule is
-that Markdown supports "hard-wrapped" text paragraphs. This differs
-significantly from most other text-to-HTML formatters (including Movable
-Type's "Convert Line Breaks" option) which translate every line break
-character in a paragraph into a ` ` tag.
-
-When you _do_ want to insert a ` ` break tag using Markdown, you
-end a line with two or more spaces, then type return.
-
-### Headers
-
-Markdown supports two styles of headers, [Setext] [1] and [atx] [2].
-
-Optionally, you may "close" atx-style headers. This is purely
-cosmetic -- you can use this if you think it looks better. The
-closing hashes don't even need to match the number of hashes
-used to open the header. (The number of opening hashes
-determines the header level.)
-
-### Blockquotes
-
-Markdown uses email-style `>` characters for blockquoting. If you're
-familiar with quoting passages of text in an email message, then you
-know how to create a blockquote in Markdown. It looks best if you hard
-wrap the text and put a `>` before every line:
-
-> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
-> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
-> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
->
-> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
-> id sem consectetuer libero luctus adipiscing.
-
-Markdown allows you to be lazy and only put the `>` before the first
-line of a hard-wrapped paragraph:
-
-> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
-> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
-> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
-
-> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
-> id sem consectetuer libero luctus adipiscing.
-
-Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by
-adding additional levels of `>`:
-
-> This is the first level of quoting.
->
-> > This is nested blockquote.
->
-> Back to the first level.
-
-Blockquotes can contain other Markdown elements, including headers, lists,
-and code blocks:
-
-> ## This is a header.
->
-> 1. This is the first list item.
-> 2. This is the second list item.
->
-> Here's some example code:
->
-> return shell_exec("echo $input | $markdown_script");
-
-Any decent text editor should make email-style quoting easy. For
-example, with BBEdit, you can make a selection and choose Increase
-Quote Level from the Text menu.
-
-### Lists
-
-Markdown supports ordered (numbered) and unordered (bulleted) lists.
-
-Unordered lists use asterisks, pluses, and hyphens -- interchangably
--- as list markers:
-
-- Red
-- Green
-- Blue
-
-is equivalent to:
-
-- Red
-- Green
-- Blue
-
-and:
-
-- Red
-- Green
-- Blue
-
-Ordered lists use numbers followed by periods:
-
-1. Bird
-2. McHale
-3. Parish
-
-It's important to note that the actual numbers you use to mark the
-list have no effect on the HTML output Markdown produces. The HTML
-Markdown produces from the above list is:
-
-If you instead wrote the list in Markdown like this:
-
-1. Bird
-1. McHale
-1. Parish
-
-or even:
-
-3. Bird
-1. McHale
-1. Parish
-
-you'd get the exact same HTML output. The point is, if you want to,
-you can use ordinal numbers in your ordered Markdown lists, so that
-the numbers in your source match the numbers in your published HTML.
-But if you want to be lazy, you don't have to.
-
-To make lists look nice, you can wrap items with hanging indents:
-
-- Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
- Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
- viverra nec, fringilla in, laoreet vitae, risus.
-- Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
- Suspendisse id sem consectetuer libero luctus adipiscing.
-
-But if you want to be lazy, you don't have to:
-
-- Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
- Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
- viverra nec, fringilla in, laoreet vitae, risus.
-- Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
- Suspendisse id sem consectetuer libero luctus adipiscing.
-
-List items may consist of multiple paragraphs. Each subsequent
-paragraph in a list item must be indented by either 4 spaces
-or one tab:
-
-1. This is a list item with two paragraphs. Lorem ipsum dolor
- sit amet, consectetuer adipiscing elit. Aliquam hendrerit
- mi posuere lectus.
-
- Vestibulum enim wisi, viverra nec, fringilla in, laoreet
- vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
- sit amet velit.
-
-2. Suspendisse id sem consectetuer libero luctus adipiscing.
-
-It looks nice if you indent every line of the subsequent
-paragraphs, but here again, Markdown will allow you to be
-lazy:
-
-- This is a list item with two paragraphs.
-
- This is the second paragraph in the list item. You're
-
- only required to indent the first line. Lorem ipsum dolor
- sit amet, consectetuer adipiscing elit.
-
-- Another item in the same list.
-
-To put a blockquote within a list item, the blockquote's `>`
-delimiters need to be indented:
-
-- A list item with a blockquote:
-
- > This is a blockquote
- > inside a list item.
-
-To put a code block within a list item, the code block needs
-to be indented _twice_ -- 8 spaces or two tabs:
-
-- A list item with a code block:
-
-
-
-### Code Blocks
-
-Pre-formatted code blocks are used for writing about programming or
-markup source code. Rather than forming normal paragraphs, the lines
-of a code block are interpreted literally. Markdown wraps a code block
-in both `` and `` tags.
-
-To produce a code block in Markdown, simply indent every line of the
-block by at least 4 spaces or 1 tab.
-
-This is a normal paragraph:
-
- This is a code block.
-
-Here is an example of AppleScript:
-
- tell application "Foo"
- beep
- end tell
-
-A code block continues until it reaches a line that is not indented
-(or the end of the article).
-
-Within a code block, ampersands (`&`) and angle brackets (`<` and `>`)
-are automatically converted into HTML entities. This makes it very
-easy to include example HTML source code using Markdown -- just paste
-it and indent it, and Markdown will handle the hassle of encoding the
-ampersands and angle brackets. For example, this:
-
-
-
-Regular Markdown syntax is not processed within code blocks. E.g.,
-asterisks are just literal asterisks within a code block. This means
-it's also easy to use Markdown to write about Markdown's own syntax.
-
-```
-tell application "Foo"
- beep
-end tell
-```
-
-## Span Elements
-
-### Links
-
-Markdown supports two style of links: _inline_ and _reference_.
-
-In both styles, the link text is delimited by [square brackets].
-
-To create an inline link, use a set of regular parentheses immediately
-after the link text's closing square bracket. Inside the parentheses,
-put the URL where you want the link to point, along with an _optional_
-title for the link, surrounded in quotes. For example:
-
-This is [an example](http://example.com/) inline link.
-
-[This link](http://example.net/) has no title attribute.
-
-### Emphasis
-
-Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
-emphasis. Text wrapped with one `*` or `_` will be wrapped with an
-HTML `` tag; double `*`'s or `_`'s will be wrapped with an HTML
-`` tag. E.g., this input:
-
-_single asterisks_
-
-_single underscores_
-
-**double asterisks**
-
-**double underscores**
-
-### Code
-
-To indicate a span of code, wrap it with backtick quotes (`` ` ``).
-Unlike a pre-formatted code block, a code span indicates code within a
-normal paragraph. For example:
-
-Use the `printf()` function.
-
-
diff --git a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue
index 3fbdcfe99..fc2bb60c6 100644
--- a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue
+++ b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue
@@ -1,4 +1,7 @@
@@ -346,113 +332,51 @@ defineOgImageComponent('Default', {
-
+
-
-
-
-
-
-
- {{ mode.label }}
-
-
-
-
-
- {{ $t('code.root') }}
-
- {{ $t('code.root') }}
-
- /
-
- {{ crumb.name }}
-
- {{ crumb.name }}
-
-
-
-
-
- {{ permalinkCopied ? $t('common.copied') : $t('code.copy_link') }}
-
-
-
- {{ fileContentCopied ? $t('common.copied') : $t('common.copy') }}
-
-
- {{ $t('code.raw') }}
-
-
-
-
+
+
+
+
+
-
+
@@ -462,10 +386,12 @@ defineOgImageComponent('Default', {
:html="fileContent.html"
:lines="fileContent.lines"
:selected-lines="selectedLines"
+ class="flex-1"
@line-click="handleLineClick"
/>
-
-
+
+
+
{{
$t('code.lines', { count: fileContent.lines })
}}
@@ -477,7 +403,7 @@ defineOgImageComponent('Default', {
-
+
{{ $t('code.binary_file') }}
@@ -496,7 +422,7 @@ defineOgImageComponent('Default', {
-
+
{{ $t('code.file_too_large') }}
@@ -512,44 +438,6 @@ defineOgImageComponent('Default', {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -580,6 +468,7 @@ defineOgImageComponent('Default', {
+
+
diff --git a/app/utils/charts.ts b/app/utils/charts.ts
index b11c8775b..6997b8c02 100644
--- a/app/utils/charts.ts
+++ b/app/utils/charts.ts
@@ -722,377 +722,13 @@ export function applyEllipsis(text: string, maxLength = 45) {
return text.slice(0, maxLength) + '...'
}
-// a11y pattern generation
-export type SvgPatternType =
- | 'diagonalLines'
- | 'verticalLines'
- | 'horizontalLines'
- | 'crosshatch'
- | 'dots'
- | 'grid'
- | 'zigzag'
-
-export type SeededSvgPatternOptions = {
- foregroundColor?: string
- backgroundColor?: string
- minimumSize?: number
- maximumSize?: number
-}
-
-export type SeededSvgPatternResult = {
- width: number
- height: number
- rotation: number
- patternType: SvgPatternType
- contentMarkup: string
-}
-
-type NonEmptyReadonlyArray = readonly [T, ...T[]]
-
/**
- * Generates a deterministic 32-bit unsigned integer hash from a string.
- *
- * This function is based on the FNV-1a hashing algorithm. It is used to
- * transform any string input into a stable numeric seed suitable for
- * deterministic pseudo-random number generation.
- *
- * The same input string will always produce the same output number.
- *
- * @param value - The input string to hash.
- * @returns A 32-bit unsigned integer hash.
- */
-export function createSeedNumber(value: string): number {
- let hashValue = 2166136261
- for (let index = 0; index < value.length; index += 1) {
- hashValue ^= value.charCodeAt(index)
- hashValue = Math.imul(hashValue, 16777619)
- }
- return hashValue >>> 0
-}
-
-/**
- * Creates a deterministic pseudo-random number generator (PRNG) based on a numeric seed.
- *
- * This function implements a fast, non-cryptographic PRNG similar to Mulberry32.
- * It produces a reproducible sequence of numbers in the range [0, 1), meaning
- * the same seed will always generate the same sequence.
- *
- * The returned function maintains internal state and should be called repeatedly
- * to obtain successive pseudo-random values.
- *
- * @param seedNumber - 32 bit integer seed
- * @returns A function that returns a pseudo rand number between 0 (inclusive) and 1 (exclusive).
- *
- * @example
- * const random = createDeterministicRandomGenerator(12345)
- * const a = random() // always the same for seed 12345
- * const b = random()
+ * Constants shared among chart components using seeded patterns with the component.
+ * Important: `disambiguator` can be any number, and is used to cycle through different pattern sets. Its
+ * value was chosen for the diversity of its motifs.
*/
-function createDeterministicRandomGenerator(seedNumber: number): () => number {
- // Ensure the seed is treated as an unsigned 32 bit int
- let state = seedNumber >>> 0
-
- return function generateRandomNumber(): number {
- // Advance internal state using a constant
- state += 0x6d2b79f5
- let intermediateValue = state
-
- // First mixing step:
- // - XOR with a right shifted version of itself
- // - Multiply with a derived value to further scramble bits
- intermediateValue = Math.imul(
- intermediateValue ^ (intermediateValue >>> 15),
- intermediateValue | 1,
- )
-
- // Second mixing step:
- // - Combine current value with another transformed version of itself
- // - Multiply again to increase entropy and spread bits
- intermediateValue ^=
- intermediateValue +
- Math.imul(intermediateValue ^ (intermediateValue >>> 7), intermediateValue | 61)
-
- // Final step:
- // - Final XOR with shifted value for additional scrambling
- // - Convert to unsigned 32 bit int
- // - Normalize to a float in range 0 to 1
- return ((intermediateValue ^ (intermediateValue >>> 14)) >>> 0) / 4294967296
- }
-}
-
-function pickValue(values: NonEmptyReadonlyArray, generateRandomNumber: () => number): T {
- const selectedIndex = Math.floor(generateRandomNumber() * values.length)
- const selectedValue = values[selectedIndex]
- if (selectedValue === undefined) {
- throw new Error('pickValue requires a non-empty array')
- }
- return selectedValue
-}
-
-function escapeSvgAttribute(value: string): string {
- return value
- .replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(//g, '>')
-}
-
-function createLineElement(
- x1: number,
- y1: number,
- x2: number,
- y2: number,
- stroke: string,
- strokeWidth: number,
- opacity: number,
-): string {
- const safeStroke = escapeSvgAttribute(stroke)
- return ` `
-}
-
-function createCircleElement(
- centerX: number,
- centerY: number,
- radius: number,
- fill: string,
- opacity: number,
-): string {
- const safeFill = escapeSvgAttribute(fill)
- return ` `
-}
-
-function createPathElement(
- pathData: string,
- fill: string,
- stroke: string,
- strokeWidth: number,
- opacity: number,
-): string {
- const safeFill = escapeSvgAttribute(fill)
- const safeStroke = escapeSvgAttribute(stroke)
- return ` `
-}
-
-function toNonEmptyReadonlyArray(values: readonly T[]): NonEmptyReadonlyArray {
- if (values.length === 0) {
- throw new Error('Expected a non-empty array')
- }
-
- return values as NonEmptyReadonlyArray
-}
-
-export function createSeededSvgPattern(
- seed: string | number,
- options?: SeededSvgPatternOptions,
-): SeededSvgPatternResult {
- const normalizedSeed = String(seed)
- const foregroundColor = options?.foregroundColor ?? '#111111'
- const backgroundColor = options?.backgroundColor ?? 'transparent'
- const minimumSize = options?.minimumSize ?? 8
- const maximumSize = options?.maximumSize ?? 20
-
- if (
- !Number.isFinite(minimumSize) ||
- !Number.isFinite(maximumSize) ||
- minimumSize <= 0 ||
- maximumSize <= 0 ||
- minimumSize > maximumSize
- ) {
- throw new RangeError(
- 'minimumSize and maximumSize must be finite, positive, and minimumSize must not exceed maximumSize',
- )
- }
-
- const seedNumber = createSeedNumber(normalizedSeed)
- const generateRandomNumber = createDeterministicRandomGenerator(seedNumber)
-
- const patternType = pickValue(
- [
- 'diagonalLines',
- 'verticalLines',
- 'horizontalLines',
- 'crosshatch',
- 'dots',
- 'grid',
- 'zigzag',
- ] as const,
- generateRandomNumber,
- )
-
- const availableSizes: number[] = []
- for (let size = minimumSize; size <= maximumSize; size += 2) {
- availableSizes.push(size)
- }
-
- const tileSize = pickValue(toNonEmptyReadonlyArray(availableSizes), generateRandomNumber)
- const gap = pickValue([2, 3, 4, 5, 6] as const, generateRandomNumber)
- const strokeWidth = pickValue([1, 1.25, 1.5, 1.75, 2] as const, generateRandomNumber)
- const opacity = pickValue([0.7, 0.8, 0.9, 1] as const, generateRandomNumber)
- const rotation = pickValue([0, 15, 30, 45, 60, 75, 90, 120, 135] as const, generateRandomNumber)
-
- let contentMarkup = ''
-
- switch (patternType) {
- case 'diagonalLines': {
- contentMarkup = [
- createLineElement(
- -tileSize,
- tileSize,
- tileSize,
- -tileSize,
- foregroundColor,
- strokeWidth,
- opacity,
- ),
- createLineElement(0, tileSize, tileSize, 0, foregroundColor, strokeWidth, opacity),
- createLineElement(0, tileSize * 2, tileSize * 2, 0, foregroundColor, strokeWidth, opacity),
- ].join('')
- break
- }
-
- case 'verticalLines': {
- const positions = [0, gap + strokeWidth, (gap + strokeWidth) * 2]
- contentMarkup = positions
- .map(x => createLineElement(x, 0, x, tileSize, foregroundColor, strokeWidth, opacity))
- .join('')
- break
- }
-
- case 'horizontalLines': {
- const positions = [0, gap + strokeWidth, (gap + strokeWidth) * 2]
- contentMarkup = positions
- .map(y => createLineElement(0, y, tileSize, y, foregroundColor, strokeWidth, opacity))
- .join('')
- break
- }
-
- case 'crosshatch': {
- contentMarkup = [
- createLineElement(
- 0,
- tileSize / 2,
- tileSize,
- tileSize / 2,
- foregroundColor,
- strokeWidth,
- opacity,
- ),
- createLineElement(
- tileSize / 2,
- 0,
- tileSize / 2,
- tileSize,
- foregroundColor,
- strokeWidth,
- opacity,
- ),
- createLineElement(0, 0, tileSize, tileSize, foregroundColor, strokeWidth * 0.75, opacity),
- createLineElement(tileSize, 0, 0, tileSize, foregroundColor, strokeWidth * 0.75, opacity),
- ].join('')
- break
- }
-
- case 'dots': {
- const radius = Math.max(1, tileSize / 12)
- contentMarkup = [
- createCircleElement(tileSize / 4, tileSize / 4, radius, foregroundColor, opacity),
- createCircleElement((tileSize * 3) / 4, tileSize / 4, radius, foregroundColor, opacity),
- createCircleElement(tileSize / 4, (tileSize * 3) / 4, radius, foregroundColor, opacity),
- createCircleElement(
- (tileSize * 3) / 4,
- (tileSize * 3) / 4,
- radius,
- foregroundColor,
- opacity,
- ),
- ].join('')
- break
- }
-
- case 'grid': {
- contentMarkup = [
- createLineElement(0, 0, tileSize, 0, foregroundColor, strokeWidth, opacity),
- createLineElement(0, 0, 0, tileSize, foregroundColor, strokeWidth, opacity),
- createLineElement(
- 0,
- tileSize / 2,
- tileSize,
- tileSize / 2,
- foregroundColor,
- strokeWidth * 0.8,
- opacity,
- ),
- createLineElement(
- tileSize / 2,
- 0,
- tileSize / 2,
- tileSize,
- foregroundColor,
- strokeWidth * 0.8,
- opacity,
- ),
- ].join('')
- break
- }
-
- case 'zigzag': {
- const midPoint = tileSize / 2
- const pathData = `M 0 ${midPoint} L ${tileSize / 4} 0 L ${tileSize / 2} ${midPoint} L ${(tileSize * 3) / 4} ${tileSize} L ${tileSize} ${midPoint}`
- contentMarkup = createPathElement(pathData, 'none', foregroundColor, strokeWidth, opacity)
- break
- }
- }
-
- if (backgroundColor !== 'transparent') {
- const safeBackgroundColor = escapeSvgAttribute(backgroundColor)
- contentMarkup = ` ${contentMarkup}`
- }
-
- return {
- width: tileSize,
- height: tileSize,
- rotation,
- patternType,
- contentMarkup,
- }
-}
-
-export type ChartPatternSlotProps = {
- id: string
- seed: string | number
- color?: string
- foregroundColor: string
- fallbackColor: string
- maxSize: number
- minSize: number
-}
-
-// Equivalent of the PatternSlot.vue component, to be used inside tooltip.customFormat in chart configs
-export function createChartPatternSlotMarkup({
- id,
- seed,
- color,
- foregroundColor,
- fallbackColor,
- maxSize,
- minSize,
-}: ChartPatternSlotProps) {
- const pattern = createSeededSvgPattern(seed, {
- foregroundColor,
- backgroundColor: color ?? fallbackColor,
- minimumSize: minSize,
- maximumSize: maxSize,
- })
-
- return `
-
- ${pattern.contentMarkup}
-
- `
+export const CHART_PATTERN_CONFIG = {
+ disambiguator: 1,
+ minSize: 16,
+ maxSize: 24,
}
diff --git a/cli/package.json b/cli/package.json
index 455fd222d..c205f7d4c 100644
--- a/cli/package.json
+++ b/cli/package.json
@@ -46,6 +46,6 @@
"typescript": "6.0.2"
},
"engines": {
- "node": ">=24"
+ "node": ">=24.4.0"
}
}
diff --git a/cli/src/npm-client.ts b/cli/src/npm-client.ts
index 8448413b5..5e288cd41 100644
--- a/cli/src/npm-client.ts
+++ b/cli/src/npm-client.ts
@@ -2,7 +2,7 @@ import crypto from 'node:crypto'
import process from 'node:process'
import { execFile } from 'node:child_process'
import { promisify } from 'node:util'
-import { mkdtemp, writeFile, rm } from 'node:fs/promises'
+import { mkdtempDisposable, writeFile } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import * as v from 'valibot'
@@ -569,91 +569,84 @@ export async function packageInit(
): Promise {
validatePackageName(name)
- // Create a temporary directory
- const tempDir = await mkdtemp(join(tmpdir(), 'npmx-init-'))
-
- try {
- // Determine access type based on whether it's a scoped package
- const isScoped = name.startsWith('@')
- const access = isScoped ? 'public' : undefined
-
- // Create minimal package.json
- const packageJson = {
- name,
- version: '0.0.0',
- description: `Placeholder for ${name}`,
- main: 'index.js',
- scripts: {},
- keywords: [],
- author: author ? `${author} (https://www.npmjs.com/~${author})` : '',
- license: 'UNLICENSED',
- private: false,
- ...(access && { publishConfig: { access } }),
- }
+ // Let Node clean up the temp directory automatically when this scope exits.
+ await using tempDir = await mkdtempDisposable(join(tmpdir(), 'npmx-init-'))
+
+ // Determine access type based on whether it's a scoped package
+ const isScoped = name.startsWith('@')
+ const access = isScoped ? 'public' : undefined
+
+ // Create minimal package.json
+ const packageJson = {
+ name,
+ version: '0.0.0',
+ description: `Placeholder for ${name}`,
+ main: 'index.js',
+ scripts: {},
+ keywords: [],
+ author: author ? `${author} (https://www.npmjs.com/~${author})` : '',
+ license: 'UNLICENSED',
+ private: false,
+ ...(access && { publishConfig: { access } }),
+ }
- await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson, null, 2))
+ await writeFile(join(tempDir.path, 'package.json'), JSON.stringify(packageJson, null, 2))
- // Create empty index.js
- await writeFile(join(tempDir, 'index.js'), '// Placeholder\n')
+ // Create empty index.js
+ await writeFile(join(tempDir.path, 'index.js'), '// Placeholder\n')
- // Build npm publish args
- const args = ['publish']
- if (access) {
- args.push('--access', access)
- }
+ // Build npm publish args
+ const args = ['publish']
+ if (access) {
+ args.push('--access', access)
+ }
- // Run npm publish from the temp directory
- const npmArgs = otp ? [...args, '--otp', otp] : args
+ // Run npm publish from the temp directory
+ const npmArgs = otp ? [...args, '--otp', otp] : args
- // Log the command being run (hide OTP value for security)
- const displayCmd = otp ? `npm ${args.join(' ')} --otp ******` : `npm ${args.join(' ')}`
- logCommand(`${displayCmd} (in temp dir for ${name})`)
+ // Log the command being run (hide OTP value for security)
+ const displayCmd = otp ? `npm ${args.join(' ')} --otp ******` : `npm ${args.join(' ')}`
+ logCommand(`${displayCmd} (in temp dir for ${name})`)
- try {
- const { stdout, stderr } = await execFileAsync('npm', npmArgs, {
- timeout: 60000,
- cwd: tempDir,
- env: createNpmEnv(),
- shell: process.platform === 'win32',
- })
+ try {
+ const { stdout, stderr } = await execFileAsync('npm', npmArgs, {
+ timeout: 60000,
+ cwd: tempDir.path,
+ env: createNpmEnv(),
+ shell: process.platform === 'win32',
+ })
- logSuccess(`Published ${name}@0.0.0`)
+ logSuccess(`Published ${name}@0.0.0`)
- return {
- stdout: stdout.trim(),
- stderr: filterNpmWarnings(stderr),
- exitCode: 0,
- }
- } catch (error) {
- const err = error as { stdout?: string; stderr?: string; code?: number }
- const stderr = err.stderr?.trim() ?? String(error)
- const requiresOtp = detectOtpRequired(stderr)
- const authFailure = detectAuthFailure(stderr)
+ return {
+ stdout: stdout.trim(),
+ stderr: filterNpmWarnings(stderr),
+ exitCode: 0,
+ }
+ } catch (error) {
+ const err = error as { stdout?: string; stderr?: string; code?: number }
+ const stderr = err.stderr?.trim() ?? String(error)
+ const requiresOtp = detectOtpRequired(stderr)
+ const authFailure = detectAuthFailure(stderr)
- if (requiresOtp) {
- logError('OTP required')
- } else if (authFailure) {
- logError('Authentication required - please run "npm login" and restart the connector')
- } else {
- logError(filterNpmWarnings(stderr).split('\n')[0] || 'Command failed')
- }
+ if (requiresOtp) {
+ logError('OTP required')
+ } else if (authFailure) {
+ logError('Authentication required - please run "npm login" and restart the connector')
+ } else {
+ logError(filterNpmWarnings(stderr).split('\n')[0] || 'Command failed')
+ }
- return {
- stdout: err.stdout?.trim() ?? '',
- stderr: requiresOtp
- ? 'This operation requires a one-time password (OTP).'
- : authFailure
- ? 'Authentication failed. Please run "npm login" and restart the connector.'
- : filterNpmWarnings(stderr),
- exitCode: err.code ?? 1,
- requiresOtp,
- authFailure,
- }
+ return {
+ stdout: err.stdout?.trim() ?? '',
+ stderr: requiresOtp
+ ? 'This operation requires a one-time password (OTP).'
+ : authFailure
+ ? 'Authentication failed. Please run "npm login" and restart the connector.'
+ : filterNpmWarnings(stderr),
+ exitCode: err.code ?? 1,
+ requiresOtp,
+ authFailure,
}
- } finally {
- // Clean up temp directory
- await rm(tempDir, { recursive: true, force: true }).catch(() => {
- // Ignore cleanup errors
- })
}
}
diff --git a/config/i18n.ts b/config/i18n.ts
index e775400e7..316a7c652 100644
--- a/config/i18n.ts
+++ b/config/i18n.ts
@@ -359,6 +359,19 @@ const locales: (LocaleObjectData | (Omit & { code: str
file: 'nb-NO.json',
name: 'Norsk (Bokmål)',
},
+ {
+ code: 'sr-Latn-RS',
+ file: 'sr-Latn-RS.json',
+ name: 'Srpski (Latinica)',
+ pluralRule: createPluralRule('sr-Latn-RS', {
+ zero: 2,
+ one: 0,
+ two: 1,
+ few: 1,
+ many: 2,
+ other: 2,
+ }),
+ },
]
function buildLocales() {
diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico
new file mode 100644
index 000000000..462aaa384
Binary files /dev/null and b/docs/public/favicon.ico differ
diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json
index 0edd42dca..131d42dec 100644
--- a/i18n/locales/ar.json
+++ b/i18n/locales/ar.json
@@ -651,12 +651,10 @@
"code": {
"files_label": "الملفات",
"no_files": "لا توجد ملفات في هذا المجلد",
- "root": "الجذر",
"lines": "{count} سطر",
"toggle_tree": "إظهار/إخفاء شجرة الملفات",
"close_tree": "إغلاق شجرة الملفات",
"copy_link": "نسخ الرابط",
- "raw": "خام (Raw)",
"view_raw": "عرض الملف الخام (Raw)",
"file_too_large": "الملف كبير جدًا للمعاينة",
"file_size_warning": "{size} يتجاوز حد 500KB للتظليل النحوي (syntax highlighting)",
diff --git a/i18n/locales/az-AZ.json b/i18n/locales/az-AZ.json
index 85894165e..48856ad81 100644
--- a/i18n/locales/az-AZ.json
+++ b/i18n/locales/az-AZ.json
@@ -755,12 +755,10 @@
"code": {
"files_label": "Fayllar",
"no_files": "Bu qovluqda fayl yoxdur",
- "root": "kök",
"lines": "{count} sətir",
"toggle_tree": "Fayl ağacını keçir",
"close_tree": "Fayl ağacını bağla",
"copy_link": "Linki kopyala",
- "raw": "Xam",
"view_raw": "Xam faylı göstər",
"file_too_large": "Fayl önbaxış üçün çox böyükdür",
"file_size_warning": "{size} sintaksis vurğulama üçün 500KB limitini keçir",
diff --git a/i18n/locales/bg-BG.json b/i18n/locales/bg-BG.json
index 032d82a6e..41053f59b 100644
--- a/i18n/locales/bg-BG.json
+++ b/i18n/locales/bg-BG.json
@@ -716,12 +716,10 @@
"code": {
"files_label": "Файлове",
"no_files": "Няма файлове в тази директория",
- "root": "root",
"lines": "{count} ред | {count} реда",
"toggle_tree": "Превключване на дървото с файлове",
"close_tree": "Затваряне на дървото с файлове",
"copy_link": "Копиране на връзка",
- "raw": "Raw",
"view_raw": "Преглед на raw файл",
"file_too_large": "Файлът е твърде голям за преглед",
"file_size_warning": "{size} надвишава лимита от 500KB за синтактично оцветяване",
diff --git a/i18n/locales/bn-IN.json b/i18n/locales/bn-IN.json
index 39d19eec6..ff7cf7ee7 100644
--- a/i18n/locales/bn-IN.json
+++ b/i18n/locales/bn-IN.json
@@ -545,12 +545,10 @@
"code": {
"files_label": "ফাইলগুলি",
"no_files": "এই ডাইরেক্টরিতে কোনো ফাইল নেই",
- "root": "রুট",
"lines": "{count}টি লাইন",
"toggle_tree": "ফাইল ট্রি টগল করুন",
"close_tree": "ফাইল ট্রি বন্ধ করুন",
"copy_link": "লিঙ্ক কপি করুন",
- "raw": "রও",
"view_raw": "রও ফাইল দেখুন",
"file_too_large": "প্রিভিউ-র জন্য ফাইল খুব বড়",
"file_size_warning": "{size} সিনট্যাক্স হাইলাইটিং-এর জন্য 500KB সীমার চেয়ে বেশি",
diff --git a/i18n/locales/cs-CZ.json b/i18n/locales/cs-CZ.json
index 638904c4f..22ae14fcc 100644
--- a/i18n/locales/cs-CZ.json
+++ b/i18n/locales/cs-CZ.json
@@ -19,7 +19,8 @@
"social": "sociální sítě",
"chat": "chat",
"builders_chat": "stavitelé",
- "keyboard_shortcuts": "klávesové zkratky"
+ "keyboard_shortcuts": "klávesové zkratky",
+ "brand": "značka"
},
"shortcuts": {
"section": {
@@ -36,7 +37,9 @@
"go_to_result": "Přejít na výsledek",
"open_code_view": "Otevřít zobrazení kódu",
"open_docs": "Otevřít dokumentaci",
- "disable_shortcuts": "Klávesové zkratky můžete zakázat v {settings}."
+ "disable_shortcuts": "Klávesové zkratky můžete zakázat v {settings}.",
+ "open_main": "Otevřít hlavní informace",
+ "open_diff": "Otevřít rozdíly verzí"
},
"search": {
"label": "Hledat npm balíčky",
@@ -94,6 +97,7 @@
},
"draft_badge": "Návrh",
"draft_banner": "Toto je nepublikovaný návrh. Může být neúplný nebo obsahovat nepřesnosti.",
+ "no_posts": "Nebyly nalezeny žádné příspěvky.",
"atproto": {
"view_on_bluesky": "Zobrazit na Bluesky",
"reply_on_bluesky": "Odpovědět na Bluesky",
@@ -136,19 +140,33 @@
"include_types_description": "Přidat balíček {'@'}types do instalačních příkazů pro balíčky bez integrovaných typů",
"hide_platform_packages": "Skrýt platformně specifické balíčky ve vyhledávání",
"hide_platform_packages_description": "Skrýt nativní binární balíčky jako {'@'}esbuild/linux-x64 z výsledků",
+ "enable_graph_pulse_loop": "Povolit smyčku efektu pulzování na mini grafu",
+ "enable_graph_pulse_loop_description": "Aktivovat kontinuální animaci pulzu na grafu týdenních stažení. Tato animace může být pro některé uživatele rušivá.",
"theme": "Téma",
"theme_light": "Světlé",
"theme_dark": "Tmavé",
"theme_system": "Systémové",
"language": "Jazyk",
"help_translate": "Pomozte přeložit npmx",
+ "translation_status": "Zkontrolovat globální stav překladu",
"accent_colors": {
- "label": "Barvy akcentu"
+ "label": "Barvy akcentu",
+ "sky": "Obloha",
+ "coral": "Korál",
+ "amber": "Jantar",
+ "emerald": "Smaragd",
+ "violet": "Fialová",
+ "magenta": "Magenta"
},
"clear_accent": "Vymazat barvu akcentu",
"translation_progress": "Pokrok překladu",
"background_themes": {
- "label": "Odstín pozadí"
+ "label": "Odstín pozadí",
+ "neutral": "Neutrální",
+ "stone": "Kámen",
+ "zinc": "Zinek",
+ "slate": "Břidlice",
+ "black": "Černá"
},
"keyboard_shortcuts_enabled": "Povolit klávesové zkratky",
"keyboard_shortcuts_enabled_description": "Klávesové zkratky lze zakázat, pokud se střetávají s jinými zkratkami prohlížeče nebo systému"
@@ -207,7 +225,9 @@
"radicle": "Zobrazit na Radicle",
"sourcehut": "Zobrazit na SourceHutu",
"tangled": "Zobrazit na Tangled"
- }
+ },
+ "collapse": "Sbalit",
+ "expand": "Rozbalit"
},
"profile": {
"display_name": "Zobrazované jméno",
@@ -286,9 +306,11 @@
"refs": "{count} odkaz | {count} odkazy | {count} odkazů",
"assets": "{count} zdroj | {count} zdroje | {count} zdrojů"
},
- "view_source": "Zobrazit zdroj"
+ "view_source": "Zobrazit zdroj",
+ "skills_cli": "CLI dovednosti"
},
"links": {
+ "main": "domů",
"repo": "repozitář",
"homepage": "domovská stránka",
"issues": "úkoly",
@@ -296,15 +318,23 @@
"code": "kód",
"docs": "dokumentace",
"fund": "financovat",
- "compare": "porovnat"
+ "compare": "porovnat",
+ "compare_this_package": "porovnat tento balíček"
},
"likes": {
"like": "Líbí se mi tento balíček",
"unlike": "Nelíbí se mi tento balíček"
},
"docs": {
+ "contents": "Obsah",
+ "default_not_available": "Dokumentace této verze není k dispozici.",
"not_available": "Dokumentace není k dispozici",
- "not_available_detail": "Nepodařilo se nám vygenerovat dokumentaci pro tuto verzi."
+ "not_available_detail": "Nepodařilo se nám vygenerovat dokumentaci pro tuto verzi.",
+ "page_title": "API dokumentace - npmx",
+ "page_title_name": "Dokumentace {name} - npmx",
+ "page_title_version": "Dokumentace {name} - npmx",
+ "og_title": "{name} - Dokumentace",
+ "view_package": "Zobrazit balíček"
},
"get_started": {
"title": "Začínáme",
@@ -364,7 +394,9 @@
"published": "Publikováno",
"weekly_downloads": "Týdenní stažení",
"keywords": "Klíčová slova",
- "license": "Licence"
+ "license": "Licence",
+ "select": "Vybrat balíček",
+ "select_maximum": "Maximálně lze vybrat {count} balíčků"
},
"versions": {
"title": "Verze",
@@ -379,6 +411,7 @@
"all_covered": "Všechny verze jsou pokryty výše uvedenými tagy",
"deprecated_title": "{version} (zastaralá)",
"view_all": "Zobrazit {count} verzi | Zobrazit {count} verze | Zobrazit {count} verzí",
+ "view_all_versions": "Zobrazit všechny verze",
"distribution_title": "Skupina Semver",
"distribution_modal_title": "Verze",
"distribution_range_date_same_year": "od {from} do {to}, {endYear}",
@@ -386,10 +419,13 @@
"grouping_major": "Hlavní",
"grouping_minor": "Vedlejší",
"grouping_versions_title": "Verze",
+ "grouping_versions_about": "O seskupování verzí",
"grouping_versions_all": "Všechny",
"grouping_versions_only_recent": "Pouze nedávné",
"grouping_usage_title": "Použití",
+ "grouping_usage_about": "O seskupování užití",
"grouping_usage_all": "Všechno",
+ "grouping_usage_most_used": "Nejčastěji používané",
"recent_versions_only_tooltip": "Zobrazit pouze verze zveřejněné v posledním roce.",
"show_low_usage_tooltip": "Zahrnout skupiny verzí s méně než 1 % celkových stažení.",
"y_axis_label": "Stažení",
@@ -402,7 +438,12 @@
"copy_alt": {
"per_version_analysis": "Verze {version} byla stažena {downloads} krát",
"general_description": "Sloupcový graf zobrazující stažení podle verzí pro {versions_count} {semver_grouping_mode} verze balíčku {package_name}, {date_range_label} od verze {first_version} do verze {last_version}. Nejvíce stažená verze je {max_downloaded_version} s {max_version_downloads} staženími. {per_version_analysis}. {watermark}."
- }
+ },
+ "page_title": "Historie verzí",
+ "current_tags": "Aktuální značky",
+ "version_filter_placeholder": "Filtrovat verze…",
+ "version_filter_label": "Filtrovat verze",
+ "no_match_filter": "Žádné verze neodpovídají {filter}"
},
"dependencies": {
"title": "Závislosti ({count})",
@@ -413,7 +454,8 @@
"outdated_major": "o {count} hlavní verzi pozadu (nejnovější: {latest}) | o {count} hlavní verze pozadu (nejnovější: {latest}) | o {count} hlavních verzích pozadu (nejnovější: {latest})",
"outdated_minor": "o {count} vedlejší verzi pozadu (nejnovější: {latest}) | o {count} vedlejší verze pozadu (nejnovější: {latest}) | o {count} vedlejších verzích pozadu (nejnovější: {latest})",
"outdated_patch": "Aktualizace záplaty dostupná (nejnovější: {latest})",
- "has_replacement": "Tato závislost má navrhované náhrady"
+ "has_replacement": "Tato závislost má navrhované náhrady",
+ "vulnerabilities_count": "{count} zranitelnost | {count} zranitelnosti | {count} zranitelností"
},
"peer_dependencies": {
"title": "Vzájemné závislosti ({count})",
@@ -437,9 +479,19 @@
"cancel_add": "Zrušit přidání vlastníka",
"add_owner": "+ Přidat vlastníka",
"show_more": "(zobrazit {count} dalšího) | (zobrazit {count} další) | (zobrazit {count} dalších)",
- "show_less": "(zobrazit méně)"
+ "show_less": "(zobrazit méně)",
+ "maintainer_template": "{avatar} {char126}{name}"
},
"trends": {
+ "chart_assistive_text": {
+ "keyboard_navigation_horizontal": "Použijte klávesy se šipkami vlevo a vpravo pro procházení datovými body.",
+ "keyboard_navigation_vertical": "Použijte klávesy se šipkami nahoru a dolů pro procházení datovými body.",
+ "table_available": "Tabulka dat pro tento graf je k dispozici níže.",
+ "table_caption": "Tabulka dat grafu"
+ },
+ "chart_view_toggle": "Přepnout typ grafu",
+ "chart_view_combined": "Kombinovaný pohled",
+ "chart_view_split": "Rozdělený pohled",
"granularity": "Rozlišení",
"granularity_daily": "Denně",
"granularity_weekly": "Týdně",
@@ -469,6 +521,7 @@
"data_correction": "Oprava dat",
"average_window": "Okno průměru",
"smoothing": "Vyhlazování",
+ "prediction": "Predikce",
"known_anomalies": "Známé anomálie",
"known_anomalies_description": "Interpoluje přes známé špičky stažení způsobené boty nebo problémy s CI.",
"known_anomalies_ranges": "Rozsahy anomálií",
@@ -497,7 +550,8 @@
"downloads": {
"title": "Týdenní stažení",
"community_distribution": "Zobrazit rozložení adopce v komunitě",
- "subtitle": "Napříč všemi verzemi"
+ "subtitle": "Napříč všemi verzemi",
+ "sparkline_nav_hint": "Použijte ← →"
},
"install_scripts": {
"title": "Instalační skripty",
@@ -513,6 +567,7 @@
"esm": "ES Moduly podporovány",
"cjs": "CommonJS podporováno",
"no_esm": "Bez podpory ES Modulů",
+ "wasm": "Obsahuje WebAssembly",
"types_label": "Typy",
"types_included": "Typy zahrnuty",
"types_available": "Typy dostupné přes {package}",
@@ -587,7 +642,10 @@
"kb": "{size} kB",
"mb": "{size} MB"
},
- "download": {}
+ "download": {
+ "button": "Stáhnout",
+ "tarball": "Stáhnout Tarball jako .tar.gz"
+ }
},
"connector": {
"modal": {
@@ -767,13 +825,15 @@
"code": {
"files_label": "Soubory",
"no_files": "Žádné soubory v této složce",
- "root": "kořen",
"lines": "{count} řádků",
"toggle_tree": "Přepnout strom souborů",
"close_tree": "Zavřít strom souborů",
+ "copy_content": "Zkopírovat obsah souboru",
"copy_link": "Kopírovat odkaz",
- "raw": "Raw",
"view_raw": "Zobrazit raw soubor",
+ "toggle_container": "Přepnout šířku kontejneru kódu",
+ "open_raw_file": "Otevřít soubor jako kód",
+ "open_path_dropdown": "Otevřít rozbalovací seznam segmentů cesty",
"file_too_large": "Soubor je příliš velký pro náhled",
"file_size_warning": "{size} překračuje limit 500KB pro zvýraznění syntaxe",
"failed_to_load": "Nepodařilo se načíst soubor",
@@ -791,7 +851,9 @@
"preview": "náhled",
"code": "kód"
},
- "file_path": "Cesta k souboru"
+ "file_path": "Cesta k souboru",
+ "binary_file": "Binární soubor",
+ "binary_rendering_warning": "Náhled pro typy souborů \"{contentType}\" není k dispozici."
},
"badges": {
"provenance": {
@@ -853,6 +915,8 @@
"secure": "Bez varování",
"insecure": "S varováními"
},
+ "view_selected": "Zobrazit vybrané",
+ "clear_selected_label": "Vyčistit vybrané",
"sort": {
"label": "Seřadit podle",
"toggle_direction": "Přepnout směr řazení",
@@ -878,7 +942,8 @@
"published": "Naposledy publikováno",
"maintainers": "Správci",
"keywords": "Klíčová slova",
- "security": "Bezpečnost"
+ "security": "Bezpečnost",
+ "selection": "Vybrat balíček"
},
"view_mode": {
"label": "Režim zobrazení",
@@ -1025,7 +1090,8 @@
"error": "Nepodařilo se načíst organizace",
"empty": "Nebyly nalezeny žádné organizace",
"view_all": "Zobrazit vše"
- }
+ },
+ "pr": "Otevřít GitHub PR #{prNumber}"
},
"compare": {
"packages": {
@@ -1044,7 +1110,10 @@
"empty_title": "Vyberte balíčky k porovnání",
"empty_description": "Vyhledejte a přidejte alespoň 2 balíčky výše, abyste viděli porovnání jejich metrik vedle sebe.",
"table_view": "Tabulka",
- "charts_view": "Grafy"
+ "charts_view": "Grafy",
+ "no_chartable_data": "Pro vybrané kategorie nejsou k dispozici žádná data pro graf.",
+ "bar_chart_nav_hint": "Použijte ↑ ↓",
+ "line_chart_nav_hint": "Použijte ← →"
},
"selector": {
"search_label": "Vyhledat balíčky",
@@ -1067,6 +1136,10 @@
"facets": {
"all": "Vše",
"none": "Žádné",
+ "select_all_category_facets": "Vybrat všechny vlastnosti kategorie {category}",
+ "deselect_all_category_facets": "Zrušit výběr všech vlastností kategorie {category}",
+ "selected_all_category_facets": "Vybrané všechny vlastnosti kategorie {category}",
+ "deselected_all_category_facets": "Zrušen výběr všech vlastností kategorie {category}",
"coming_soon": "Brzy k dispozici",
"select_all": "Vybrat všechny vlastnosti",
"deselect_all": "Zrušit výběr všech vlastností",
@@ -1153,7 +1226,15 @@
"file_size_warning": "{size} překračuje limit 250KB pro porovnání",
"compare_versions": "porovnat",
"compare_versions_title": "Porovnat s nejnovější verzí",
- "version_invalid_url_format": {},
+ "comparing_versions_label": "Porovnání verzí...",
+ "version_back_to_package": "Zpět na balíček",
+ "version_error_message": "Nepodařilo se porovnat verze.",
+ "version_invalid_url_format": {
+ "hint": "Chybná URL pro porovnání. Použijte formát: {0}",
+ "from_version": "od",
+ "to_version": "do"
+ },
+ "version_selector_title": "Porovnat s verzí",
"summary": "Souhrn",
"deps_count": "{count} závislostí",
"dependencies": "Závislosti",
@@ -1179,7 +1260,18 @@
"files_button": "Soubory",
"select_file_prompt": "Vyberte soubor z postranního panelu pro zobrazení jeho rozdílů",
"close_files_panel": "Zavřít panel souborů",
- "filter_files_label": "Filtrovat soubory podle typu změny"
+ "filter_files_label": "Filtrovat soubory podle typu změny",
+ "change_ratio": "Poměr změn",
+ "char_edits": "Změny znaků",
+ "diff_distance": "Vzdálenost rozdílů",
+ "loading_diff": "Načítání rozdílů...",
+ "loading_diff_error": "Nepodařilo se načíst rozdíly",
+ "merge_modified_lines": "Sloučit upravené řádky",
+ "no_content_changes": "Nebyly zjištěny žádné změny obsahu",
+ "options": "Možnosti",
+ "view_file": "Zobrazit soubor",
+ "view_in_code_browser": "Zobrazit v prohlížeči kódu",
+ "word_wrap": "Zalomení slov"
},
"pds": {
"title": "npmx.social",
@@ -1320,7 +1412,117 @@
}
},
"translation_status": {
- "table": {}
+ "title": "stav překladu",
+ "generated_at": "Vygenerováno: {date}",
+ "welcome": "Pokud máte zájem pomoci nám přeložit {npmx} do jednoho z níže uvedených jazyků, jste na správném místě! Tato stránka se automaticky aktualizuje a vždy zobrazuje veškerý obsah, který právě potřebuje vaši pomoc.",
+ "p1": "Jako výchozí jazyk používáme {lang}, s celkovým počtem {count}. Pokud chcete pomoci s přidáváním překladů, najděte jazyk v {bylang} a rozbalte podrobnosti.",
+ "p1_lang": "americkou angličtinu (en-US)",
+ "p1_count": "1 text | {count} texty | {count} textů",
+ "p2": "Než začnete, přečtěte si prosím našeho {guide}, abyste se seznámili s naším procesem překladu a zjistili, jak se můžete zapojit.",
+ "guide": "průvodce lokalizací (i18n)",
+ "by_locale": "Pokrok překladu podle jazyka",
+ "by_file": "Pokrok překladu podle souboru",
+ "complete_text": "Tento překlad je dokončen, skvělá práce!",
+ "missing_text": "chybí",
+ "missing_keys": "{count} chybějící překlad | {count} chybějící překlady | {count} chybějících překladů",
+ "progress_label": "Pokrok překladu do jazyka {locale}",
+ "table": {
+ "file": "Soubor",
+ "status": "Stav",
+ "error": "Chyba při načítání seznamu souborů.",
+ "empty": "Žádné soubory nebyly nalezeny",
+ "file_link": "Upravit {file} ({lang}) na GitHubu"
+ }
+ },
+ "vacations": {
+ "title": "na dovolené",
+ "meta_description": "Tým npmx si odpočinul. Discord se po týdnu znovu otevřel.",
+ "heading": "dobíjíme se",
+ "subtitle": "Budovali jsme npmx tempem, které {some} stálo spánek. Nechtěli jsme, aby se to stalo normou! Tak jsme si vzali na týden volno. Společně.",
+ "illustration_alt": "řada hezkých ikonek",
+ "poke_log": "Šťouchnout do ohniště",
+ "what": {
+ "title": "co se stalo",
+ "p1": "discord byl uzavřen {dates}.",
+ "dates": "14. – 21. února",
+ "p2": "všechny pozvánky byly uzavřeny a kanály byly uzamčeny – kromě {garden}, který zůstal otevřený pro ty, kteří se chtěli dál bavit.",
+ "garden": "#garden"
+ },
+ "meantime": {
+ "title": "mezitím",
+ "p1": "{site} a {repo} zůstaly otevřené – lidé se stále zapojovali, výtvářeli další úkoly, otevírali několik PR, ale hlavně všichni trávili čas někde poblíž útulného krbu.",
+ "repo_link": "repozitář"
+ },
+ "return": {
+ "title": "jsme zpět!",
+ "p1": "vrátili jsme se odpočatí a připraveni na poslední přípravy před 3. březnem. {social}.",
+ "social_link": "sledujte nás na Bluesky"
+ },
+ "stats": {
+ "contributors": "Přispěvatelé",
+ "commits": "Commity",
+ "pr": "Mergnutá PR",
+ "subtitle": {
+ "some": "pár z nás",
+ "all": "nás všechny"
+ }
+ }
+ },
+ "action_bar": {
+ "title": "panel akcí",
+ "selection": "vybrán {count} | vybrány {count} | vybráno {count}",
+ "shortcut": "Stiskněte \"{key}\" pro zaměření akcí",
+ "button_close_aria_label": "Zavřít panel akcí"
+ },
+ "logo_menu": {
+ "copy_svg": "Zkopírovat logo jako SVG",
+ "copied": "Zkopírováno!",
+ "browse_brand": "Procházet sadu značky"
+ },
+ "brand": {
+ "title": "Značka",
+ "heading": "značka",
+ "meta_description": "Pokyny k značce npmx, loga, barvy a typografie pro použití v tisku a médiích.",
+ "intro": "Zdroje a pokyny pro používání značky npmx ve vašich projektech, článcích a médiích.",
+ "logos": {
+ "title": "loga",
+ "description": "Stáhněte si loga npmx ve formátech SVG a PNG. Použijte vhodnou variantu pro vaše pozadí.",
+ "wordmark": "PLNÉ LOGO",
+ "wordmark_alt": "Celé npmx logo s názvem, tečkou a lomítkem na tmavém pozadí",
+ "wordmark_light_alt": "Celé npmx logo s názvem, tečkou a lomítkem na světlém pozadí",
+ "mark": "KRÁTKÉ LOGO",
+ "mark_alt": "Logo npmx pouze s tečkou a lomítkem na tmavém pozadí",
+ "mark_light_alt": "Logo npmx pouze s tečkou a lomítkem na světlém pozadí",
+ "on_dark": "na tmavém pozadí",
+ "on_light": "na světlém pozadí",
+ "download_svg": "SVG",
+ "download_png": "PNG",
+ "download_svg_aria": "Stáhnout {name} jako SVG",
+ "download_png_aria": "Stáhnout {name} jako PNG"
+ },
+ "customize": {
+ "title": "přizpůsobte si své logo",
+ "description": "Náhled loga npmx s vámi vybranou akcentní barvou a pozadím. Náhled odráží vaše aktuální nastavení — vyberte barvu, pozadí a stáhněte.",
+ "accent_label": "akcent",
+ "bg_label": "pozadí",
+ "download_svg_aria": "Stáhnout přizpůsobené logo jako SVG",
+ "download_png_aria": "Stáhnout přizpůsobené logo jako PNG"
+ },
+ "typography": {
+ "title": "typografie",
+ "description": "npmx používá rodinu písem Geist od Vercelu pro texty rozhraní i kód.",
+ "sans": "Geist Sans",
+ "sans_desc": "Používá se pro texty těla a prvky uživatelského rozhraní.",
+ "mono": "Geist Mono",
+ "mono_desc": "Používá se pro kód, nadpisy a technický obsah.",
+ "pangram": "Příliš žluťoučký kůň úpěl ďábelské ódy",
+ "numbers": "0123456789"
+ },
+ "guidelines": {
+ "title": "jen maličkost",
+ "message": "Přístupnost je pro nás důležitá a rádi bychom, abyste se k nám připojili v této vizi. Při používání zmíněných médií zajistěte dostatečný kontrast vůči pozadí a nepoužívejte velikost menší než 24px. Pokud potřebujete další zdroje nebo další informace o projektu, neváhejte nás kontaktovat na {link}.",
+ "discord_link_text": "chat.npmx.dev"
+ }
},
- "action_bar": {}
+ "alt_logo_kawaii": "Roztomilá, zaoblená a barevná verze loga npmx."
}
diff --git a/i18n/locales/de.json b/i18n/locales/de.json
index 4a17bed86..34958fcfe 100644
--- a/i18n/locales/de.json
+++ b/i18n/locales/de.json
@@ -821,12 +821,10 @@
"code": {
"files_label": "Dateien",
"no_files": "Keine Dateien in diesem Verzeichnis",
- "root": "Wurzel",
"lines": "{count} Zeile | {count} Zeilen",
"toggle_tree": "Dateibaum umschalten",
"close_tree": "Dateibaum schließen",
"copy_link": "Link kopieren",
- "raw": "Roh",
"view_raw": "Rohdatei anzeigen",
"file_too_large": "Datei zu groß für Vorschau",
"file_size_warning": "{size} überschreitet das 500KB-Limit für Syntax-Highlighting",
@@ -1462,5 +1460,12 @@
"selection": "0 ausgewählt | 1 ausgewählt | {count} ausgewählt",
"shortcut": "Drücke „{key}“, um Aktionen zu fokussieren",
"button_close_aria_label": "Aktionsleiste schließen"
+ },
+ "logo_menu": {},
+ "brand": {
+ "logos": {},
+ "customize": {},
+ "typography": {},
+ "guidelines": {}
}
}
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 16c891ae4..66f0eb39b 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -825,13 +825,15 @@
"code": {
"files_label": "Files",
"no_files": "No files in this directory",
- "root": "root",
"lines": "{count} line | {count} lines",
"toggle_tree": "Toggle file tree",
"close_tree": "Close file tree",
+ "copy_content": "Copy file content",
"copy_link": "Copy link",
- "raw": "Raw",
"view_raw": "View raw file",
+ "toggle_container": "Toggle code container width",
+ "open_raw_file": "Open raw file",
+ "open_path_dropdown": "Open path segments dropdown",
"file_too_large": "File too large to preview",
"file_size_warning": "{size} exceeds the 500KB limit for syntax highlighting",
"failed_to_load": "Failed to load file",
@@ -846,8 +848,8 @@
"size": "Size"
},
"markdown_view_mode": {
- "preview": "preview",
- "code": "code"
+ "preview": "Preview",
+ "code": "Code"
},
"file_path": "File path",
"binary_file": "Binary file",
diff --git a/i18n/locales/es.json b/i18n/locales/es.json
index 3fe046fe2..78a50b980 100644
--- a/i18n/locales/es.json
+++ b/i18n/locales/es.json
@@ -772,12 +772,10 @@
"code": {
"files_label": "Archivos",
"no_files": "No hay archivos en este directorio",
- "root": "raíz",
"lines": "{count} líneas",
"toggle_tree": "Alternar árbol de archivos",
"close_tree": "Cerrar árbol de archivos",
"copy_link": "Copiar enlace",
- "raw": "Crudo",
"view_raw": "Ver archivo crudo",
"file_too_large": "Archivo demasiado grande para previsualizar",
"file_size_warning": "{size} excede el límite de 500KB para resaltado de sintaxis",
diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json
index f6c17d5b9..cd8c0e960 100644
--- a/i18n/locales/fr-FR.json
+++ b/i18n/locales/fr-FR.json
@@ -825,12 +825,10 @@
"code": {
"files_label": "Fichiers",
"no_files": "Aucun fichier dans ce répertoire",
- "root": "racine",
"lines": "{count} lignes",
"toggle_tree": "Basculer l'arborescence",
"close_tree": "Fermer l'arborescence",
"copy_link": "Copier le lien",
- "raw": "Brut",
"view_raw": "Voir le fichier brut",
"file_too_large": "Fichier trop volumineux pour l'aperçu",
"file_size_warning": "{size} dépasse la limite de 500 Ko pour la coloration syntaxique",
@@ -1487,5 +1485,6 @@
"message": "Pour un usage commercial, veuillez nous contacter.",
"discord_link_text": "Discussion Discord"
}
- }
+ },
+ "alt_logo_kawaii": "Une version mignonne, arrondie et colorée du logo npmx."
}
diff --git a/i18n/locales/hi-IN.json b/i18n/locales/hi-IN.json
index 56873fa20..f50667807 100644
--- a/i18n/locales/hi-IN.json
+++ b/i18n/locales/hi-IN.json
@@ -13,11 +13,11 @@
"trademark_disclaimer": "npm, npm, Inc. का पंजीकृत ट्रेडमार्क है। यह साइट npm, Inc. से संबद्ध नहीं है।",
"footer": {
"about": "हमारे बारे में जानकारी",
+ "blog": "ब्लॉग",
"docs": "दस्तावेज़",
"source": "स्रोत",
"social": "सोशल",
"chat": "चैट",
- "blog": "ब्लॉग",
"builders_chat": "बिल्डर्स",
"keyboard_shortcuts": "कीबोर्ड शॉर्टकट"
},
@@ -46,13 +46,21 @@
"button": "खोजें",
"searching": "खोज रहे हैं...",
"found_packages": "कोई पैकेज नहीं मिला | 1 पैकेज मिला | {count} पैकेज मिले",
+ "found_packages_sorted": "कोई परिणाम नहीं मिला | शीर्ष {count} परिणाम क्रमबद्ध किया जा रहा है | शीर्ष {count} परिणाम क्रमबद्ध किए जा रहे हैं",
"updating": "(अद्यतन हो रहा है...)",
"no_results": "\"{query}\" के लिए कोई पैकेज नहीं मिला",
+ "rate_limited": "npm की rate limit लग गई है, कुछ देर बाद फिर प्रयास करें",
+ "title": "खोज",
+ "title_search": "खोज: {search}",
+ "title_packages": "पैकेज खोजें",
+ "meta_description": "'{search}' के लिए खोज परिणाम",
+ "meta_description_packages": "npm पैकेज खोजें",
"not_taken": "{name} उपलब्ध है",
"claim_prompt": "npm पर इस पैकेज नाम को दावा करें",
"claim_button": "\"{name}\" दावा करें",
"want_to_claim": "इस पैकेज नाम को दावा करना चाहते हैं?",
"start_typing": "पैकेज खोजने के लिए टाइप करना शुरू करें",
+ "algolia_disclaimer": "Algolia द्वारा संचालित",
"exact_match": "सटीक",
"suggestion": {
"user": "उपभोक्ता",
@@ -60,14 +68,6 @@
"view_user_packages": "इस उपभोक्ता के पैकेज देखें",
"view_org_packages": "इस संगठन के पैकेज देखें"
},
- "found_packages_sorted": "कोई परिणाम नहीं मिला | शीर्ष {count} परिणाम क्रमबद्ध किया जा रहा है | शीर्ष {count} परिणाम क्रमबद्ध किए जा रहे हैं",
- "rate_limited": "npm की rate limit लग गई है, कुछ देर बाद फिर प्रयास करें",
- "title": "खोज",
- "title_search": "खोज: {search}",
- "title_packages": "पैकेज खोजें",
- "meta_description": "'{search}' के लिए खोज परिणाम",
- "meta_description_packages": "npm पैकेज खोजें",
- "algolia_disclaimer": "Algolia द्वारा संचालित",
"instant_search": "तुरंत खोज",
"instant_search_on": "चालू",
"instant_search_off": "बंद",
@@ -88,9 +88,15 @@
"tap_to_search": "खोजने के लिए टैप करें"
},
"blog": {
+ "title": "ब्लॉग",
+ "heading": "ब्लॉग",
+ "meta_description": "npmx समुदाय से अंतर्दृष्टि और अपडेट",
"author": {
"view_profile": "Bluesky पर {name} की प्रोफ़ाइल देखें"
},
+ "draft_badge": "मसौदा",
+ "draft_banner": "यह एक अप्रकाशित मसौदा है। यह अधूरा हो सकता है या इसमें अशुद्धियाँ हो सकती हैं।",
+ "no_posts": "कोई पोस्ट नहीं मिली।",
"atproto": {
"view_on_bluesky": "Bluesky पर देखें",
"reply_on_bluesky": "Bluesky पर जवाब दें",
@@ -105,13 +111,7 @@
"like_count": "{count} लाइक | {count} लाइक्स",
"repost_count": "{count} रिपोस्ट | {count} रिपोस्ट",
"more_replies": "{count} और जवाब... | {count} और जवाब..."
- },
- "title": "ब्लॉग",
- "heading": "ब्लॉग",
- "meta_description": "npmx समुदाय से अंतर्दृष्टि और अपडेट",
- "draft_badge": "मसौदा",
- "draft_banner": "यह एक अप्रकाशित मसौदा है। यह अधूरा हो सकता है या इसमें अशुद्धियाँ हो सकती हैं।",
- "no_posts": "कोई पोस्ट नहीं मिली।"
+ }
},
"settings": {
"title": "सेटिंग्स",
@@ -120,8 +120,8 @@
"sections": {
"appearance": "स्वरूप",
"display": "प्रदर्शन",
- "language": "भाषा",
"search": "खोज सुविधाएँ",
+ "language": "भाषा",
"keyboard_shortcuts": "कीबोर्ड शॉर्टकट"
},
"data_source": {
@@ -132,17 +132,22 @@
"algolia": "Algolia",
"algolia_description": "तेज़ खोज, org और user पेजों के लिए Algolia का उपयोग करता है।"
},
+ "instant_search": "तुरंत खोज",
+ "instant_search_description": "खोज पेज पर ले जाता है और आपके टाइप करते ही परिणाम अपडेट करता है।",
"relative_dates": "सापेक्ष तिथियाँ",
"include_types": "इंस्टॉल में {'@'}types शामिल करें",
"include_types_description": "अनटाइप्ड पैकेज के लिए इंस्टॉल कमांड में {'@'}types पैकेज जोड़ें",
"hide_platform_packages": "खोज में प्लेटफ़ॉर्म-विशिष्ट पैकेज छिपाएं",
"hide_platform_packages_description": "परिणामों से {'@'}esbuild/linux-x64 जैसे नेटिव बाइनरी पैकेज छिपाएं",
+ "enable_graph_pulse_loop": "मिनी ग्राफ़ पर pulse प्रभाव का लूपिंग सक्षम करें",
+ "enable_graph_pulse_loop_description": "साप्ताहिक डाउनलोड ग्राफ़ पर लगातार pulse animation सक्रिय करें। यह animation कुछ उपयोगकर्ताओं के लिए विचलित करने वाला हो सकता है।",
"theme": "थीम",
"theme_light": "लाइट",
"theme_dark": "डार्क",
"theme_system": "सिस्टम",
"language": "भाषा",
"help_translate": "npmx का अनुवाद करने में मदद करें",
+ "translation_status": "वैश्विक अनुवाद स्थिति देखें",
"accent_colors": {
"label": "एक्सेंट रंग",
"sky": "आसमानी",
@@ -162,11 +167,6 @@
"slate": "स्लेट",
"black": "काला"
},
- "instant_search": "तुरंत खोज",
- "instant_search_description": "खोज पेज पर ले जाता है और आपके टाइप करते ही परिणाम अपडेट करता है।",
- "enable_graph_pulse_loop": "मिनी ग्राफ़ पर pulse प्रभाव का लूपिंग सक्षम करें",
- "enable_graph_pulse_loop_description": "साप्ताहिक डाउनलोड ग्राफ़ पर लगातार pulse animation सक्रिय करें। यह animation कुछ उपयोगकर्ताओं के लिए विचलित करने वाला हो सकता है।",
- "translation_status": "वैश्विक अनुवाद स्थिति देखें",
"keyboard_shortcuts_enabled": "कीबोर्ड शॉर्टकट सक्षम करें",
"keyboard_shortcuts_enabled_description": "यदि कीबोर्ड शॉर्टकट अन्य ब्राउज़र या सिस्टम शॉर्टकट से टकराते हैं, तो उन्हें बंद किया जा सकता है"
},
@@ -192,6 +192,7 @@
"end_of_results": "परिणाम समाप्त",
"try_again": "पुनः प्रयास करें",
"close": "बंद करें",
+ "or": "या",
"retry": "पुनः प्रयास",
"copy": "कॉपी करें",
"copied": "कॉपी हो गया!",
@@ -206,6 +207,10 @@
"members": "सदस्य"
},
"scroll_to_top": "शीर्ष पर स्क्रॉल करें",
+ "cancel": "रद्द करें",
+ "save": "सहेजें",
+ "edit": "संपादित करें",
+ "error": "त्रुटि",
"view_on": {
"npm": "npm पर देखें",
"github": "GitHub पर देखें",
@@ -220,30 +225,11 @@
"sourcehut": "SourceHut पर देखें",
"tangled": "Tangled पर देखें"
},
- "or": "या",
- "cancel": "रद्द करें",
- "save": "सहेजें",
- "edit": "संपादित करें",
- "error": "त्रुटि",
"collapse": "संक्षिप्त करें",
"expand": "विस्तृत करें"
},
"profile": {
- "invite": {
- "message": "ऐसा नहीं लगता कि वे अभी npmx का उपयोग कर रहे हैं। क्या आप उन्हें इसके बारे में बताना चाहते हैं?",
- "share_button": "Bluesky पर साझा करें",
- "compose_text": "Hey {'@'}{handle}! Have you checked out npmx.dev yet? It's a browser for the npm registry that's fast, modern, and open-source.\nhttps://npmx.dev"
- },
- "display_name": "प्रदर्शित नाम",
- "description": "विवरण",
- "no_description": "कोई विवरण नहीं",
- "website": "वेबसाइट",
- "website_placeholder": "https://example.com",
- "likes": "लाइक्स",
- "seo_title": "{handle} - npmx",
- "seo_description": "{handle} द्वारा npmx प्रोफ़ाइल",
- "not_found": "प्रोफ़ाइल नहीं मिली",
- "not_found_message": "{handle} की प्रोफ़ाइल नहीं मिल सकी।"
+ "invite": {}
},
"package": {
"not_found": "पैकेज नहीं मिला",
@@ -271,9 +257,9 @@
"documented": "{community} ने इस पैकेज को अधिक प्रदर्शनकारी विकल्पों के रूप में फ़्लैग किया है।",
"none": "यह पैकेज अब आवश्यक नहीं होने के रूप में फ़्लैग किया गया है, और इसकी कार्यक्षमता सभी इंजनों में नेटिवली उपलब्ध होने की संभावना है।",
"learn_more": "और जानें",
+ "learn_more_above": "ऊपर और जानें।",
"mdn": "MDN",
"community": "समुदाय",
- "learn_more_above": "ऊपर और जानें।",
"consider_no_dep": "+ बिना निर्भरता पर विचार करें?"
},
"stats": {
@@ -281,14 +267,14 @@
"deps": "निर्भरता",
"install_size": "इंस्टॉल साइज़",
"vulns": "कमजोरियाँ",
+ "published": "प्रकाशित",
+ "published_tooltip": "{package}{'@'}{version} के प्रकाशित होने की तिथि",
"view_dependency_graph": "निर्भरता ग्राफ़ देखें",
"inspect_dependency_tree": "निर्भरता ट्री का निरीक्षण करें",
"size_tooltip": {
"unpacked": "{size} अनपैक्ड साइज़ (यह पैकेज)",
"total": "{size} कुल अनपैक्ड साइज़ (linux-x64 के लिए सभी {count} निर्भरता सहित)"
- },
- "published": "प्रकाशित",
- "published_tooltip": "{package}{'@'}{version} के प्रकाशित होने की तिथि"
+ }
},
"skills": {
"title": "एजेंट स्किल्स",
@@ -309,6 +295,7 @@
"skills_cli": "skills CLI"
},
"links": {
+ "main": "मुख्य",
"repo": "रिपो",
"homepage": "मुखपृष्ठ",
"issues": "मसले",
@@ -317,7 +304,6 @@
"docs": "दस्तावेज़",
"fund": "दान करें",
"compare": "तुलना करें",
- "main": "मुख्य",
"compare_this_package": "इस पैकेज की तुलना करें"
},
"likes": {
@@ -325,10 +311,10 @@
"unlike": "इस पैकेज को अनलाइक करें"
},
"docs": {
- "not_available": "दस्तावेज़ उपलब्ध नहीं",
- "not_available_detail": "हम इस संस्करण के लिए दस्तावेज़ जेनरेट नहीं कर सके।",
"contents": "सामग्री",
"default_not_available": "इस संस्करण के लिए दस्तावेज़ उपलब्ध नहीं हैं।",
+ "not_available": "दस्तावेज़ उपलब्ध नहीं",
+ "not_available_detail": "हम इस संस्करण के लिए दस्तावेज़ जेनरेट नहीं कर सके।",
"page_title": "API Docs - npmx",
"page_title_name": "{name} docs - npmx",
"page_title_version": "{name} docs - npmx",
@@ -339,9 +325,9 @@
"title": "शुरू करें",
"pm_label": "पैकेज मैनेजर",
"copy_command": "इंस्टॉल कमांड कॉपी करें",
- "view_types": "{package} देखें",
"copy_dev_command": "dev इंस्टॉल कमांड कॉपी करें",
- "dev_dependency_hint": "आमतौर पर dev dependency के रूप में इंस्टॉल किया जाता है"
+ "dev_dependency_hint": "आमतौर पर dev dependency के रूप में इंस्टॉल किया जाता है",
+ "view_types": "{package} देखें"
},
"create": {
"title": "नया प्रोजेक्ट बनाएं",
@@ -355,6 +341,7 @@
"readme": {
"title": "रीडमी",
"no_readme": "कोई README उपलब्ध नहीं है।",
+ "toc_title": "रूपरेखा",
"callout": {
"note": "नोट",
"tip": "सुझाव",
@@ -362,7 +349,6 @@
"warning": "चेतावनी",
"caution": "सावधानी"
},
- "toc_title": "रूपरेखा",
"copy_as_markdown": "README को Markdown के रूप में कॉपी करें"
},
"provenance_section": {
@@ -390,10 +376,10 @@
"compatibility": "संगतता",
"card": {
"publisher": "प्रकाशक",
+ "published": "प्रकाशित",
"weekly_downloads": "साप्ताहिक डाउनलोड्स",
"keywords": "कीवर्ड्स",
"license": "अनुज्ञप्ति",
- "published": "प्रकाशित",
"select": "पैकेज चुनें",
"select_maximum": "अधिकतम {count} पैकेज चुने जा सकते हैं"
},
@@ -410,10 +396,6 @@
"all_covered": "सभी संस्करण ऊपर के टैग्स द्वारा कवर किए गए हैं",
"deprecated_title": "{version} (डेप्रीकेटेड)",
"view_all": "{count} संस्करण देखें | सभी {count} संस्करण देखें",
- "copy_alt": {
- "per_version_analysis": "{version} संस्करण {downloads} बार डाउनलोड किया गया था",
- "general_description": "बार चार्ट {package_name} पैकेज के {versions_count} {semver_grouping_mode} संस्करणों के प्रति-संस्करण डाउनलोड दिखाता है, {date_range_label} {first_version} संस्करण से {last_version} संस्करण तक। सबसे अधिक डाउनलोड किया गया संस्करण {max_downloaded_version} है, जिसके {max_version_downloads} डाउनलोड हैं। {per_version_analysis}. {watermark}."
- },
"view_all_versions": "सभी संस्करण देखें",
"distribution_title": "Semver समूह",
"distribution_modal_title": "संस्करण",
@@ -438,6 +420,10 @@
"filter_tooltip": "{link} का उपयोग करके संस्करण फ़िल्टर करें। उदाहरण के लिए, ^3.0.0 सभी 3.x संस्करण दिखाता है।",
"filter_tooltip_link": "semver range",
"no_matches": "इस range से कोई संस्करण मेल नहीं खाता",
+ "copy_alt": {
+ "per_version_analysis": "{version} संस्करण {downloads} बार डाउनलोड किया गया था",
+ "general_description": "बार चार्ट {package_name} पैकेज के {versions_count} {semver_grouping_mode} संस्करणों के प्रति-संस्करण डाउनलोड दिखाता है, {date_range_label} {first_version} संस्करण से {last_version} संस्करण तक। सबसे अधिक डाउनलोड किया गया संस्करण {max_downloaded_version} है, जिसके {max_version_downloads} डाउनलोड हैं। {per_version_analysis}. {watermark}."
+ },
"page_title": "संस्करण इतिहास",
"current_tags": "वर्तमान टैग्स",
"version_filter_placeholder": "संस्करण फ़िल्टर करें…",
@@ -482,6 +468,12 @@
"maintainer_template": "{avatar} {char126}{name}"
},
"trends": {
+ "chart_assistive_text": {
+ "keyboard_navigation_horizontal": "डेटा बिंदुओं के बीच जाने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग करें।",
+ "keyboard_navigation_vertical": "डेटा बिंदुओं के बीच जाने के लिए ऊपर और नीचे तीर कुंजियों का उपयोग करें।",
+ "table_available": "इस चार्ट के लिए नीचे एक डेटा तालिका उपलब्ध है।",
+ "table_caption": "चार्ट डेटा तालिका"
+ },
"granularity": "ग्रैन्युलैरिटी",
"granularity_daily": "दैनिक",
"granularity_weekly": "साप्ताहिक",
@@ -494,33 +486,6 @@
"date_range_multiline": "{start}\nसे {end}",
"download_file": "{fileType} डाउनलोड करें",
"toggle_annotator": "एनोटेटर टॉगल करें",
- "items": {
- "downloads": "डाउनलोड्स",
- "likes": "लाइक्स",
- "contributors": "योगदानकर्ता"
- },
- "copy_alt": {
- "trend_none": "लगभग स्थिर",
- "trend_strong": "मज़बूत",
- "trend_weak": "कमज़ोर",
- "trend_undefined": "अपरिभाषित (पर्याप्त डेटा नहीं)",
- "button_label": "वैकल्पिक पाठ कॉपी करें",
- "watermark": "नीचे की ओर एक वॉटरमार्क लिखा है \"./npmx a fast, modern browser for the npm registry\"",
- "analysis": "{package_name} {start_value} से शुरू होता है और {end_value} पर समाप्त होता है, जो प्रति समय अंतराल {downloads_slope} डाउनलोड की ढलान के साथ {trend} रुझान दिखाता है",
- "estimation": "अंतिम मान वर्तमान अवधि के आंशिक डेटा पर आधारित एक अनुमान है।",
- "estimations": "अंतिम मान वर्तमान अवधि के आंशिक डेटा पर आधारित अनुमान हैं।",
- "compare": "इनके लिए पैकेज डाउनलोड तुलना रेखा चार्ट: {packages}।",
- "single_package": "{package} पैकेज के लिए डाउनलोड रेखा चार्ट।",
- "general_description": "Y अक्ष डाउनलोड की संख्या दर्शाता है। X अक्ष {start_date} से {end_date} तक की तारीख सीमा दर्शाता है, जिसमें {granularity} समय अवधि है।{estimation_notice} {packages_analysis}. {watermark}.",
- "facet_bar_general_description": "इनके लिए क्षैतिज बार चार्ट: {packages}, {facet} की तुलना करते हुए ({description})। {facet_analysis} {watermark}.",
- "facet_bar_analysis": "{package_name} का मान {value} है।"
- },
- "chart_assistive_text": {
- "keyboard_navigation_horizontal": "डेटा बिंदुओं के बीच जाने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग करें।",
- "keyboard_navigation_vertical": "डेटा बिंदुओं के बीच जाने के लिए ऊपर और नीचे तीर कुंजियों का उपयोग करें।",
- "table_available": "इस चार्ट के लिए नीचे एक डेटा तालिका उपलब्ध है।",
- "table_caption": "चार्ट डेटा तालिका"
- },
"toggle_stack_mode": "स्टैक मोड टॉगल करें",
"open_options": "विकल्प खोलें",
"close_options": "विकल्प बंद करें",
@@ -530,6 +495,11 @@
"facet": "फेसेट",
"title": "रुझान",
"contributors_skip": "Contributors में नहीं दिखाया गया (कोई GitHub repo नहीं):",
+ "items": {
+ "downloads": "डाउनलोड्स",
+ "likes": "लाइक्स",
+ "contributors": "योगदानकर्ता"
+ },
"data_correction": "डेटा सुधार",
"average_window": "औसत विंडो",
"smoothing": "स्मूदिंग",
@@ -541,7 +511,23 @@
"known_anomalies_range_named": "{packageName}: {start} से {end} तक",
"known_anomalies_none": "इस पैकेज के लिए कोई ज्ञात विसंगति नहीं। | इन पैकेजों के लिए कोई ज्ञात विसंगति नहीं।",
"known_anomalies_contribute": "विसंगति डेटा में योगदान दें",
- "apply_correction": "सुधार लागू करें"
+ "apply_correction": "सुधार लागू करें",
+ "copy_alt": {
+ "trend_none": "लगभग स्थिर",
+ "trend_strong": "मज़बूत",
+ "trend_weak": "कमज़ोर",
+ "trend_undefined": "अपरिभाषित (पर्याप्त डेटा नहीं)",
+ "button_label": "वैकल्पिक पाठ कॉपी करें",
+ "watermark": "नीचे की ओर एक वॉटरमार्क लिखा है \"./npmx a fast, modern browser for the npm registry\"",
+ "analysis": "{package_name} {start_value} से शुरू होता है और {end_value} पर समाप्त होता है, जो प्रति समय अंतराल {downloads_slope} डाउनलोड की ढलान के साथ {trend} रुझान दिखाता है",
+ "estimation": "अंतिम मान वर्तमान अवधि के आंशिक डेटा पर आधारित एक अनुमान है।",
+ "estimations": "अंतिम मान वर्तमान अवधि के आंशिक डेटा पर आधारित अनुमान हैं।",
+ "compare": "इनके लिए पैकेज डाउनलोड तुलना रेखा चार्ट: {packages}।",
+ "single_package": "{package} पैकेज के लिए डाउनलोड रेखा चार्ट।",
+ "general_description": "Y अक्ष डाउनलोड की संख्या दर्शाता है। X अक्ष {start_date} से {end_date} तक की तारीख सीमा दर्शाता है, जिसमें {granularity} समय अवधि है।{estimation_notice} {packages_analysis}. {watermark}.",
+ "facet_bar_general_description": "इनके लिए क्षैतिज बार चार्ट: {packages}, {facet} की तुलना करते हुए ({description})। {facet_analysis} {watermark}.",
+ "facet_bar_analysis": "{package_name} का मान {value} है।"
+ }
},
"downloads": {
"title": "साप्ताहिक डाउनलोड्स",
@@ -563,11 +549,11 @@
"esm": "ES Modules समर्थित",
"cjs": "CommonJS समर्थित",
"no_esm": "ES Modules समर्थन नहीं",
+ "wasm": "WebAssembly है",
"types_label": "टाइप्स",
"types_included": "टाइप्स शामिल हैं",
"types_available": "टाइप्स {package} के माध्यम से उपलब्ध",
- "no_types": "कोई TypeScript टाइप्स नहीं",
- "wasm": "WebAssembly है"
+ "no_types": "कोई TypeScript टाइप्स नहीं"
},
"license": {
"view_spdx": "SPDX पर अनुज्ञप्ति टेक्स्ट देखें",
@@ -629,9 +615,9 @@
},
"sort": {
"downloads": "सबसे अधिक डाउनलोड किए गए",
+ "published": "हाल ही में प्रकाशित",
"name_asc": "नाम (A-Z)",
- "name_desc": "नाम (Z-A)",
- "published": "हाल ही में प्रकाशित"
+ "name_desc": "नाम (Z-A)"
},
"size": {
"b": "{size} B",
@@ -678,7 +664,9 @@
"otp_placeholder": "OTP कोड दर्ज करें...",
"otp_label": "वन-टाइम पासवर्ड",
"retry_otp": "OTP के साथ पुनः प्रयास करें",
+ "retry_web_auth": "वेब प्रमाणीकरण के साथ पुनः प्रयास करें",
"retrying": "पुनः प्रयास कर रहे हैं...",
+ "open_web_auth": "वेब प्रमाणीकरण लिंक खोलें",
"approve_operation": "ऑपरेशन स्वीकृत करें",
"remove_operation": "ऑपरेशन हटाएं",
"approve_all": "सभी स्वीकृत करें",
@@ -686,9 +674,7 @@
"executing": "निष्पादित हो रहा है...",
"log": "लॉग",
"log_label": "पूर्ण ऑपरेशन्स लॉग",
- "remove_from_log": "लॉग से हटाएं",
- "retry_web_auth": "वेब प्रमाणीकरण के साथ पुनः प्रयास करें",
- "open_web_auth": "वेब प्रमाणीकरण लिंक खोलें"
+ "remove_from_log": "लॉग से हटाएं"
}
},
"org": {
@@ -802,6 +788,7 @@
"invalid_name": "अमान्य पैकेज नाम:",
"available": "यह नाम उपलब्ध है!",
"taken": "यह नाम पहले से लिया जा चुका है।",
+ "missing_permission": "आपके पास scope {'@'}{scope} में पैकेज जोड़ने की अनुमति नहीं है।",
"similar_warning": "समान पैकेज मौजूद हैं - npm इस नाम को अस्वीकार कर सकता है:",
"related": "संबंधित पैकेज:",
"scope_warning_title": "इसके बजाय स्कोप्ड पैकेज का उपयोग करने पर विचार करें",
@@ -814,19 +801,16 @@
"publishing": "प्रकाशित हो रहा है...",
"checking": "उपलब्धता जाँच रहे हैं...",
"failed_to_check": "नाम उपलब्धता जाँचने में विफल",
- "failed_to_claim": "पैकेज दावा करने में विफल",
- "missing_permission": "आपके पास scope {'@'}{scope} में पैकेज जोड़ने की अनुमति नहीं है।"
+ "failed_to_claim": "पैकेज दावा करने में विफल"
}
},
"code": {
"files_label": "फ़ाइलें",
"no_files": "इस डायरेक्टरी में कोई फ़ाइलें नहीं",
- "root": "रूट",
"lines": "{count} पंक्तियाँ",
"toggle_tree": "फ़ाइल ट्री टॉगल करें",
"close_tree": "फ़ाइल ट्री बंद करें",
"copy_link": "लिंक कॉपी करें",
- "raw": "रॉ",
"view_raw": "रॉ फ़ाइल देखें",
"file_too_large": "फ़ाइल पूर्वावलोकन के लिए बहुत बड़ी है",
"file_size_warning": "{size} सिंटैक्स हाइलाइटिंग के लिए 500KB सीमा से अधिक है",
@@ -909,6 +893,8 @@
"secure": "चेतावनियों के बिना",
"insecure": "चेतावनियों के साथ"
},
+ "view_selected": "चयनित देखें",
+ "clear_selected_label": "चयन साफ़ करें",
"sort": {
"label": "पैकेज क्रमबद्ध करें",
"toggle_direction": "क्रमबद्ध दिशा टॉगल करें",
@@ -919,8 +905,8 @@
"downloads_day": "डाउनलोड्स/दिन",
"downloads_month": "डाउनलोड्स/महीना",
"downloads_year": "डाउनलोड्स/वर्ष",
- "name": "नाम",
- "published": "अंतिम प्रकाशन"
+ "published": "अंतिम प्रकाशन",
+ "name": "नाम"
},
"columns": {
"title": "कॉलम्स",
@@ -931,10 +917,10 @@
"version": "संस्करण",
"description": "विवरण",
"downloads": "डाउनलोड्स/सप्ताह",
+ "published": "अंतिम प्रकाशन",
"maintainers": "अनुरक्षक",
"keywords": "कीवर्ड्स",
"security": "सुरक्षा",
- "published": "अंतिम प्रकाशन",
"selection": "पैकेज चुनें"
},
"view_mode": {
@@ -962,9 +948,7 @@
"security_warning": "सुरक्षा चेतावनी",
"secure": "सुरक्षित",
"no_packages": "कोई पैकेज नहीं मिले"
- },
- "view_selected": "चयनित देखें",
- "clear_selected_label": "चयन साफ़ करें"
+ }
},
"about": {
"title": "हमारे बारे में जानकारी",
@@ -1098,11 +1082,11 @@
"section_packages": "पैकेज",
"section_facets": "फेसेट्स",
"section_comparison": "तुलना",
+ "copy_as_markdown": "तालिका कॉपी करें",
"loading": "पैकेज डेटा लोड हो रहा है...",
"error": "पैकेज डेटा लोड करने में विफल। कृपया पुनः प्रयास करें।",
"empty_title": "तुलना करने के लिए पैकेज चुनें",
"empty_description": "उनके मेट्रिक्स की साथ-साथ तुलना देखने के लिए ऊपर कम से कम 2 पैकेज खोजें और जोड़ें।",
- "copy_as_markdown": "तालिका कॉपी करें",
"table_view": "तालिका",
"charts_view": "चार्ट्स",
"bar_chart_nav_hint": "↑ ↓ का उपयोग करें",
@@ -1132,6 +1116,7 @@
"coming_soon": "जल्द आ रहा है",
"select_all": "सभी फेसेट्स चुनें",
"deselect_all": "सभी फेसेट्स अचयनित करें",
+ "binary_only_tooltip": "यह पैकेज binaries दिखाता है और exports नहीं",
"categories": {
"performance": "प्रदर्शन",
"health": "स्वास्थ्य",
@@ -1205,24 +1190,7 @@
},
"trends": {
"title": "रुझानों की तुलना करें"
- },
- "binary_only_tooltip": "यह पैकेज binaries दिखाता है और exports नहीं"
- },
- "version_invalid_url_format": {
- "hint": "अमान्य तुलना URL. यह प्रारूप उपयोग करें: {0}",
- "from_version": "from",
- "to_version": "to"
- },
- "file_filter_option": {
- "all": "सभी ({count})",
- "added": "जोड़ी गई ({count})",
- "removed": "हटाई गई ({count})",
- "modified": "संशोधित ({count})"
- },
- "filter": {
- "added": "जोड़ी गई",
- "removed": "हटाई गई",
- "modified": "संशोधित"
+ }
},
"file_changes": "फ़ाइल परिवर्तन",
"files_count": "{count} फ़ाइल | {count} फ़ाइलें",
@@ -1234,6 +1202,11 @@
"comparing_versions_label": "संस्करणों की तुलना की जा रही है...",
"version_back_to_package": "पैकेज पर वापस जाएं",
"version_error_message": "संस्करणों की तुलना करने में विफल।",
+ "version_invalid_url_format": {
+ "hint": "अमान्य तुलना URL. यह प्रारूप उपयोग करें: {0}",
+ "from_version": "from",
+ "to_version": "to"
+ },
"version_selector_title": "संस्करण से तुलना करें",
"summary": "सारांश",
"deps_count": "{count} निर्भरता | {count} निर्भरताएँ",
@@ -1242,10 +1215,21 @@
"peer_dependencies": "पीयर निर्भरताएँ",
"optional_dependencies": "वैकल्पिक निर्भरताएँ",
"no_dependency_changes": "निर्भरता में कोई परिवर्तन नहीं",
+ "file_filter_option": {
+ "all": "सभी ({count})",
+ "added": "जोड़ी गई ({count})",
+ "removed": "हटाई गई ({count})",
+ "modified": "संशोधित ({count})"
+ },
"search_files_placeholder": "फ़ाइलें खोजें...",
"no_files_all": "कोई फ़ाइल नहीं",
"no_files_search": "\"{query}\" से मेल खाती कोई फ़ाइल नहीं",
"no_files_filtered": "कोई {filter} फ़ाइल नहीं",
+ "filter": {
+ "added": "जोड़ी गई",
+ "removed": "हटाई गई",
+ "modified": "संशोधित"
+ },
"files_button": "फ़ाइलें",
"select_file_prompt": "उसका diff देखने के लिए sidebar से एक फ़ाइल चुनें",
"close_files_panel": "फ़ाइल पैनल बंद करें",
@@ -1263,6 +1247,8 @@
"word_wrap": "वर्ड रैप"
},
"pds": {
+ "title": "npmx.social",
+ "meta_description": "npmx समुदाय के लिए आधिकारिक AT Protocol Personal Data Server (PDS)।",
"join": {
"title": "समुदाय से जुड़ें",
"description": "चाहे आप atmosphere पर अपना पहला खाता बना रहे हों या किसी मौजूदा खाते को migrate कर रहे हों, आपका यहाँ स्वागत है। आप अपना handle, पोस्ट या followers खोए बिना अपने वर्तमान खाते को migrate कर सकते हैं।",
@@ -1286,11 +1272,12 @@
"empty": "दिखाने के लिए कोई समुदाय सदस्य नहीं है।",
"view_profile": "{handle} की प्रोफ़ाइल देखें",
"new_accounts": "...और {count} जो atmosphere पर नए हैं"
- },
- "title": "npmx.social",
- "meta_description": "npmx समुदाय के लिए आधिकारिक AT Protocol Personal Data Server (PDS)।"
+ }
},
"privacy_policy": {
+ "title": "गोपनीयता नीति",
+ "last_updated": "अंतिम अद्यतन: {date}",
+ "welcome": "{app} में आपका स्वागत है। हम आपकी गोपनीयता की रक्षा के लिए प्रतिबद्ध हैं। यह नीति बताती है कि हम कौन-सा डेटा एकत्र करते हैं, उसका उपयोग कैसे करते हैं, और आपकी जानकारी से जुड़े आपके अधिकार क्या हैं।",
"cookies": {
"what_are": {
"title": "कुकीज़ क्या हैं?",
@@ -1365,12 +1352,12 @@
"changes": {
"title": "इस नीति में बदलाव",
"p1": "हम समय-समय पर इस गोपनीयता नीति को अपडेट कर सकते हैं। किसी भी बदलाव को इस पेज पर अद्यतन संशोधन तिथि के साथ प्रकाशित किया जाएगा।"
- },
- "title": "गोपनीयता नीति",
- "last_updated": "अंतिम अद्यतन: {date}",
- "welcome": "{app} में आपका स्वागत है। हम आपकी गोपनीयता की रक्षा के लिए प्रतिबद्ध हैं। यह नीति बताती है कि हम कौन-सा डेटा एकत्र करते हैं, उसका उपयोग कैसे करते हैं, और आपकी जानकारी से जुड़े आपके अधिकार क्या हैं।"
+ }
},
"a11y": {
+ "title": "सुगम्यता",
+ "footer_title": "a11y",
+ "welcome": "हम चाहते हैं कि {app} अधिक से अधिक लोगों के लिए उपयोगी हो।",
"approach": {
"title": "हमारा दृष्टिकोण",
"p1": "हम Web Content Accessibility Guidelines (WCAG) 2.2 का पालन करने का प्रयास करते हैं और सुविधाएँ बनाते समय उन्हें संदर्भ के रूप में उपयोग करते हैं। हम WCAG के किसी भी स्तर के पूर्ण अनुरूप होने का दावा नहीं करते — सुगम्यता एक सतत प्रक्रिया है और अभी भी बहुत काम बाकी है।",
@@ -1395,19 +1382,9 @@
"title": "प्रतिक्रिया",
"p1": "यदि आपको {app} पर कोई accessibility बाधा दिखाई दे, तो कृपया हमारे {link} पर issue खोलकर हमें बताएं। हम ऐसी रिपोर्टों को गंभीरता से लेते हैं और उन्हें ठीक करने का पूरा प्रयास करेंगे।",
"link": "GitHub रिपॉजिटरी"
- },
- "title": "सुगम्यता",
- "footer_title": "a11y",
- "welcome": "हम चाहते हैं कि {app} अधिक से अधिक लोगों के लिए उपयोगी हो।"
+ }
},
"translation_status": {
- "table": {
- "file": "फ़ाइल",
- "status": "स्थिति",
- "error": "फ़ाइल सूची लोड करते समय त्रुटि।",
- "empty": "कोई फ़ाइल नहीं मिली",
- "file_link": "GitHub पर {file} ({lang}) संपादित करें"
- },
"title": "अनुवाद स्थिति",
"generated_at": "निर्माण तिथि: {date}",
"welcome": "यदि आप नीचे सूचीबद्ध भाषाओं में से किसी एक में {npmx} का अनुवाद करने में हमारी मदद करना चाहते हैं, तो आप सही जगह पर हैं! यह अपने-आप अपडेट होने वाला पेज हमेशा वह सारी सामग्री दिखाता है, जिसमें इस समय आपकी मदद की ज़रूरत है।",
@@ -1421,13 +1398,14 @@
"complete_text": "यह अनुवाद पूरा हो चुका है, शानदार काम!",
"missing_text": "गायब",
"missing_keys": "कोई अनुवाद गायब नहीं है | अनुवाद गायब है | अनुवाद गायब हैं",
- "progress_label": "{locale} के लिए प्रगति स्थिति"
- },
- "action_bar": {
- "title": "एक्शन बार",
- "selection": "0 चयनित | 1 चयनित | {count} चयनित",
- "shortcut": "क्रियाओं पर फ़ोकस करने के लिए \"{key}\" दबाएँ",
- "button_close_aria_label": "एक्शन बार बंद करें"
+ "progress_label": "{locale} के लिए प्रगति स्थिति",
+ "table": {
+ "file": "फ़ाइल",
+ "status": "स्थिति",
+ "error": "फ़ाइल सूची लोड करते समय त्रुटि।",
+ "empty": "कोई फ़ाइल नहीं मिली",
+ "file_link": "GitHub पर {file} ({lang}) संपादित करें"
+ }
},
"vacations": {
"title": "छुट्टी पर",
@@ -1462,5 +1440,18 @@
"all": "सभी"
}
}
+ },
+ "action_bar": {
+ "title": "एक्शन बार",
+ "selection": "0 चयनित | 1 चयनित | {count} चयनित",
+ "shortcut": "क्रियाओं पर फ़ोकस करने के लिए \"{key}\" दबाएँ",
+ "button_close_aria_label": "एक्शन बार बंद करें"
+ },
+ "logo_menu": {},
+ "brand": {
+ "logos": {},
+ "customize": {},
+ "typography": {},
+ "guidelines": {}
}
}
diff --git a/i18n/locales/hu-HU.json b/i18n/locales/hu-HU.json
index b81921f62..0a0b19980 100644
--- a/i18n/locales/hu-HU.json
+++ b/i18n/locales/hu-HU.json
@@ -716,12 +716,10 @@
"code": {
"files_label": "Fájlok",
"no_files": "Nincsenek fájlok ebben a könyvtárban",
- "root": "gyökér",
"lines": "{count} sor | {count} sor",
"toggle_tree": "Fájlfa kapcsolása",
"close_tree": "Fájlfa bezárása",
"copy_link": "Link másolása",
- "raw": "Nyers",
"view_raw": "Nyers fájl megtekintése",
"file_too_large": "A fájl túl nagy az előnézethez",
"file_size_warning": "{size} meghaladja az 500KB-os limitet a szintaxis alapú formázáshoz",
diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json
index 7383879d8..ba25f6037 100644
--- a/i18n/locales/id-ID.json
+++ b/i18n/locales/id-ID.json
@@ -825,12 +825,10 @@
"code": {
"files_label": "Berkas",
"no_files": "Tidak ada file di direktori ini",
- "root": "root",
"lines": "{count} baris",
"toggle_tree": "Ganti file tree",
"close_tree": "Tutup file tree",
"copy_link": "Salin tautan",
- "raw": "Raw",
"view_raw": "Lihat file mentah",
"file_too_large": "Berkas terlalu besar untuk pratinjau",
"file_size_warning": "{size} melebihi batas 500KB untuk penyorotan sintaksis",
@@ -1493,8 +1491,8 @@
"mark_light_alt": "Logo mark npmx dengan titik dan garis di latar terang",
"on_dark": "di latar gelap",
"on_light": "di latar terang",
- "download_png": "PNG",
"download_svg": "SVG",
+ "download_png": "PNG",
"download_svg_aria": "Unduh {name} sebagai SVG",
"download_png_aria": "Unduh {name} sebagai PNG"
},
diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json
index d96207920..8335afc24 100644
--- a/i18n/locales/it-IT.json
+++ b/i18n/locales/it-IT.json
@@ -634,12 +634,10 @@
"code": {
"files_label": "File",
"no_files": "Nessun file in questa directory",
- "root": "root",
"lines": "{count} riga | {count} righe",
"toggle_tree": "Attiva/disattiva albero dei file",
"close_tree": "Chiudi albero dei file",
"copy_link": "Copia link",
- "raw": "Raw",
"view_raw": "Visualizza file raw",
"file_too_large": "File troppo grande per visualizzare l'anteprima",
"file_size_warning": "{size} supera il limite di 500 KB per l'evidenziatore di sintassi",
diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json
index 2270f6c5d..2d21d1fb9 100644
--- a/i18n/locales/ja-JP.json
+++ b/i18n/locales/ja-JP.json
@@ -769,12 +769,10 @@
"code": {
"files_label": "ファイル",
"no_files": "このディレクトリにファイルはありません",
- "root": "ルート",
"lines": "{count} 行",
"toggle_tree": "ファイルツリーを切り替え",
"close_tree": "ファイルツリーを閉じる",
"copy_link": "リンクをコピー",
- "raw": "RAW",
"view_raw": "RAWファイルを表示",
"file_too_large": "ファイルが大きすぎるためプレビューできません",
"file_size_warning": "{size} は構文強調表示の制限である500KBを超えています",
diff --git a/i18n/locales/kn-IN.json b/i18n/locales/kn-IN.json
index f8ec04fa8..a78955fe2 100644
--- a/i18n/locales/kn-IN.json
+++ b/i18n/locales/kn-IN.json
@@ -546,12 +546,10 @@
"code": {
"files_label": "ಫೈಲ್ಗಳು",
"no_files": "ಈ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಯಾವುದೇ ಫೈಲ್ಗಳಿಲ್ಲ",
- "root": "ಮೂಲ",
"lines": "{count} ಸಾಲುಗಳು",
"toggle_tree": "ಫೈಲ್ ಮರವನ್ನು ಟಾಗಲ್ ಮಾಡಿ",
"close_tree": "ಫೈಲ್ ಮರ ಮುಚ್ಚಿ",
"copy_link": "ಲಿಂಕ್ ನಕಲಿಸಿ",
- "raw": "ರಾ",
"view_raw": "ರಾ ಫೈಲ್ ನೋಡಿ",
"file_too_large": "ಪೂರ್ವದೃಶ್ಯಕ್ಕಾಗಿ ಫೈಲ್ ತುಂಬಾ ದೊಡ್ಡದು",
"file_size_warning": "{size} ಸಿಂಟ್ಯಾಕ್ಸ್ ಹೈಲೈಟಿಂಗ್ಗೆ 500KB ಮಿತಿಯನ್ನು ಮೀರಿದೆ",
diff --git a/i18n/locales/mr-IN.json b/i18n/locales/mr-IN.json
index c2684b5a4..0bd6ea360 100644
--- a/i18n/locales/mr-IN.json
+++ b/i18n/locales/mr-IN.json
@@ -22,23 +22,7 @@
"keyboard_shortcuts": "कीबोर्ड शॉर्टकट"
},
"shortcuts": {
- "section": {
- "global": "जागतिक",
- "search": "शोध",
- "package": "पॅकेज"
- },
- "focus_search": "शोधावर फोकस करा",
- "show_kbd_hints": "कीबोर्ड सूचनांना ठळक करा",
- "settings": "सेटिंग्ज उघडा",
- "compare": "तुलना उघडा",
- "compare_from_package": "तुलना उघडा (सध्याच्या पॅकेजसह पूर्वभरलेले)",
- "navigate_results": "परिणामांमध्ये फिरा",
- "go_to_result": "परिणामाकडे जा",
- "open_code_view": "कोड दृश्य उघडा",
- "open_docs": "दस्तऐवज उघडा",
- "disable_shortcuts": "तुम्ही {settings} मध्ये कीबोर्ड शॉर्टकट अक्षम करू शकता.",
- "open_main": "मुख्य माहिती उघडा",
- "open_diff": "आवृत्तीतील फरक उघडा"
+ "section": {}
},
"search": {
"label": "npm पॅकेजेस शोधा",
@@ -229,21 +213,7 @@
"expand": "विस्तृत करा"
},
"profile": {
- "display_name": "प्रदर्शन नाव",
- "description": "वर्णन",
- "no_description": "वर्णन नाही",
- "website": "वेबसाइट",
- "website_placeholder": "https://example.com",
- "likes": "पसंती",
- "seo_title": "{handle} - npmx",
- "seo_description": "{handle} द्वारे npmx प्रोफाइल",
- "not_found": "प्रोफाइल सापडले नाही",
- "not_found_message": "{handle} साठीचे प्रोफाइल सापडले नाही.",
- "invite": {
- "message": "ते अजून npmx वापरत आहेत असे दिसत नाही. त्यांना याबद्दल सांगायचे का?",
- "share_button": "Bluesky वर शेअर करा",
- "compose_text": "अहो {'@'}{handle}! तुम्ही अजून npmx.dev पाहिले आहे का? हा npm नोंदणीसाठी जलद, आधुनिक आणि मुक्त-स्रोत ब्राउझर आहे.\nhttps://npmx.dev"
- }
+ "invite": {}
},
"package": {
"not_found": "पॅकेज सापडले नाही",
@@ -815,12 +785,10 @@
"code": {
"files_label": "फायली",
"no_files": "कोणत्याही फाइल्स उपलब्ध नाहीत",
- "root": "मूळ",
"lines": "{count} ओळी",
"toggle_tree": "फाइल ट्री टॉगल करा",
"close_tree": "फाइल ट्री बंद करा",
"copy_link": "लिंक कॉपी करा",
- "raw": "कच्चा",
"view_raw": "कच्ची फाइल पहा",
"file_too_large": "पूर्वावलोकनासाठी फाइल खूप मोठी आहे",
"file_size_warning": "{size} हे सिंटॅक्स हायलाइटिंगसाठीच्या 500KB मर्यादेपेक्षा जास्त आहे",
diff --git a/i18n/locales/nb-NO.json b/i18n/locales/nb-NO.json
index cb919c567..221ad00dd 100644
--- a/i18n/locales/nb-NO.json
+++ b/i18n/locales/nb-NO.json
@@ -822,12 +822,10 @@
"code": {
"files_label": "Filer",
"no_files": "Ingen filer i denne mappen",
- "root": "rot",
"lines": "{count} linje | {count} linjer",
"toggle_tree": "Veksle filtre",
"close_tree": "Lukk filtre",
"copy_link": "Kopier lenke",
- "raw": "Rå",
"view_raw": "Vis råfil",
"file_too_large": "Filen er for stor til å forhåndsvises",
"file_size_warning": "{size} overstiger grensen på 500KB for syntaksmarkering",
diff --git a/i18n/locales/ne-NP.json b/i18n/locales/ne-NP.json
index 58b5a3ffe..0d16b488c 100644
--- a/i18n/locales/ne-NP.json
+++ b/i18n/locales/ne-NP.json
@@ -531,12 +531,10 @@
"code": {
"files_label": "फाइलहरू",
"no_files": "यो डाइरेक्टरीमा कुनै फाइल छैन",
- "root": "root",
"lines": "{count} लाइन",
"toggle_tree": "फाइल ट्री टगल",
"close_tree": "फाइल ट्री बन्द",
"copy_link": "लिङ्क कपी",
- "raw": "Raw",
"view_raw": "raw फाइल हेर्नुहोस्",
"file_too_large": "प्रिभ्यू गर्न फाइल धेरै ठूलो छ",
"file_size_warning": "syntax highlighting का लागि 500KB सीमा भन्दा {size} ठूलो छ",
diff --git a/i18n/locales/pl-PL.json b/i18n/locales/pl-PL.json
index 15d071ae0..c2b59412d 100644
--- a/i18n/locales/pl-PL.json
+++ b/i18n/locales/pl-PL.json
@@ -769,12 +769,10 @@
"code": {
"files_label": "Pliki",
"no_files": "Brak plików w tym katalogu",
- "root": "root",
"lines": "{count} wierszy",
"toggle_tree": "Przełącz drzewo plików",
"close_tree": "Zamknij drzewo plików",
"copy_link": "Kopiuj link",
- "raw": "Surowe",
"view_raw": "Zobacz surowy plik",
"file_too_large": "Plik jest zbyt duży, aby wyświetlić podgląd",
"file_size_warning": "{size} przekracza limit 500KB dla podświetlania składni",
diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json
index f0fef7d59..962638896 100644
--- a/i18n/locales/pt-BR.json
+++ b/i18n/locales/pt-BR.json
@@ -780,12 +780,10 @@
"code": {
"files_label": "Arquivos",
"no_files": "Nenhum arquivo neste diretório",
- "root": "raiz",
"lines": "{count} linhas",
"toggle_tree": "Alternar árvore de arquivos",
"close_tree": "Fechar árvore de arquivos",
"copy_link": "Copiar link",
- "raw": "Bruto",
"view_raw": "Ver arquivo bruto",
"file_too_large": "Arquivo muito grande para visualizar",
"file_size_warning": "{size} excede o limite de 500KB para destaque de sintaxe",
diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json
index a52805c44..a906b02bd 100644
--- a/i18n/locales/ru-RU.json
+++ b/i18n/locales/ru-RU.json
@@ -825,12 +825,10 @@
"code": {
"files_label": "Файлы",
"no_files": "В этой директории нет файлов",
- "root": "корневая директория",
"lines": "{count} строк",
"toggle_tree": "Переключить дерево файлов",
"close_tree": "Закрыть дерево файлов",
"copy_link": "Скопировать ссылку",
- "raw": "Raw",
"view_raw": "Посмотреть исходный файл",
"file_too_large": "Файл слишком большой для предпросмотра",
"file_size_warning": "{size} превышает лимит в 500 КБ для подсветки синтаксиса",
diff --git a/i18n/locales/sr-Latn-RS.json b/i18n/locales/sr-Latn-RS.json
new file mode 100644
index 000000000..31d313588
--- /dev/null
+++ b/i18n/locales/sr-Latn-RS.json
@@ -0,0 +1,1519 @@
+{
+ "$schema": "../schema.json",
+ "seo": {
+ "home": {
+ "title": "npmx - Pretraživač paketa za npm registar",
+ "description": "brzi, moderan pretraživač za npm registar. Pretražujte, pregledajte i istražujte pakete kroz moderan interfejs."
+ }
+ },
+ "built_at": "napravljeno {0}",
+ "alt_logo": "npmx logo",
+ "tagline": "brz, moderan pretraživač za npm registar",
+ "non_affiliation_disclaimer": "nije povezano sa npm, Inc.",
+ "trademark_disclaimer": "npm je registrovani zaštitni znak kompanije npm, Inc. Ovaj sajt nije povezan sa kompanijom npm, Inc.",
+ "footer": {
+ "about": "o nama",
+ "blog": "blog",
+ "docs": "dokumentacija",
+ "source": "izvor",
+ "social": "društvene mreže",
+ "chat": "ćaskanje",
+ "builders_chat": "builders",
+ "keyboard_shortcuts": "prečice na tastaturi",
+ "brand": "brend"
+ },
+ "shortcuts": {
+ "section": {
+ "global": "Globalno",
+ "search": "Pretraga",
+ "package": "Paket"
+ },
+ "focus_search": "Fokusirajte pretragu",
+ "show_kbd_hints": "Istaknite prečice na tastaturi",
+ "settings": "Otvorite podešavanja",
+ "compare": "Otvorite poređenje",
+ "compare_from_package": "Otvorite poređenje (sa trenutnim paketom)",
+ "navigate_results": "Krećite se kroz rezultate",
+ "go_to_result": "Idite na rezultat",
+ "open_code_view": "Otvorite pregled koda",
+ "open_docs": "Otvorite dokumentaciju",
+ "disable_shortcuts": "Možete isključiti prečice na tastaturi u {settings}.",
+ "open_main": "Otvorite glavne informacije",
+ "open_diff": "Otvorite razlike verzija"
+ },
+ "search": {
+ "label": "Pretražite npm pakete",
+ "placeholder": "pretražite pakete...",
+ "button": "pretražite",
+ "searching": "Pretražujem...",
+ "found_packages": "Nije pronađen nijedan paket | Pronađen 1 paket | Pronađeno {count} paketa",
+ "found_packages_sorted": "Nema rezultata | Sortiranje prvog {count} rezultata | Sortiranje prvih {count} rezultata",
+ "updating": "(ažuriranje...)",
+ "no_results": "Nema paketa za \"{query}\"",
+ "rate_limited": "Dostignuto npm ograničenje, pokušajte ponovo za trenutak",
+ "title": "pretraga",
+ "title_search": "pretraga: {search}",
+ "title_packages": "pretražite pakete",
+ "meta_description": "Rezultati pretrage za '{search}'",
+ "meta_description_packages": "Pretražite npm pakete",
+ "not_taken": "{name} nije zauzet",
+ "claim_prompt": "Zauzmite ovo ime paketa na npm-u",
+ "claim_button": "Zauzmite \"{name}\"",
+ "want_to_claim": "Želite da zauzmete ovo ime paketa?",
+ "start_typing": "Počnite da kucate za pretragu paketa",
+ "algolia_disclaimer": "Omogućio Algolia",
+ "exact_match": "tačno",
+ "suggestion": {
+ "user": "korisnik",
+ "org": "organizacija",
+ "view_user_packages": "Pogledajte pakete ovog korisnika",
+ "view_org_packages": "Pogledajte pakete ove organizacije"
+ },
+ "instant_search": "Trenutna pretraga",
+ "instant_search_on": "uključeno",
+ "instant_search_off": "isključeno",
+ "instant_search_turn_on": "uključite",
+ "instant_search_turn_off": "isključite",
+ "instant_search_advisory": "{label} {state} — {action}"
+ },
+ "nav": {
+ "main_navigation": "Glavno",
+ "popular_packages": "Popularni paketi",
+ "settings": "podešavanja",
+ "compare": "poređenje",
+ "back": "nazad",
+ "menu": "Meni",
+ "mobile_menu": "Meni za navigaciju",
+ "open_menu": "Otvorite meni",
+ "links": "Linkovi",
+ "tap_to_search": "Dodirnite za pretragu"
+ },
+ "blog": {
+ "title": "Blog",
+ "heading": "blog",
+ "meta_description": "Uvidi i novosti iz npmx zajednice",
+ "author": {
+ "view_profile": "Pogledajte profil {name} na Bluesky-u"
+ },
+ "draft_badge": "Nacrt",
+ "draft_banner": "Ovo je neobjavljeni nacrt. Može biti nepotpun ili sadržati netačnosti.",
+ "no_posts": "Nema pronađenih objava.",
+ "atproto": {
+ "view_on_bluesky": "Pogledajte na Bluesky-u",
+ "reply_on_bluesky": "Odgovorite na Bluesky-u",
+ "likes_on_bluesky": "Sviđanja na Bluesky-u",
+ "like_or_reply_on_bluesky": "Lajkujte ovu objavu ili dodajte komentar na Bluesky-u",
+ "no_comments_yet": "Još nema komentara.",
+ "could_not_load_comments": "Nije moguće učitati komentare.",
+ "comments": "Komentari",
+ "loading_comments": "Učitavanje komentara...",
+ "updating": "Ažuriranje...",
+ "reply_count": "{count} odgovor | {count} odgovora | {count} odgovora",
+ "like_count": "{count} sviđanje | {count} sviđanja | {count} sviđanja",
+ "repost_count": "{count} prosleđivanje | {count} prosleđivanja | {count} prosleđivanja",
+ "more_replies": "{count} još odgovor... | {count} još odgovora... | {count} još odgovora..."
+ }
+ },
+ "settings": {
+ "title": "podešavanja",
+ "tagline": "prilagodite svoje npmx iskustvo",
+ "meta_description": "Prilagodite svoje npmx.dev iskustvo pomoću podešavanja teme, jezika i prikaza.",
+ "sections": {
+ "appearance": "Izgled",
+ "display": "Prikaz",
+ "search": "Mogućnosti pretrage",
+ "language": "Jezik",
+ "keyboard_shortcuts": "Prečice na tastaturi"
+ },
+ "data_source": {
+ "label": "Izvor podataka",
+ "description": "Izaberite odakle npmx dobija podatke za pretragu. Stranice pojedinačnih paketa uvek koriste direktno npm registar.",
+ "npm": "npm registar",
+ "npm_description": "Dohvata pretragu, liste organizacija i korisnika direktno iz zvaničnog npm registra. Verodostojno, ali može biti sporije.",
+ "algolia": "Algolia",
+ "algolia_description": "Koristi Algolia za bržu pretragu, stranice organizacija i korisnika."
+ },
+ "instant_search": "Trenutna pretraga",
+ "instant_search_description": "Preusmerava na stranicu za pretragu i ažurira rezultate dok kucate.",
+ "relative_dates": "Relativni datumi",
+ "include_types": "Uključite {'@'}types u instalaciju",
+ "include_types_description": "Dodajte {'@'}types paket u komande za instalaciju za pakete bez tipova",
+ "hide_platform_packages": "Sakrijte pakete specifične za platformu u pretrazi",
+ "hide_platform_packages_description": "Sakrijte izvorne binarne pakete poput {'@'}esbuild/linux-x64 iz rezultata",
+ "enable_graph_pulse_loop": "Omogućite ponavljanje puls efekta na malom grafiku",
+ "enable_graph_pulse_loop_description": "Aktivirajte neprekidnu pulsirajuću animaciju na grafiku nedeljnih preuzimanja. Ova animacija može ometati neke korisnike.",
+ "theme": "Tema",
+ "theme_light": "Svetla",
+ "theme_dark": "Tamna",
+ "theme_system": "Sistemska",
+ "language": "Jezik",
+ "help_translate": "Pomozite u prevodu npmx-a",
+ "translation_status": "Proverite globalni status prevoda",
+ "accent_colors": {
+ "label": "Akcent boje",
+ "sky": "Nebeska",
+ "coral": "Koral",
+ "amber": "Ćilibar",
+ "emerald": "Smaragd",
+ "violet": "Ljubičasta",
+ "magenta": "Magenta"
+ },
+ "clear_accent": "Obrišite akcent boju",
+ "translation_progress": "Napredak prevoda",
+ "background_themes": {
+ "label": "Nijansa pozadine",
+ "neutral": "Neutralna",
+ "stone": "Kamena",
+ "zinc": "Cink",
+ "slate": "Škriljac",
+ "black": "Crna"
+ },
+ "keyboard_shortcuts_enabled": "Omogućite prečice na tastaturi",
+ "keyboard_shortcuts_enabled_description": "Prečice na tastaturi mogu biti isključene ako su u sukobu sa drugim prečicama pregledača ili sistema"
+ },
+ "i18n": {
+ "missing_keys": "{count} nedostajući prevod | {count} nedostajuća prevoda | {count} nedostajućih prevoda",
+ "copy_keys": "Kopirajte ključeve",
+ "show_more_keys": "Prikažite još {count}...",
+ "contribute_hint": "Pomozite poboljšanju ovog prevoda dodavanjem ključeva koji nedostaju.",
+ "edit_on_github": "Uredite na GitHub-u",
+ "view_guide": "Vodič za prevod"
+ },
+ "error": {
+ "401": "Neovlašćeno",
+ "404": "Stranica nije pronađena",
+ "500": "Interna greška servera",
+ "503": "Usluga nedostupna",
+ "default": "Nešto je pošlo naopako"
+ },
+ "common": {
+ "loading": "Učitavanje...",
+ "loading_more": "Učitavanje još...",
+ "loading_packages": "Učitavanje paketa...",
+ "end_of_results": "Kraj rezultata",
+ "try_again": "Pokušajte ponovo",
+ "close": "Zatvorite",
+ "or": "ili",
+ "retry": "Ponovite",
+ "copy": "kopirajte",
+ "copied": "kopirano!",
+ "skip_link": "Preskočite na glavni sadržaj",
+ "warnings": "Upozorenja:",
+ "go_back_home": "Vratite se na početnu",
+ "per_week": "/ nedeljno",
+ "vanity_downloads_hint": "Ukrasni broj: nema prikazanih paketa | Ukrasni broj: za prikazani paket | Ukrasni broj: Zbir {count} prikazanih paketa",
+ "sort": {
+ "name": "ime",
+ "role": "uloga",
+ "members": "članovi"
+ },
+ "scroll_to_top": "Vratite se na vrh",
+ "cancel": "Otkažite",
+ "save": "Sačuvajte",
+ "edit": "Uredite",
+ "error": "Greška",
+ "view_on": {
+ "npm": "pogledajte na npm-u",
+ "github": "Pogledajte na GitHub-u",
+ "gitlab": "Pogledajte na GitLab-u",
+ "bitbucket": "Pogledajte na Bitbucket-u",
+ "codeberg": "Pogledajte na Codeberg-u",
+ "git_repo": "Pogledajte u Git repozitorijumu",
+ "forgejo": "Pogledajte na Forgejo-u",
+ "gitea": "Pogledajte na Gitea-i",
+ "gitee": "Pogledajte na Gitee-u",
+ "radicle": "Pogledajte na Radicle-u",
+ "sourcehut": "Pogledajte na SourceHut-u",
+ "tangled": "Pogledajte na Tangled-u"
+ },
+ "collapse": "Skupite",
+ "expand": "Proširite"
+ },
+ "profile": {
+ "display_name": "Ime za prikaz",
+ "description": "Opis",
+ "no_description": "Nema opisa",
+ "website": "Veb sajt",
+ "website_placeholder": "https://example.com",
+ "likes": "Sviđanja",
+ "seo_title": "{handle} - npmx",
+ "seo_description": "npmx profil korisnika {handle}",
+ "not_found": "Profil nije pronađen",
+ "not_found_message": "Profil za {handle} nije moguće pronaći.",
+ "invite": {
+ "message": "Izgleda da još uvek ne koriste npmx. Želite li da im kažete nešto više o tome?",
+ "share_button": "Podelite na Bluesky-u",
+ "compose_text": "Hej {'@'}{handle}! Da li ste već pogledali npmx.dev? To je pretraživač za npm registar koji je brz, moderan i otvorenog koda.\nhttps://npmx.dev"
+ }
+ },
+ "package": {
+ "not_found": "Paket nije pronađen",
+ "not_found_message": "Paket nije moguće pronaći.",
+ "no_description": "Nema opisa",
+ "verified_provenance": "Verifikovano poreklo",
+ "navigation": "Paket",
+ "copy_name": "Kopirajte ime paketa",
+ "deprecation": {
+ "package": "Ovaj paket je zastareo.",
+ "version": "Ova verzija je zastarela.",
+ "no_reason": "Nije naveden razlog"
+ },
+ "size_increase": {
+ "title_size": "Značajno povećanje veličine od verzije v{version}",
+ "title_deps": "Značajno povećanje broja zavisnosti od verzije v{version}",
+ "title_both": "Značajno povećanje veličine i broja zavisnosti od verzije v{version}",
+ "size": "Veličina instalacije povećana za {percent} ({size} veća)",
+ "deps": "{count} više zavisnosti"
+ },
+ "replacement": {
+ "title": "Možda vam ova zavisnost ne treba.",
+ "native": "Ovo se može zameniti sa {replacement}, dostupno od Node verzije {nodeVersion}.",
+ "simple": "{community} je označio ovaj paket kao suvišan, sa savetom: {replacement}.",
+ "documented": "{community} je označio ovaj paket kao onaj koji ima performantnije alternative.",
+ "none": "Ovaj paket je označen kao nepotreban, a njegova funkcionalnost je verovatno dostupna izvorno u svim okruženjima.",
+ "learn_more": "Saznajte više",
+ "learn_more_above": "Saznajte više iznad.",
+ "mdn": "MDN",
+ "community": "zajednica",
+ "consider_no_dep": "+ Razmislite bez zavisnosti?"
+ },
+ "stats": {
+ "license": "Licenca",
+ "deps": "Zavisnosti",
+ "install_size": "Veličina instalacije",
+ "vulns": "Ranjivosti",
+ "published": "Objavljen",
+ "published_tooltip": "Datum kada je {package}{'@'}{version} objavljen",
+ "view_dependency_graph": "Pogledajte grafikon zavisnosti",
+ "inspect_dependency_tree": "Pregledajte stablo zavisnosti",
+ "size_tooltip": {
+ "unpacked": "{size} raspakovana veličina (ovaj paket)",
+ "total": "{size} ukupna raspakovana veličina (uključujući {count} zavisnost za linux-x64) | {size} ukupna raspakovana veličina (uključujući {count} zavisnosti za linux-x64) | {size} ukupna raspakovana veličina (uključujući svih {count} zavisnosti za linux-x64)"
+ }
+ },
+ "skills": {
+ "title": "Agent veštine",
+ "skills_available": "{count} veština dostupna | {count} veštine dostupne | {count} veština dostupno",
+ "compatible_with": "Kompatibilno sa {tool}",
+ "install": "Instalirajte",
+ "installation_method": "Metoda instalacije",
+ "learn_more": "Saznajte više",
+ "available_skills": "Dostupne veštine",
+ "click_to_expand": "Kliknite za proširenje",
+ "no_description": "Nema opisa",
+ "file_counts": {
+ "scripts": "{count} skripta | {count} skripte | {count} skripti",
+ "refs": "{count} referenca | {count} reference | {count} referenci",
+ "assets": "{count} stavka | {count} stavke | {count} stavki"
+ },
+ "view_source": "Pogledajte izvorni kod",
+ "skills_cli": "skills CLI"
+ },
+ "links": {
+ "main": "glavno",
+ "repo": "repozitorijum",
+ "homepage": "početna stranica",
+ "issues": "prijave problema",
+ "jsr": "jsr",
+ "code": "kod",
+ "docs": "dokumentacija",
+ "fund": "podržite",
+ "compare": "uporedite",
+ "compare_this_package": "uporedite ovaj paket"
+ },
+ "likes": {
+ "like": "Sviđa mi se ovaj paket",
+ "unlike": "Uklonite sviđanje"
+ },
+ "docs": {
+ "contents": "Sadržaj",
+ "default_not_available": "Dokumentacija nije dostupna za ovu verziju.",
+ "not_available": "Dokumentacija nije dostupna",
+ "not_available_detail": "Nismo uspeli da generišemo dokumentaciju za ovu verziju.",
+ "page_title": "API dokumentacija - npmx",
+ "page_title_name": "{name} dokumentacija - npmx",
+ "page_title_version": "{name} dokumentacija - npmx",
+ "og_title": "{name} - Dokumentacija",
+ "view_package": "Pogledajte paket"
+ },
+ "get_started": {
+ "title": "Početak",
+ "pm_label": "Upravljač paketima",
+ "copy_command": "Kopirajte komandu za instalaciju",
+ "copy_dev_command": "Kopirajte komandu za razvojnu instalaciju",
+ "dev_dependency_hint": "Obično se instalira kao razvojna zavisnost",
+ "view_types": "Pogledajte {package}"
+ },
+ "create": {
+ "title": "Kreirajte novi projekat",
+ "copy_command": "Kopirajte komandu za kreiranje",
+ "view": "{packageName} ima istog održavaoca. Kliknite za više detalja."
+ },
+ "run": {
+ "title": "Pokrenite",
+ "locally": "Pokrenite lokalno"
+ },
+ "readme": {
+ "title": "Readme",
+ "no_readme": "Nema README datoteke.",
+ "toc_title": "Sadržaj",
+ "callout": {
+ "note": "Napomena",
+ "tip": "Savet",
+ "important": "Važno",
+ "warning": "Upozorenje",
+ "caution": "Oprez"
+ },
+ "copy_as_markdown": "Kopirajte README kao Markdown"
+ },
+ "provenance_section": {
+ "title": "Poreklo",
+ "built_and_signed_on": "Izgrađeno i potpisano na {provider}",
+ "view_build_summary": "Pogledajte sažetak izgradnje",
+ "source_commit": "Izvorni commit",
+ "build_file": "Build datoteka",
+ "public_ledger": "Javni dnevnik",
+ "transparency_log_entry": "Zapis u transparentnom dnevniku",
+ "view_more_details": "Pogledajte više detalja",
+ "error_loading": "Neuspešno učitavanje detalja o poreklu"
+ },
+ "security_downgrade": {
+ "title": "Smanjenje poverenja",
+ "description_to_none_provenance": "Ova verzija je objavljena bez {provenance}.",
+ "description_to_none_trustedPublisher": "Ova verzija je objavljena bez {trustedPublishing}.",
+ "description_to_provenance_trustedPublisher": "Ova verzija koristi {provenance}, ali ne i {trustedPublishing}.",
+ "fallback_install_provenance": "Komande za instalaciju su zaključane na {version}, poslednju verziju sa poreklom.",
+ "fallback_install_trustedPublisher": "Komande za instalaciju su zaključane na {version}, poslednju verziju sa poverljivim objavljivanjem.",
+ "provenance_link_text": "poreklo",
+ "trusted_publishing_link_text": "poverljivo objavljivanje"
+ },
+ "keywords_title": "Ključne reči",
+ "compatibility": "Kompatibilnost",
+ "card": {
+ "publisher": "Izdavač",
+ "published": "Objavljen",
+ "weekly_downloads": "Nedeljna preuzimanja",
+ "keywords": "Ključne reči",
+ "license": "Licenca",
+ "select": "Izaberite paket",
+ "select_maximum": "Maksimalno {count} paketa može biti izabrano"
+ },
+ "versions": {
+ "title": "Verzije",
+ "collapse": "Skupite {tag}",
+ "expand": "Proširite {tag}",
+ "collapse_other": "Skupite ostale verzije",
+ "expand_other": "Proširite ostale verzije",
+ "collapse_major": "Skupite glavnu verziju {major}",
+ "expand_major": "Proširite glavnu verziju {major}",
+ "other_versions": "Ostale verzije",
+ "more_tagged": "još {count} sa oznakom",
+ "all_covered": "Sve verzije su pokrivene gornjim oznakama",
+ "deprecated_title": "{version} (zastarelo)",
+ "view_all": "Pogledajte {count} verziju | Pogledajte {count} verzije | Pogledajte svih {count} verzija",
+ "view_all_versions": "Pogledajte sve verzije",
+ "distribution_title": "Semver grupa",
+ "distribution_modal_title": "Verzije",
+ "distribution_range_date_same_year": "od {from} do {to}, {endYear}",
+ "distribution_range_date_multiple_years": "od {from}, {startYear} do {to}, {endYear}",
+ "grouping_major": "Glavni",
+ "grouping_minor": "Sporedni",
+ "grouping_versions_title": "Verzije",
+ "grouping_versions_about": "O grupisanju verzija",
+ "grouping_versions_all": "Sve",
+ "grouping_versions_only_recent": "Samo nedavne",
+ "grouping_usage_title": "Korišćenje",
+ "grouping_usage_about": "O grupisanju po korišćenju",
+ "grouping_usage_all": "Sve",
+ "grouping_usage_most_used": "Najčešće korišćeno",
+ "recent_versions_only_tooltip": "Prikažite samo verzije objavljene u poslednjih godinu dana.",
+ "show_low_usage_tooltip": "Uključite grupe verzija sa manje od 1% ukupnih preuzimanja.",
+ "y_axis_label": "Preuzimanja",
+ "filter_placeholder": "Filtrirajte po semver-u (npr. ^3.0.0)",
+ "filter_invalid": "Neispravan semver opseg",
+ "filter_help": "Pomoć za filtriranje semver opsega",
+ "filter_tooltip": "Filtrirajte verzije koristeći {link}. Na primer, ^3.0.0 prikazuje sve 3.x verzije.",
+ "filter_tooltip_link": "semver opseg",
+ "no_matches": "Nijedna verzija ne odgovara ovom opsegu",
+ "copy_alt": {
+ "per_version_analysis": "Verzija {version} je preuzeta {downloads} puta",
+ "general_description": "Stubni grafikon koji prikazuje broj preuzimanja po verziji za {versions_count} {semver_grouping_mode} verzija paketa {package_name}, {date_range_label} od verzije {first_version} do verzije {last_version}. Najviše preuzimana verzija je {max_downloaded_version} sa {max_version_downloads} preuzimanja. {per_version_analysis}. {watermark}."
+ },
+ "page_title": "Istorija verzija",
+ "current_tags": "Trenutne oznake",
+ "version_filter_placeholder": "Filtrirajte verzije…",
+ "version_filter_label": "Filtrirajte verzije",
+ "no_match_filter": "Nijedna verzija ne odgovara filteru {filter}"
+ },
+ "dependencies": {
+ "title": "Zavisnost ({count}) | Zavisnosti ({count})",
+ "list_label": "Zavisnosti paketa",
+ "show_all": "prikažite {count} zavisnost | prikažite {count} zavisnosti | prikažite svih {count} zavisnosti",
+ "optional": "opciono",
+ "view_vulnerabilities": "Pogledajte ranljivosti",
+ "outdated_major": "{count} glavna verzija kasni (najnovija: {latest}) | {count} glavne verzije kasne (najnovija: {latest}) | {count} glavnih verzija kasni (najnovija: {latest})",
+ "outdated_minor": "{count} sporedna verzija kasni (najnovija: {latest}) | {count} sporedne verzije kasne (najnovija: {latest}) | {count} sporednih verzija kasni (najnovija: {latest})",
+ "outdated_patch": "Dostupno je ažuriranje zakrpe (najnovija: {latest})",
+ "has_replacement": "Ova zavisnost ima predložene zamene",
+ "vulnerabilities_count": "{count} ranjivost | {count} ranjivosti | {count} ranjivosti"
+ },
+ "peer_dependencies": {
+ "title": "Peer zavisnost ({count}) | Peer zavisnosti ({count})",
+ "list_label": "Peer zavisnosti",
+ "show_all": "prikažite {count} peer zavisnost | prikažite {count} peer zavisnosti | prikažite svih {count} peer zavisnosti"
+ },
+ "optional_dependencies": {
+ "title": "Opciona zavisnost ({count}) | Opcione zavisnosti ({count})",
+ "list_label": "Opcione zavisnosti paketa",
+ "show_all": "prikažite {count} opcionu zavisnost | prikažite {count} opcione zavisnosti | prikažite svih {count} opcionih zavisnosti"
+ },
+ "maintainers": {
+ "title": "Održavaoci",
+ "list_label": "Održavaoci paketa",
+ "you": "(vi)",
+ "via": "preko {teams}",
+ "remove_owner": "Uklonite {name} kao vlasnika",
+ "username_to_add": "Korisničko ime za dodavanje kao vlasnika",
+ "username_placeholder": "korisničko ime...",
+ "add_button": "dodajte",
+ "cancel_add": "Otkažite dodavanje vlasnika",
+ "add_owner": "+ Dodajte vlasnika",
+ "show_more": "(prikažite još {count})",
+ "show_less": "(prikažite manje)",
+ "maintainer_template": "{avatar} {char126}{name}"
+ },
+ "trends": {
+ "chart_assistive_text": {
+ "keyboard_navigation_horizontal": "Koristite strelice levo i desno za kretanje kroz podatke.",
+ "keyboard_navigation_vertical": "Koristite strelice gore i dole za kretanje kroz podatke.",
+ "table_available": "Tabela podataka za ovaj grafikon je dostupna ispod.",
+ "table_caption": "Tabela podataka grafikona"
+ },
+ "granularity": "Granularnost",
+ "granularity_daily": "Dnevno",
+ "granularity_weekly": "Nedeljno",
+ "granularity_monthly": "Mesečno",
+ "granularity_yearly": "Godišnje",
+ "start_date": "Početak",
+ "end_date": "Kraj",
+ "loading": "Učitavanje...",
+ "date_range": "{start} do {end}",
+ "date_range_multiline": "{start}\ndo {end}",
+ "download_file": "Preuzmite {fileType}",
+ "toggle_annotator": "Uključite/isključite anotator",
+ "toggle_stack_mode": "Uključite/isključite slogovni način",
+ "open_options": "Otvorite opcije",
+ "close_options": "Zatvorite opcije",
+ "legend_estimation": "Procena",
+ "no_data": "Nema dostupnih podataka",
+ "y_axis_label": "{granularity} {facet}",
+ "facet": "Aspekt",
+ "title": "Trendovi",
+ "contributors_skip": "Nije prikazano u saradnicima (nema GitHub repozitorijuma):",
+ "items": {
+ "downloads": "Preuzimanja",
+ "likes": "Sviđanja",
+ "contributors": "Saradnici"
+ },
+ "data_correction": "Korekcija podataka",
+ "average_window": "Prozor proseka",
+ "smoothing": "Izglađivanje",
+ "prediction": "Predviđanje",
+ "known_anomalies": "Poznate anomalije",
+ "known_anomalies_description": "Interpolacija preko poznatih skokova u preuzimanjima uzrokovanih botovima ili CI problemima.",
+ "known_anomalies_ranges": "Opsezi anomalija",
+ "known_anomalies_range": "Od {start} do {end}",
+ "known_anomalies_range_named": "{packageName}: od {start} do {end}",
+ "known_anomalies_none": "Nema poznatih anomalija za ovaj paket. | Nema poznatih anomalija za ove pakete.",
+ "known_anomalies_contribute": "Doprinesite podacima o anomalijama",
+ "apply_correction": "Primenite ispravku",
+ "copy_alt": {
+ "trend_none": "uglavnom ravno",
+ "trend_strong": "jak",
+ "trend_weak": "slab",
+ "trend_undefined": "nedefinisano (nedovoljno podataka)",
+ "button_label": "Kopirajte alt tekst",
+ "watermark": "Pri dnu, vodeni žig kaže \"./npmx a fast, modern browser for the npm registry\"",
+ "analysis": "{package_name} počinje od {start_value} i završava na {end_value}, pokazujući {trend} trend sa nagibom od {downloads_slope} preuzimanja po vremenskom intervalu",
+ "estimation": "Konačna vrednost je procena zasnovana na delimičnim podacima za tekući period.",
+ "estimations": "Konačne vrednosti su procene zasnovane na delimičnim podacima za tekući period.",
+ "compare": "Uporedni linijski grafikon preuzimanja paketa za: {packages}.",
+ "single_package": "Linijski grafikon preuzimanja za paket {package}.",
+ "general_description": "Y osa predstavlja broj preuzimanja. X osa predstavlja opseg datuma, od {start_date} do {end_date}, sa vremenskim periodom {granularity}.{estimation_notice} {packages_analysis}. {watermark}.",
+ "facet_bar_general_description": "Horizontalni stubičasti grafikon za: {packages}, poređenje {facet} ({description}). {facet_analysis} {watermark}.",
+ "facet_bar_analysis": "{package_name} ima vrednost {value}."
+ }
+ },
+ "downloads": {
+ "title": "Nedeljna preuzimanja",
+ "community_distribution": "Pogledajte distribuciju prihvatanja u zajednici",
+ "subtitle": "Kroz sve verzije",
+ "sparkline_nav_hint": "Koristite ← →"
+ },
+ "install_scripts": {
+ "title": "Skripte za instalaciju",
+ "script_label": "(skripta)",
+ "npx_packages": "{count} npx paket | {count} npx paketa | {count} npx paketa",
+ "currently": "trenutno {version}"
+ },
+ "playgrounds": {
+ "title": "Isprobajte",
+ "choose": "izaberite igralište"
+ },
+ "metrics": {
+ "esm": "ES moduli podržani",
+ "cjs": "CommonJS podržan",
+ "no_esm": "ES moduli nisu podržani",
+ "wasm": "Ima WebAssembly",
+ "types_label": "Tipovi",
+ "types_included": "Uključeni tipovi",
+ "types_available": "Tipovi dostupni preko {package}",
+ "no_types": "Nema tipova"
+ },
+ "license": {
+ "view_spdx": "Pogledajte tekst licence na SPDX-u",
+ "none": "Nema"
+ },
+ "vulnerabilities": {
+ "tree_found": "{vulns} ranjivost u {packages}/{total} paketa | {vulns} ranjivosti u {packages}/{total} paketa | {vulns} ranjivosti u {packages}/{total} paketa",
+ "show_all_packages": "prikažite {count} pogođeni paket | prikažite svih {count} pogođenih paketa",
+ "path": "putanja",
+ "more": "+ {count} još",
+ "packages_failed": "{count} paket nije mogao biti proveren | {count} paketa nije moglo biti provereno",
+ "scan_failed": "Nije moguće skenirati ranjivosti",
+ "severity": {
+ "critical": "kritična",
+ "high": "visoka",
+ "moderate": "umerena",
+ "low": "niska"
+ },
+ "fixed_in_title": "Popravljeno u verziji {version}"
+ },
+ "deprecated": {
+ "label": "Zastarelo",
+ "tree_found": "{count} zastarela zavisnost | {count} zastarele zavisnosti | {count} zastarelih zavisnosti",
+ "show_all": "prikažite {count} zastareli paket | prikažite svih {count} zastarelih paketa"
+ },
+ "access": {
+ "title": "Pristup timu",
+ "refresh": "Osvežite pristup timu",
+ "list_label": "Lista pristupa timu",
+ "owner": "vlasnik",
+ "rw": "rw",
+ "ro": "ro",
+ "revoke_access": "Opozovite pristup za {name}",
+ "no_access": "Nije podešen pristup timu",
+ "select_team_label": "Izaberite tim",
+ "loading_teams": "Učitavanje timova...",
+ "select_team": "Izaberite tim",
+ "permission_label": "Nivo dozvole",
+ "permission": {
+ "read_only": "samo čitanje",
+ "read_write": "čitanje i pisanje"
+ },
+ "grant_button": "odobrite",
+ "cancel_grant": "Otkažite odobravanje pristupa",
+ "grant_access": "+ Odobrite pristup timu"
+ },
+ "list": {
+ "filter_label": "Filtrirajte pakete",
+ "filter_placeholder": "Filtrirajte pakete...",
+ "sort_label": "Sortirajte pakete",
+ "showing_count": "Prikazano {filtered} od {total} paketa"
+ },
+ "skeleton": {
+ "loading": "Učitavanje detalja paketa",
+ "maintainers": "Održavaoci",
+ "keywords": "Ključne reči",
+ "versions": "Verzije",
+ "dependencies": "Zavisnosti"
+ },
+ "sort": {
+ "downloads": "Najviše preuzimanja",
+ "published": "Najnovije objavljeni",
+ "name_asc": "Ime (A-Z)",
+ "name_desc": "Ime (Z-A)"
+ },
+ "size": {
+ "b": "{size} B",
+ "kb": "{size} kB",
+ "mb": "{size} MB"
+ },
+ "download": {
+ "button": "Preuzmite",
+ "tarball": "Preuzmite Tarball kao .tar.gz"
+ }
+ },
+ "connector": {
+ "modal": {
+ "title": "Lokalni konektor",
+ "connected": "Povezano",
+ "connected_as_user": "Povezano kao ~{user}",
+ "connected_hint": "Sada možete upravljati paketima i organizacijama putem veb interfejsa.",
+ "disconnect": "Prekinite vezu",
+ "run_hint": "Pokrenite konektor na svom računaru da biste omogućili administratorske funkcije.",
+ "copy_command": "Kopirajte komandu",
+ "copied": "Kopirano",
+ "paste_token": "Zatim nalepite token ispod za povezivanje:",
+ "token_label": "Token",
+ "token_placeholder": "nalepite token ovde...",
+ "advanced": "Napredne opcije",
+ "port_label": "Port",
+ "warning": "UPOZORENJE",
+ "warning_text": "Ovo dozvoljava npmx-u pristup vašem npm CLI-ju. Povezujte se samo sa sajtovima kojima verujete.",
+ "connect": "Povežite se",
+ "connecting": "Povezivanje...",
+ "auto_open_url": "Automatski otvorite stranicu za autentifikaciju"
+ }
+ },
+ "operations": {
+ "queue": {
+ "title": "Red operacija",
+ "clear_all": "obrišite sve",
+ "refresh": "Osvežite operacije",
+ "empty": "Nema operacija u redu",
+ "empty_hint": "Dodajte operacije sa stranica paketa ili organizacija",
+ "active_label": "Aktivne operacije",
+ "otp_required": "OTP potreban",
+ "otp_prompt": "Unesite OTP za nastavak",
+ "otp_placeholder": "Unesite OTP kod...",
+ "otp_label": "Jednokratna lozinka",
+ "retry_otp": "Ponovite sa OTP-om",
+ "retry_web_auth": "Ponovite sa veb autentifikacijom",
+ "retrying": "Ponavljanje...",
+ "open_web_auth": "Otvorite veb link za autentifikaciju",
+ "approve_operation": "Odobrite operaciju",
+ "remove_operation": "Uklonite operaciju",
+ "approve_all": "Odobrite sve",
+ "execute": "Izvršite",
+ "executing": "Izvršavanje...",
+ "log": "Dnevnik",
+ "log_label": "Dnevnik završenih operacija",
+ "remove_from_log": "Uklonite iz dnevnika"
+ }
+ },
+ "org": {
+ "teams": {
+ "title": "Timovi",
+ "refresh": "Osvežite timove",
+ "filter_label": "Filtrirajte timove",
+ "filter_placeholder": "Filtrirajte timove...",
+ "sort_by": "Sortirajte po",
+ "loading": "Učitavanje timova...",
+ "no_teams": "Nije pronađen nijedan tim",
+ "list_label": "Timovi organizacije",
+ "delete_team": "Obrišite tim {name}",
+ "member_count": "{count} član | {count} člana | {count} članova",
+ "members_of": "Članovi tima {team}",
+ "no_members": "Nema članova",
+ "remove_user": "Uklonite {user} iz tima",
+ "username_to_add": "Korisničko ime za dodavanje u {team}",
+ "username_placeholder": "korisničko ime...",
+ "add_button": "dodajte",
+ "cancel_add_user": "Otkažite dodavanje korisnika",
+ "add_member": "+ Dodajte člana",
+ "team_name_label": "Ime tima",
+ "team_name_placeholder": "ime-tima...",
+ "create_button": "napravite",
+ "no_match": "Nijedan tim ne odgovara \"{query}\"",
+ "cancel_create": "Otkažite kreiranje tima",
+ "create_team": "+ Kreirajte tim"
+ },
+ "members": {
+ "title": "Članovi",
+ "refresh": "Osvežite članove",
+ "filter_label": "Filtrirajte članove",
+ "filter_placeholder": "Filtrirajte članove...",
+ "filter_by_role": "Filtrirajte po ulozi",
+ "filter_by_team": "Filtrirajte po timu",
+ "all_teams": "svi timovi",
+ "sort_by": "Sortirajte po",
+ "loading": "Učitavanje članova...",
+ "no_members": "Nema pronađenih članova",
+ "list_label": "Članovi organizacije",
+ "change_role_for": "Promenite ulogu za {name}",
+ "remove_from_org": "Uklonite {name} iz organizacije",
+ "view_team": "Pogledajte tim {team}",
+ "no_match": "Nijedan član ne odgovara vašim filterima",
+ "username_label": "Korisničko ime",
+ "username_placeholder": "korisničko ime...",
+ "role_label": "Uloga",
+ "role": {
+ "all": "sve",
+ "developer": "developer",
+ "admin": "admin",
+ "owner": "vlasnik"
+ },
+ "team_label": "Tim",
+ "no_team": "bez tima",
+ "add_button": "dodajte",
+ "cancel_add": "Otkažite dodavanje člana",
+ "add_member": "+ Dodajte člana"
+ },
+ "public_packages": "{count} javni paket | {count} javna paketa | {count} javnih paketa",
+ "page": {
+ "packages_title": "Paketi",
+ "members_tab": "Članovi",
+ "teams_tab": "Timovi",
+ "no_packages": "Nema javnih paketa za",
+ "no_packages_hint": "Ova organizacija možda ne postoji ili nema javne pakete.",
+ "failed_to_load": "Neuspešno učitavanje paketa organizacije",
+ "no_match": "Nijedan paket ne odgovara \"{query}\"",
+ "not_found": "Organizacija nije pronađena",
+ "not_found_message": "Organizacija \"{'@'}{name}\" ne postoji na npm-u"
+ }
+ },
+ "user": {
+ "combobox": {
+ "add_to_org_hint": "(takođe će dodati u organizaciju)",
+ "press_enter_to_add": "Pritisnite Enter za dodavanje {'@'}{username}",
+ "default_placeholder": "korisničko ime...",
+ "suggestions_label": "Predlozi korisnika"
+ },
+ "page": {
+ "packages_title": "Paketi",
+ "no_packages": "Nema javnih paketa za",
+ "no_packages_hint": "Ovaj korisnik možda ne postoji ili nema javne pakete.",
+ "failed_to_load": "Neuspešno učitavanje korisničkih paketa",
+ "no_match": "Nijedan paket ne odgovara \"{query}\"",
+ "filter_placeholder": "Filtrirajte {count} paket... | Filtrirajte {count} paketa... | Filtrirajte {count} paketa..."
+ },
+ "orgs_page": {
+ "title": "Organizacije",
+ "back_to_profile": "Nazad na profil",
+ "connect_required": "Povežite lokalni CLI da biste videli svoje organizacije.",
+ "connect_hint_prefix": "Pokrenite",
+ "connect_hint_suffix": "da biste počeli.",
+ "own_orgs_only": "Možete videti samo svoje organizacije.",
+ "view_your_orgs": "Pogledajte svoje organizacije",
+ "loading": "Učitavanje organizacija...",
+ "empty": "Nema pronađenih organizacija.",
+ "empty_hint": "Organizacije se otkrivaju iz vaših scoped paketa.",
+ "count": "{count} organizacija | {count} organizacije | {count} organizacija",
+ "packages_count": "{count} paket | {count} paketa | {count} paketa"
+ }
+ },
+ "claim": {
+ "modal": {
+ "title": "Zauzmite ime paketa",
+ "success": "Paket je zauzet!",
+ "success_detail": "{name}{'@'}0.0.0 je objavljen na npm-u.",
+ "success_hint": "Sada možete objavljivati nove verzije ovog paketa pomoću npm publish.",
+ "view_package": "Pogledajte paket",
+ "invalid_name": "Neispravno ime paketa:",
+ "available": "Ovo ime je dostupno!",
+ "taken": "Ovo ime je već zauzeto.",
+ "missing_permission": "Nemate dozvolu da dodate paket u scope {'@'}{scope}.",
+ "similar_warning": "Postoje slični paketi - npm može odbiti ovo ime:",
+ "related": "Povezani paketi:",
+ "scope_warning_title": "Razmislite o korišćenju scoped paketa",
+ "scope_warning_text": "Nazivi paketa bez scope-a su zajednički resurs. Zauzmite ime samo ako zaista nameravate da objavite i održavate paket. Za lične ili organizacione projekte, koristite scoped naziv, na primer {'@'}{username}/{name}.",
+ "connect_required": "Povežite se sa lokalnim konektorom da biste zauzeli ovo ime paketa.",
+ "connect_button": "Povežite se na konektor",
+ "publish_hint": "Ovo će objaviti minimalni paket za rezervaciju mesta.",
+ "preview_json": "Pregledajte package.json",
+ "claim_button": "Zauzmite ime paketa",
+ "publishing": "Objavljivanje...",
+ "checking": "Provera dostupnosti...",
+ "failed_to_check": "Neuspešna provera dostupnosti imena",
+ "failed_to_claim": "Neuspešno zauzimanje paketa"
+ }
+ },
+ "code": {
+ "files_label": "Datoteke",
+ "no_files": "Nema datoteka u ovom direktorijumu",
+ "lines": "{count} linija | {count} linije | {count} linija",
+ "toggle_tree": "Uključite/isključite stablo datoteka",
+ "close_tree": "Zatvorite stablo datoteka",
+ "copy_link": "Kopirajte link",
+ "view_raw": "Pogledajte izvornu datoteku",
+ "file_too_large": "Datoteka je prevelika za pregled",
+ "file_size_warning": "{size} premašuje ograničenje od 500KB za isticanje sintakse",
+ "failed_to_load": "Neuspešno učitavanje",
+ "unavailable_hint": "Datoteka je možda prevelika ili nedostupna",
+ "version_required": "Verzija je potrebna za pregled koda",
+ "go_to_package": "Idite na paket",
+ "loading_tree": "Učitavanje stabla datoteka...",
+ "failed_to_load_tree": "Neuspešno učitavanje datoteka za ovu verziju paketa",
+ "back_to_package": "Nazad na paket",
+ "table": {
+ "name": "Ime",
+ "size": "Veličina"
+ },
+ "markdown_view_mode": {
+ "preview": "pregled",
+ "code": "kod"
+ },
+ "file_path": "Putanja datoteke",
+ "binary_file": "Binarna datoteka",
+ "binary_rendering_warning": "Tip datoteke \"{contentType}\" nije podržan za pregled."
+ },
+ "badges": {
+ "provenance": {
+ "verified": "verifikovano",
+ "verified_title": "Verifikovano poreklo",
+ "verified_via": "Verifikovano: objavljeno preko {provider}"
+ },
+ "jsr": {
+ "title": "takođe dostupno na JSR-u"
+ }
+ },
+ "filters": {
+ "title": "Filteri",
+ "search": "Pretraga",
+ "search_scope": "Opseg pretrage",
+ "search_placeholder_name": "Filtrirajte po imenu paketa...",
+ "search_placeholder_description": "Filtrirajte po opisu...",
+ "search_placeholder_keywords": "Filtrirajte po ključnim rečima...",
+ "search_placeholder_all": "Pretražite sve ili koristite name: desc: kw:",
+ "scope_name": "Ime",
+ "scope_name_description": "Pretražuje samo imena paketa",
+ "scope_description": "Opis",
+ "scope_description_description": "Pretražuje samo opise",
+ "scope_keywords": "Ključne reči",
+ "scope_keywords_description": "Pretražuje samo ključne reči",
+ "scope_all": "Sve",
+ "scope_all_description": "Pretražuje sva polja, podržava operatore name: desc: kw:",
+ "weekly_downloads": "Nedeljna preuzimanja",
+ "updated_within": "Ažurirano u poslednjih",
+ "security": "Bezbednost",
+ "keywords": "Ključne reči",
+ "more_keywords": "+{count} još",
+ "clear_all": "Obrišite sve",
+ "remove_filter": "Uklonite filter {label}",
+ "chips": {
+ "search": "Pretraga",
+ "downloads": "Preuzimanja",
+ "keyword": "Ključna reč",
+ "security": "Bezbednost",
+ "updated": "Ažurirano"
+ },
+ "download_range": {
+ "any": "Bilo koje",
+ "lt100": "< 100",
+ "100_1k": "100 - 1K",
+ "1k_10k": "1K - 10K",
+ "10k_100k": "10K - 100K",
+ "gt100k": "> 100K"
+ },
+ "updated": {
+ "any": "Bilo kada",
+ "week": "Prošle nedelje",
+ "month": "Prošlog meseca",
+ "quarter": "Poslednja 3 meseca",
+ "year": "Prošle godine"
+ },
+ "security_options": {
+ "all": "Svi paketi",
+ "secure": "Bez upozorenja",
+ "insecure": "Sa upozorenjima"
+ },
+ "view_selected": "Pogledajte izabrano",
+ "clear_selected_label": "Obrišite izabrano",
+ "sort": {
+ "label": "Sortirajte pakete",
+ "toggle_direction": "Promenite smer sortiranja",
+ "ascending": "Rastuće",
+ "descending": "Opadajuće",
+ "relevance": "Relevantnost",
+ "downloads_week": "Preuzimanja/ned",
+ "downloads_day": "Preuzimanja/dan",
+ "downloads_month": "Preuzimanja/mes",
+ "downloads_year": "Preuzimanja/god",
+ "published": "Poslednje objavljivanje",
+ "name": "Ime"
+ },
+ "columns": {
+ "title": "Kolone",
+ "show": "Prikažite kolone",
+ "reset": "Vratite na podrazumevano",
+ "coming_soon": "Uskoro",
+ "name": "Ime",
+ "version": "Verzija",
+ "description": "Opis",
+ "downloads": "Preuzimanja/nedeljno",
+ "published": "Poslednje objavljeno",
+ "maintainers": "Održavaoci",
+ "keywords": "Ključne reči",
+ "security": "Bezbednost",
+ "selection": "Izaberite paket"
+ },
+ "view_mode": {
+ "label": "Režim prikaza",
+ "cards": "Kartice",
+ "table": "Tabela"
+ },
+ "pagination": {
+ "mode_label": "Režim paginacije",
+ "infinite": "Beskonačno",
+ "paginated": "Sa stranicama",
+ "items_per_page": "Stavki po stranici",
+ "per_page": "{count} / stranici",
+ "showing": "{range} od {total}",
+ "previous": "Prethodna stranica",
+ "next": "Sledeća stranica",
+ "nav_label": "Paginacija"
+ },
+ "count": {
+ "showing_filtered": "{filtered} od {count} paketa",
+ "showing_all": "{count} paket | {count} paketa",
+ "showing_paginated": "{pageSize} od {count} paketa"
+ },
+ "table": {
+ "security_warning": "Bezbednosno upozorenje",
+ "secure": "Bezbedno",
+ "no_packages": "Nema pronađenih paketa"
+ }
+ },
+ "about": {
+ "title": "O nama",
+ "heading": "o nama",
+ "meta_description": "npmx je brz, moderan pretraživač za npm registar. Odlično korisničko i programersko iskustvo za istraživanje npm paketa.",
+ "what_we_are": {
+ "title": "Šta smo",
+ "better_ux_dx": "odlično korisničko/programersko iskustvo",
+ "admin_ui": "admin interfejs",
+ "description": "npmx je {betterUxDx} za npm registar paketa i alat. Težimo da pružimo brz, moderan interfejs za istraživanje paketa, sa funkcijama poput tamnog režima, navigacije tastaturom, pregledom koda i vezama ka alternativnim registrima poput {jsr}.",
+ "admin_description": "Takođe ciljamo da pružimo odličan {adminUi} za upravljanje vašim paketima, timovima i organizacijama — sve iz pretraživača, pokretano vašim lokalnim npm CLI-jem."
+ },
+ "what_we_are_not": {
+ "title": "Šta nismo",
+ "not_package_manager": "Nismo upravljač paketima.",
+ "not_registry": "Nismo registar.",
+ "registry_description": "Ne hostujemo pakete. Samo smo brzi, moderni način za njihovo pregledanje.",
+ "package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.",
+ "words": {
+ "already": "Već postoje",
+ "people": "već",
+ "building": "ljudi",
+ "really": "grade",
+ "cool": "stvarno",
+ "package": "cool",
+ "managers": "package managers"
+ }
+ },
+ "sponsors": {
+ "title": "Sponzori"
+ },
+ "oss_partners": {
+ "title": "OSS partneri"
+ },
+ "team": {
+ "title": "Tim",
+ "governance": "Upravljanje",
+ "role_steward": "steward",
+ "role_maintainer": "održavalac",
+ "sponsor": "sponzor",
+ "sponsor_aria": "Sponzorišite {name} na GitHub-u"
+ },
+ "contributors": {
+ "title": "... i još {count} saradnik | ... i još {count} saradnika | ... i još {count} saradnika",
+ "description": "npmx je potpuno otvorenog koda, izgrađen od strane neverovatne zajednice saradnika. Pridružite nam se i zajedno izgradimo iskustvo pregledanja npm-a koje smo oduvek želeli.",
+ "loading": "Učitavanje saradnika...",
+ "error": "Neuspešno učitavanje saradnika",
+ "view_profile": "Pogledajte GitHub profil {name}"
+ },
+ "get_involved": {
+ "title": "Uključite se",
+ "contribute": {
+ "title": "Doprinesite",
+ "description": "Pomozite nam da izgradimo npm iskustvo koje svi želimo.",
+ "cta": "Pogledajte na GitHub-u"
+ },
+ "community": {
+ "title": "Pridružite se zajednici",
+ "description": "Ćaskajte, postavljajte pitanja i delite ideje.",
+ "cta": "Pridružite se Discord-u"
+ },
+ "builders": {
+ "title": "Pomozite u izgradnji npmx-a",
+ "description": "Pridružite se graditeljima koji oblikuju budućnost npmx-a.",
+ "cta": "Pridružite se Builders Discord-u"
+ },
+ "follow": {
+ "title": "Ostanite u toku",
+ "description": "Saznajte najnovije o npmx-u.",
+ "cta": "Zapratite na Bluesky-u"
+ }
+ }
+ },
+ "account_menu": {
+ "connect": "povežite se",
+ "account": "Nalog",
+ "npm_cli": "npm CLI",
+ "atmosphere": "Atmosfera",
+ "npm_cli_desc": "Upravljajte paketima i organizacijama",
+ "atmosphere_desc": "Društvene funkcije i identitet",
+ "connect_npm_cli": "Povežite se na npm CLI",
+ "connect_atmosphere": "Povežite se na Atmosferu",
+ "connecting": "Povezivanje...",
+ "ops": "{count} op | {count} ops"
+ },
+ "auth": {
+ "modal": {
+ "title": "Atmosfera",
+ "connected_as": "Povezani ste kao {'@'}{handle}",
+ "disconnect": "Prekinite vezu",
+ "connect_prompt": "Povežite se sa svojim nalogom na Atmosferi",
+ "handle_label": "Korisničko ime",
+ "handle_placeholder": "alice.npmx.social",
+ "connect": "Povežite se",
+ "create_account": "Napravite novi nalog",
+ "connect_bluesky": "Povežite se preko Bluesky-a",
+ "what_is_atmosphere": "Šta je Atmosphere nalog?",
+ "atmosphere_explanation": "{npmx} koristi {atproto} za pokretanje mnogih svojih društvenih funkcija, omogućavajući korisnicima da poseduju svoje podatke i koriste jedan nalog za sve kompatibilne aplikacije. Kada napravite nalog, možete ga koristiti sa drugim aplikacijama poput {bluesky} i {tangled}.",
+ "default_input_error": "Unesite važeće korisničko ime, DID ili puni PDS URL",
+ "profile": "Profil"
+ }
+ },
+ "header": {
+ "home": "npmx početna",
+ "packages": "paketi",
+ "packages_dropdown": {
+ "title": "Vaši paketi",
+ "loading": "Učitavanje...",
+ "error": "Neuspešno učitavanje paketa",
+ "empty": "Nema pronađenih paketa",
+ "view_all": "Pogledajte sve"
+ },
+ "orgs": "organizacije",
+ "orgs_dropdown": {
+ "title": "Vaše organizacije",
+ "loading": "Učitavanje...",
+ "error": "Neuspešno učitavanje organizacija",
+ "empty": "Nema pronađenih organizacija",
+ "view_all": "Pogledajte sve"
+ },
+ "pr": "Otvorite GitHub pull request #{prNumber}"
+ },
+ "compare": {
+ "packages": {
+ "title": "uporedite pakete",
+ "tagline": "uporedite npm pakete jedan pored drugog da bi vam pomoglo da izaberete pravi.",
+ "meta_title": "Uporedite {packages} - npmx",
+ "meta_title_empty": "Uporedite pakete - npmx",
+ "meta_description": "Uporedni prikaz paketa {packages}",
+ "meta_description_empty": "Uporedite npm pakete jedan pored drugog",
+ "section_packages": "Paketi",
+ "section_facets": "Aspekti",
+ "section_comparison": "Poređenje",
+ "copy_as_markdown": "Kopirajte tabelu",
+ "loading": "Učitavanje podataka o paketu...",
+ "error": "Neuspešno učitavanje podataka o paketu. Pokušajte ponovo.",
+ "empty_title": "Izaberite pakete za poređenje",
+ "empty_description": "Pretražite i dodajte najmanje 2 paketa iznad da biste videli uporedni prikaz njihovih metrika.",
+ "table_view": "Tabela",
+ "charts_view": "Grafikoni",
+ "bar_chart_nav_hint": "Koristite ↑ ↓",
+ "line_chart_nav_hint": "Koristite ← →"
+ },
+ "selector": {
+ "search_label": "Pretražite pakete",
+ "search_first": "Pretražite paket...",
+ "search_add": "Dodajte još jedan paket...",
+ "searching": "Pretraživanje...",
+ "remove_package": "Uklonite {package}",
+ "packages_selected": "{count}/{max} paketa izabrano.",
+ "add_hint": "Dodajte najmanje 2 paketa za poređenje."
+ },
+ "no_dependency": {
+ "label": "(Bez zavisnosti)",
+ "typeahead_title": "Šta bi James uradio?",
+ "typeahead_description": "Uporedite sa nekorišćenjem zavisnosti! e18e odobreno.",
+ "tooltip_title": "Možda vam zavisnost ne treba",
+ "tooltip_description": "Uporedite sa nekorišćenjem zavisnosti! {link} održava listu paketa koji se mogu zameniti izvornim API-jima ili jednostavnijim alternativama.",
+ "e18e_community": "e18e zajednica",
+ "add_column": "Dodajte kolonu \"bez zavisnosti\" u poređenje"
+ },
+ "facets": {
+ "all": "sve",
+ "none": "ništa",
+ "select_all_category_facets": "Izaberite sve aspekte kategorije {category}",
+ "deselect_all_category_facets": "Poništite izbor svih aspekata kategorije {category}",
+ "selected_all_category_facets": "Izabrani svi aspekti kategorije {category}",
+ "deselected_all_category_facets": "Poništen izbor svih aspekata kategorije {category}",
+ "coming_soon": "Uskoro",
+ "select_all": "Izaberite sve aspekte",
+ "deselect_all": "Poništite izbor svih aspekata",
+ "binary_only_tooltip": "Ovaj paket izlaže binarne datoteke i nema izvoze",
+ "categories": {
+ "performance": "Performanse",
+ "health": "Zdravlje",
+ "compatibility": "Kompatibilnost",
+ "security": "Bezbednost i usaglašenost"
+ },
+ "items": {
+ "packageSize": {
+ "label": "Veličina paketa",
+ "description": "Veličina samog paketa (raspakovano)"
+ },
+ "installSize": {
+ "label": "Veličina instalacije",
+ "description": "Ukupna veličina instalacije uključujući sve zavisnosti"
+ },
+ "dependencies": {
+ "label": "Direktne zavisnosti",
+ "description": "Broj direktnih zavisnosti"
+ },
+ "totalDependencies": {
+ "label": "Ukupno zavisnosti",
+ "description": "Ukupan broj zavisnosti uključujući prenosive"
+ },
+ "downloads": {
+ "label": "Preuzimanja/nedeljno",
+ "description": "Nedeljni broj preuzimanja"
+ },
+ "totalLikes": {
+ "label": "Sviđanja",
+ "description": "Broj sviđanja"
+ },
+ "lastUpdated": {
+ "label": "Objavljen",
+ "description": "Kada je ova verzija objavljena"
+ },
+ "deprecated": {
+ "label": "Zastareo?",
+ "description": "Da li je paket zastareo"
+ },
+ "engines": {
+ "label": "Okruženja",
+ "description": "Zahtevi za verziju Node.js-a"
+ },
+ "types": {
+ "label": "Tipovi",
+ "description": "TypeScript definicije tipova"
+ },
+ "moduleFormat": {
+ "label": "Format modula",
+ "description": "ESM/CJS podrška"
+ },
+ "license": {
+ "label": "Licenca",
+ "description": "Licenca paketa"
+ },
+ "vulnerabilities": {
+ "label": "Ranjivosti",
+ "description": "Poznate bezbednosne ranjivosti"
+ }
+ },
+ "values": {
+ "any": "Bilo koje",
+ "none": "Nema",
+ "unknown": "Nepoznato",
+ "deprecated": "Zastarelo",
+ "not_deprecated": "Ne",
+ "types_included": "Uključeni",
+ "types_none": "Nema",
+ "vulnerabilities_summary": "{count} ({critical}C/{high}H)",
+ "up_to_you": "Na vama je!"
+ },
+ "trends": {
+ "title": "Uporedite trendove"
+ }
+ },
+ "file_changes": "Izmene datoteka",
+ "files_count": "{count} datoteka | {count} datoteke | {count} datoteka",
+ "lines_hidden": "{count} linija sakrivena | {count} linije sakrivene | {count} linija sakriveno",
+ "file_too_large": "Datoteka je prevelika za poređenje",
+ "file_size_warning": "{size} premašuje ograničenje od 250KB za poređenje",
+ "compare_versions": "razlika",
+ "compare_versions_title": "Uporedite sa najnovijom verzijom",
+ "comparing_versions_label": "Poređenje verzija...",
+ "version_back_to_package": "Nazad na paket",
+ "version_error_message": "Neuspelo poređenje verzija.",
+ "version_invalid_url_format": {
+ "hint": "Neispravan URL za poređenje. Koristite format: {0}",
+ "from_version": "od",
+ "to_version": "do"
+ },
+ "version_selector_title": "Uporedite sa verzijom",
+ "summary": "Sažetak",
+ "deps_count": "{count} zavisnost | {count} zavisnosti | {count} zavisnosti",
+ "dependencies": "Zavisnosti",
+ "dev_dependencies": "Razvojne zavisnosti",
+ "peer_dependencies": "Peer zavisnosti",
+ "optional_dependencies": "Opcione zavisnosti",
+ "no_dependency_changes": "Nema promena u zavisnostima",
+ "file_filter_option": {
+ "all": "Sve ({count})",
+ "added": "Dodato ({count})",
+ "removed": "Uklonjeno ({count})",
+ "modified": "Izmenjeno ({count})"
+ },
+ "search_files_placeholder": "Pretražite datoteke...",
+ "no_files_all": "Nema datoteka",
+ "no_files_search": "Nema datoteka koje odgovaraju \"{query}\"",
+ "no_files_filtered": "Nema {filter} datoteka",
+ "filter": {
+ "added": "dodato",
+ "removed": "uklonjeno",
+ "modified": "izmenjeno"
+ },
+ "files_button": "Datoteke",
+ "select_file_prompt": "Izaberite datoteku sa bočne trake da biste videli njene razlike",
+ "close_files_panel": "Zatvorite panel sa datotekama",
+ "filter_files_label": "Filtrirajte datoteke po tipu izmene",
+ "change_ratio": "Odnos promene",
+ "char_edits": "Izmene znakova",
+ "diff_distance": "Udaljenost razlike",
+ "loading_diff": "Učitavanje razlike...",
+ "loading_diff_error": "Neuspešno učitavanje razlike",
+ "merge_modified_lines": "Spojite izmenjene linije",
+ "no_content_changes": "Nema otkrivenih promena u sadržaju",
+ "options": "Opcije",
+ "view_file": "Pogledajte datoteku",
+ "view_in_code_browser": "Pogledajte u pregledaču koda",
+ "word_wrap": "Prelamanje reči"
+ },
+ "pds": {
+ "title": "npmx.social",
+ "meta_description": "Zvanični AT Protocol Personal Data Server (PDS) za npmx zajednicu.",
+ "join": {
+ "title": "Pridružite se zajednici",
+ "description": "Bilo da kreirate svoj prvi nalog na atmosferi ili migrirate postojeći, pripadate ovde. Možete migrirati svoj trenutni nalog bez gubitka korisničkog imena, objava ili pratilaca.",
+ "migrate": "Migrirajte sa PDS MOOver-om"
+ },
+ "server": {
+ "title": "Detalji servera",
+ "location_label": "Lokacija:",
+ "location_value": "Nuremberg, Nemačka",
+ "infrastructure_label": "Infrastruktura:",
+ "infrastructure_value": "Hostovan na Hetzner-u",
+ "privacy_label": "Privatnost:",
+ "privacy_value": "Podleže strogim zakonima EU o zaštiti podataka",
+ "learn_more": "Saznajte kako npmx koristi Atmosferu"
+ },
+ "community": {
+ "title": "Ko je ovde",
+ "description": "Neki od {count} naloga koji već zovu npmx.social domom:",
+ "loading": "Učitavanje PDS zajednice...",
+ "error": "Neuspešno učitavanje PDS zajednice.",
+ "empty": "Nema prikazanih članova zajednice.",
+ "view_profile": "Pogledajte profil {handle}",
+ "new_accounts": "...plus još {count} koji su novi na atmosferi"
+ }
+ },
+ "privacy_policy": {
+ "title": "politika privatnosti",
+ "last_updated": "Poslednje ažuriranje: {date}",
+ "welcome": "Dobrodošli na {app}. Posvećeni smo zaštiti vaše privatnosti. Ova politika objašnjava koje podatke prikupljamo, kako ih koristimo i vaša prava u vezi sa vašim informacijama.",
+ "cookies": {
+ "what_are": {
+ "title": "Šta su kolačići?",
+ "p1": "Kolačići su male tekstualne datoteke koje se čuvaju na vašem uređaju kada posetite veb sajt. Njihova svrha je da poboljšaju vaše iskustvo pretraživanja pamćenjem određenih preferenci i podešavanja."
+ },
+ "types": {
+ "title": "Koje kolačiće koristimo?",
+ "p1": "Koristimo {bold} isključivo u svrhe koje su neophodne za funkcionalnost sajta. Ne koristimo kolačiće trećih strana ili reklamne kolačiće.",
+ "bold": "esencijalne tehničke kolačiće",
+ "li1": "{li11}{separator} {li12}",
+ "li2": "{li21}{separator} {li22}",
+ "separator": ":",
+ "cookie_vdpl": "__vdpl",
+ "cookie_vdpl_desc": "Ovaj kolačić koristi naš hosting provajder (Vercel) radi zaštite od neslaganja između verzija. Osigurava da preuzimate resurse iz ispravne verzije deploy-a ako se tokom pregledanja objavi novo ažuriranje. Ne koristi se za vaše praćenje.",
+ "cookie_h3": "h3",
+ "cookie_h3_desc": "Ovo je naš bezbednosni sesijski kolačić. Čuva OAuth pristupni token kada povežete svoj nalog na Atmosferi. Neophodan je za održavanje vaše autentifikovane sesije."
+ },
+ "local_storage": {
+ "title": "Lokalno skladište",
+ "p1": "Pored kolačića sesije, koristimo {bold} vašeg pregledača kako bismo sačuvali vaša podešavanja prikaza. To nam omogućava da zapamtimo temu (svetlo/tamno) i neka druga {settings} koja ste izabrali, tako da ne morate da ih ponovo podešavate pri svakoj poseti.",
+ "bold": "Lokalno skladište",
+ "p2": "Ova informacija je isključivo funkcionalna, čuva se samo na vašem uređaju i {bold2}. Koristimo je isključivo da poboljšamo vaše iskustvo na našem veb sajtu.",
+ "bold2": "ne sadrži lične podatke niti se koristi za praćenje",
+ "settings": "podešavanja"
+ },
+ "management": {
+ "title": "Upravljanje kolačićima",
+ "p1": "Možete podesiti svoj pretraživač da prihvati, odbije ili obriše kolačiće prema vašim željama. Međutim, imajte na umu da {bold}.",
+ "bold": "odbijanje esencijalnih kolačića može sprečiti potpuni pristup aplikaciji",
+ "p2": "Ispod su linkovi sa uputstvima za upravljanje kolačićima u najčešće korišćenim pretraživačima:",
+ "chrome": "Google Chrome (otvara se u novom prozoru)",
+ "firefox": "Mozilla Firefox (otvara se u novom prozoru)",
+ "edge": "Microsoft Edge (otvara se u novom prozoru)"
+ }
+ },
+ "analytics": {
+ "title": "Analitika",
+ "p1": "Koristimo {bold} da bismo razumeli kako posetioci koriste naš veb sajt. To nam pomaže da poboljšamo korisničko iskustvo i identifikujemo probleme.",
+ "bold": "Vercel Web Analytics",
+ "p2": "Vercel Analytics je dizajniran sa privatnošću na umu:",
+ "li1": "Ne koristi kolačiće",
+ "li2": "Ne prikuplja lične identifikatore",
+ "li3": "Ne prati korisnike na različitim veb sajtovima",
+ "li4": "Svi podaci su agregirani i anonimizovani",
+ "p3": "Jedine informacije koje se prikupljaju uključuju: URL-ove stranica, referer, zemlju/region, vrstu uređaja, pregledač i operativni sistem. Ovi podaci se ne mogu koristiti za identifikaciju pojedinačnih korisnika."
+ },
+ "authenticated": {
+ "title": "Autentifikovani korisnici",
+ "p1": "Kada povežete svoj {bold} nalog sa npmx-om, čuvamo vaš OAuth pristupni token u bezbednom, HTTP-only kolačiću sesije. Ovaj token se koristi isključivo za autentifikaciju zahteva u vaše ime.",
+ "bold": "Atmosfera",
+ "p2": "Ne čuvamo vaše akreditive i ne pristupamo nijednim podacima izvan onoga što je neophodno za pružanje funkcija koje koristite. Možete prekinuti vezu sa svojim nalogom u bilo kom trenutku sa stranice {settings}.",
+ "settings": "podešavanja"
+ },
+ "data_retention": {
+ "title": "Čuvanje podataka",
+ "p1": "Kolačići sesije se automatski brišu kada zatvorite pregledač ili nakon perioda neaktivnosti. Podešavanja u lokalnom skladištu ostaju na vašem uređaju dok ne obrišete podatke pregledača. Analitički podaci se čuvaju u agregiranom obliku i ne mogu se povezati sa pojedinačnim korisnicima."
+ },
+ "your_rights": {
+ "title": "Vaša prava",
+ "p1": "Imate pravo na:",
+ "li1": "Pristup informacijama o tome koje podatke prikupljamo",
+ "li2": "Brisanje vašeg lokalnog skladišta i kolačića u bilo kom trenutku",
+ "li3": "Prekid vaše autentifikovane sesije",
+ "li4": "Zahtev za informacijama o našim praksama u vezi sa podacima",
+ "p2": "Pošto ne prikupljamo lične podatke, obično nema ličnih informacija za brisanje ili izvoz."
+ },
+ "contact": {
+ "title": "Kontaktirajte nas",
+ "p1": "Za sva pitanja ili nedoumice u vezi sa ovom politikom privatnosti, možete nas kontaktirati otvaranjem issue-a na našem {link}.",
+ "link": "GitHub repozitorijumu"
+ },
+ "changes": {
+ "title": "Izmene ove politike",
+ "p1": "Možemo povremeno ažurirati ovu politiku privatnosti. Sve izmene biće objavljene na ovoj stranici sa ažuriranim datumom revizije."
+ }
+ },
+ "a11y": {
+ "title": "pristupačnost",
+ "footer_title": "a11y",
+ "welcome": "Želimo da {app} bude upotrebljiv što većem broju ljudi.",
+ "approach": {
+ "title": "Naš pristup",
+ "p1": "Trudimo se da pratimo Smernice za pristupačnost veb sadržaja (WCAG) 2.2 i koristimo ih kao referencu prilikom izrade funkcija. Ne tvrdimo da smo u potpunosti usklađeni ni sa jednim nivoom WCAG-a — pristupačnost je stalan proces i uvek ima još posla.",
+ "p2": "Ovaj sajt je {about}. Poboljšanja pristupačnosti se uvode postepeno kao deo našeg redovnog razvoja.",
+ "about_link": "projekat otvorenog koda kojim upravlja zajednica"
+ },
+ "measures": {
+ "title": "Šta radimo",
+ "p1": "Neke od stvari kojima težimo na celom sajtu:",
+ "li1": "Korišćenje semantičkog HTML-a i ARIA atributa gde je to prikladno.",
+ "li2": "Korišćenje relativnih veličina teksta tako da ih možete prilagoditi u svom pregledaču.",
+ "li3": "Podrška za navigaciju tastaturom kroz ceo interfejs.",
+ "li4": "Poštovanje prefers-reduced-motion i prefers-color-scheme medijskih upita.",
+ "li5": "Dizajniranje sa dovoljnim kontrastom boja na umu.",
+ "li6": "Osiguravanje da je suštinski sadržaj dostupan bez JavaScript-a, iako neke interaktivne funkcije zahtevaju njegovo korišćenje."
+ },
+ "limitations": {
+ "title": "Poznata ograničenja",
+ "p1": "Neki delovi sajta — posebno sadržaj trećih strana poput README datoteka paketa — možda ne ispunjavaju standarde pristupačnosti. Radimo na poboljšanju ovih oblasti tokom vremena."
+ },
+ "contact": {
+ "title": "Povratne informacije",
+ "p1": "Ako naiđete na prepreku u pristupačnosti na {app}, obavestite nas otvaranjem prijave problema u našem {link}. Ove prijave shvatamo ozbiljno i potrudićemo se da ih rešimo.",
+ "link": "GitHub repozitorijumu"
+ }
+ },
+ "translation_status": {
+ "title": "status prevoda",
+ "generated_at": "Datum generisanja: {date}",
+ "welcome": "Ako ste zainteresovani da nam pomognete da prevedemo {npmx} na neki od jezika navedenih ispod, na pravom ste mestu! Ova stranica koja se automatski ažurira uvek prikazuje sav sadržaj kome je trenutno potrebna vaša pomoć.",
+ "p1": "Koristimo {lang} kao podrazumevani jezik, sa ukupno {count}. Ako želite da pomognete u dodavanju prevoda, pronađite jezik u {bylang} i proširite detalje.",
+ "p1_lang": "američki engleski (en-US)",
+ "p1_count": "{count} poruka | {count} poruke | {count} poruka",
+ "p2": "Pre nego što počnete, pročitajte naš {guide} da biste naučili o našem procesu prevođenja i kako možete da se uključite.",
+ "guide": "vodič za lokalizaciju (i18n)",
+ "by_locale": "Napredak prevoda po lokalitetu",
+ "by_file": "Napredak prevoda po datoteci",
+ "complete_text": "Ovaj prevod je kompletan, neverovatan posao!",
+ "missing_text": "nedostaje",
+ "missing_keys": "{count} nedostajući prevod | {count} nedostajuća prevoda | {count} nedostajućih prevoda",
+ "progress_label": "Status napretka za {locale}",
+ "table": {
+ "file": "Datoteka",
+ "status": "Status",
+ "error": "Greška pri učitavanju liste datoteka.",
+ "empty": "Nema pronađenih datoteka",
+ "file_link": "Uredite {file} ({lang}) na GitHub-u"
+ }
+ },
+ "vacations": {
+ "title": "na odmoru",
+ "meta_description": "npmx tim se punio energijom. Discord je ponovo otvoren nakon nedelju dana.",
+ "heading": "punjenje energijom",
+ "subtitle": "gradili smo npmx tempom koji je koštao {some} od nas sna. nismo želeli da to postane norma! zato smo uzeli nedelju dana odmora. zajedno.",
+ "illustration_alt": "jedan red udobnih ikonica",
+ "poke_log": "Dodirnite logorsku vatru",
+ "what": {
+ "title": "šta se dogodilo",
+ "p1": "discord je bio zatvoren {dates}.",
+ "dates": "14 – 21. februar",
+ "p2": "svi pozivni linkovi su nestali i kanali su zaključani – osim {garden}, koji je ostao otvoren za one koji su želeli da se i dalje druže.",
+ "garden": "#garden"
+ },
+ "meantime": {
+ "title": "u međuvremenu",
+ "p1": "{site} i {repo} su ostali otvoreni – ljudi su i dalje ulazili, prijavljivali probleme, otvarali po koji PR, ali uglavnom su svi provodili vreme negde blizu udobnog kamina.",
+ "repo_link": "repozitorijum"
+ },
+ "return": {
+ "title": "vratili smo se!",
+ "p1": "vratili smo se napunjeni energijom i spremni za poslednji pritisak do 3. marta. {social} za novosti.",
+ "social_link": "zapratite nas na Bluesky-u"
+ },
+ "stats": {
+ "contributors": "Saradnici",
+ "commits": "Commit-ovi",
+ "pr": "Spojeni PR-ovi",
+ "subtitle": {
+ "some": "neki",
+ "all": "svi"
+ }
+ }
+ },
+ "action_bar": {
+ "title": "traka akcija",
+ "selection": "{count} izabran | {count} izabrana | {count} izabrano",
+ "shortcut": "Pritisnite \"{key}\" da fokusirate akcije",
+ "button_close_aria_label": "Zatvorite traku akcija"
+ },
+ "logo_menu": {
+ "copy_svg": "Kopirajte logo kao SVG",
+ "copied": "Kopirano!",
+ "browse_brand": "Pregledajte brand kit"
+ },
+ "brand": {
+ "title": "Brend",
+ "heading": "brend",
+ "meta_description": "Smernice za npmx brend, logotipi, boje i tipografija za upotrebu u štampi i medijima.",
+ "intro": "Resursi i smernice za korišćenje npmx brenda u vašim projektima, člancima i medijima.",
+ "logos": {
+ "title": "logotipi",
+ "description": "Preuzmite npmx logotipe u SVG i PNG formatima. Koristite odgovarajuću varijantu za svoju pozadinu.",
+ "wordmark": "PUNI ZNAK",
+ "wordmark_alt": "npmx puni znak logotipa sa plavom kosom crtom na tamnoj pozadini",
+ "wordmark_light_alt": "npmx puni znak logotipa sa akcentovanom kosom crtom na svetloj pozadini",
+ "mark": "ZNAK",
+ "mark_alt": "npmx znak logotipa sa tačkom i kosom crtom na tamnoj pozadini",
+ "mark_light_alt": "npmx znak logotipa sa tačkom i kosom crtom na svetloj pozadini",
+ "on_dark": "na tamnom",
+ "on_light": "na svetlom",
+ "download_svg": "SVG",
+ "download_png": "PNG",
+ "download_svg_aria": "Preuzmite {name} kao SVG",
+ "download_png_aria": "Preuzmite {name} kao PNG"
+ },
+ "customize": {
+ "title": "prilagodite svoj logo",
+ "description": "Pregledajte npmx logo sa svojom akcent bojom i pozadinom. Pregled odražava vaša trenutna podešavanja — izaberite boju, promenite pozadinu i preuzmite.",
+ "accent_label": "akcent",
+ "bg_label": "pozadina",
+ "download_svg_aria": "Preuzmite prilagođeni logo kao SVG",
+ "download_png_aria": "Preuzmite prilagođeni logo kao PNG"
+ },
+ "typography": {
+ "title": "tipografija",
+ "description": "npmx koristi Geist familiju fontova od Vercel-a i za interfejs tekst i za kod.",
+ "sans": "Geist Sans",
+ "sans_desc": "Koristi se za osnovni tekst i elemente korisničkog interfejsa.",
+ "mono": "Geist Mono",
+ "mono_desc": "Koristi se za kod, naslove i tehnički sadržaj.",
+ "pangram": "Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos.",
+ "numbers": "0123456789"
+ },
+ "guidelines": {
+ "title": "samo napomena",
+ "message": "Pristupačnost nam je važna, i voleli bismo da nas pratite u ovoj viziji. Kada koristite pomenute medije, osigurajte dovoljan kontrast u odnosu na pozadinu i nemojte ići manje od 24px. Ako su vam potrebni bilo kakvi drugi resursi ili dodatne informacije o projektu, slobodno nas kontaktirajte na {link}.",
+ "discord_link_text": "chat.npmx.dev"
+ }
+ }
+}
diff --git a/i18n/locales/ta-IN.json b/i18n/locales/ta-IN.json
index 0f566ebfe..96a41eb17 100644
--- a/i18n/locales/ta-IN.json
+++ b/i18n/locales/ta-IN.json
@@ -626,12 +626,10 @@
"code": {
"files_label": "கோப்புகள்",
"no_files": "இந்த கோப்பகத்தில் கோப்புகள் இல்லை",
- "root": "மூலம்",
"lines": "{count} வரி | {count} வரிகள்",
"toggle_tree": "கோப்பு மரத்தை நிலைமாற்று",
"close_tree": "கோப்பு மரத்தை மூடு",
"copy_link": "இணைப்பை நகலெடு",
- "raw": "மூலம்",
"view_raw": "மூல கோப்பைக் காண்க",
"file_too_large": "முன்னோட்டமிட கோப்பு மிகப்பெரியது",
"file_size_warning": "{size} தொடரியல் சிறப்பித்தலுக்கான 500KB வரம்பை மீறுகிறது",
diff --git a/i18n/locales/te-IN.json b/i18n/locales/te-IN.json
index 18dd0d564..ab580f63b 100644
--- a/i18n/locales/te-IN.json
+++ b/i18n/locales/te-IN.json
@@ -546,12 +546,10 @@
"code": {
"files_label": "ఫైల్లు",
"no_files": "ఈ డైరెక్టరీలో ఫైల్లు లేవు",
- "root": "రూట్",
"lines": "{count} పంక్తులు",
"toggle_tree": "ఫైల్ ట్రీని టాగుల్ చేయండి",
"close_tree": "ఫైల్ ట్రీని మూసివేయండి",
"copy_link": "లింక్ను కాపీ చేయండి",
- "raw": "రా",
"view_raw": "రా ఫైల్ను వీక్షించండి",
"file_too_large": "ఫైల్ ప్రివ్యూ కోసం చాలా పెద్దది",
"file_size_warning": "{size} సింటాక్స్ హైలైటింగ్ కోసం 500KB పరిమితి కంటే ఎక్కువ",
diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json
index 47ac20eb2..8d686950a 100644
--- a/i18n/locales/tr-TR.json
+++ b/i18n/locales/tr-TR.json
@@ -755,12 +755,10 @@
"code": {
"files_label": "Dosyalar",
"no_files": "Bu klasörde dosya yok",
- "root": "kök",
"lines": "{count} satır",
"toggle_tree": "Dosya ağacını değiştir",
"close_tree": "Dosya ağacını kapat",
"copy_link": "Bağlantıyı kopyala",
- "raw": "Ham",
"view_raw": "Ham dosyayı göster",
"file_too_large": "Dosya önizleme için çok büyük",
"file_size_warning": "{size} sözdizimi vurgulama için 500KB limitini aşıyor",
diff --git a/i18n/locales/uk-UA.json b/i18n/locales/uk-UA.json
index eb7037f0d..b9a8ab6b1 100644
--- a/i18n/locales/uk-UA.json
+++ b/i18n/locales/uk-UA.json
@@ -822,12 +822,10 @@
"code": {
"files_label": "Файли",
"no_files": "Немає файлів у цій папці",
- "root": "корінь",
"lines": "{count} рядків",
"toggle_tree": "Переключити дерево файлів",
"close_tree": "Закрити дерево файлів",
"copy_link": "Копіювати посилання",
- "raw": "Необроблено",
"view_raw": "Переглянути необроблений файл",
"file_too_large": "Файл занадто великий для попереду",
"file_size_warning": "{size} перевищує ліміт 500KB для виділення синтаксису",
diff --git a/i18n/locales/vi-VN.json b/i18n/locales/vi-VN.json
index 362f1831f..80e6477da 100644
--- a/i18n/locales/vi-VN.json
+++ b/i18n/locales/vi-VN.json
@@ -822,12 +822,10 @@
"code": {
"files_label": "Tệp",
"no_files": "Không có tệp nào trong thư mục này",
- "root": "gốc",
"lines": "{count} dòng | {count} dòng",
"toggle_tree": "Bật/tắt cây thư mục",
"close_tree": "Đóng cây thư mục",
"copy_link": "Sao chép liên kết",
- "raw": "Thô",
"view_raw": "Xem tệp thô",
"file_too_large": "Tệp quá lớn để xem trước",
"file_size_warning": "{size} vượt quá giới hạn 500KB để tô màu cú pháp (syntax highlight)",
diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json
index 865e40a93..49b5457f2 100644
--- a/i18n/locales/zh-CN.json
+++ b/i18n/locales/zh-CN.json
@@ -783,12 +783,10 @@
"code": {
"files_label": "文件",
"no_files": "这个目录中没有文件",
- "root": "根目录",
"lines": "{count} 行",
"toggle_tree": "切换文件树",
"close_tree": "关闭文件树",
"copy_link": "复制链接",
- "raw": "原始文件",
"view_raw": "查看原始文件",
"file_too_large": "文件过大,无法预览",
"file_size_warning": "{size} 超出了 500KB 的语法高亮限制",
diff --git a/i18n/locales/zh-TW.json b/i18n/locales/zh-TW.json
index d7e467d58..352d6e0b7 100644
--- a/i18n/locales/zh-TW.json
+++ b/i18n/locales/zh-TW.json
@@ -783,12 +783,10 @@
"code": {
"files_label": "檔案",
"no_files": "此目錄中沒有檔案",
- "root": "根目錄",
"lines": "{count} 行",
"toggle_tree": "切換檔案樹",
"close_tree": "關閉檔案樹",
"copy_link": "複製連結",
- "raw": "原始",
"view_raw": "檢視原始檔",
"file_too_large": "檔案太大無法預覽",
"file_size_warning": "{size} 超過 500KB 的語法高亮限制",
diff --git a/i18n/schema.json b/i18n/schema.json
index 01c96fd95..35f289f1f 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -2479,9 +2479,6 @@
"no_files": {
"type": "string"
},
- "root": {
- "type": "string"
- },
"lines": {
"type": "string"
},
@@ -2491,15 +2488,24 @@
"close_tree": {
"type": "string"
},
- "copy_link": {
+ "copy_content": {
"type": "string"
},
- "raw": {
+ "copy_link": {
"type": "string"
},
"view_raw": {
"type": "string"
},
+ "toggle_container": {
+ "type": "string"
+ },
+ "open_raw_file": {
+ "type": "string"
+ },
+ "open_path_dropdown": {
+ "type": "string"
+ },
"file_too_large": {
"type": "string"
},
diff --git a/package.json b/package.json
index cc29a66be..e70bf14bd 100644
--- a/package.json
+++ b/package.json
@@ -109,7 +109,7 @@
"vite-plugin-pwa": "1.2.0",
"vite-plus": "0.1.12",
"vue": "3.5.30",
- "vue-data-ui": "3.17.1"
+ "vue-data-ui": "3.17.3"
},
"devDependencies": {
"@e18e/eslint-plugin": "0.3.0",
diff --git a/playwright.config.ts b/playwright.config.ts
index 01e43f7a5..7c2cb39fb 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -1,5 +1,5 @@
import process from 'node:process'
-import { fileURLToPath } from 'node:url'
+import { join } from 'node:path'
import { defineConfig, devices } from '@playwright/test'
import type { ConfigOptions } from '@nuxt/test-utils/playwright'
@@ -19,14 +19,14 @@ export default defineConfig({
timeout: 60_000,
},
// Start/stop mock connector server before/after all tests (teardown via returned closure)
- globalSetup: fileURLToPath(new URL('./test/e2e/global-setup.ts', import.meta.url)),
+ globalSetup: join(import.meta.dirname, 'test/e2e/global-setup.ts'),
// We currently only test on one browser on one platform
snapshotPathTemplate: '{snapshotDir}/{testFileDir}/{testFileName}-snapshots/{arg}{ext}',
use: {
baseURL,
trace: 'on-first-retry',
nuxt: {
- rootDir: fileURLToPath(new URL('.', import.meta.url)),
+ rootDir: import.meta.dirname,
host: baseURL,
},
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 25ffb6f79..0413588f5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -235,8 +235,8 @@ importers:
specifier: 3.5.30
version: 3.5.30(typescript@6.0.2)
vue-data-ui:
- specifier: 3.17.1
- version: 3.17.1(vue@3.5.30(typescript@6.0.2))
+ specifier: 3.17.3
+ version: 3.17.3(vue@3.5.30(typescript@6.0.2))
devDependencies:
'@e18e/eslint-plugin':
specifier: 0.3.0
@@ -10721,8 +10721,8 @@ packages:
vue-component-type-helpers@3.2.6:
resolution: {integrity: sha512-O02tnvIfOQVmnvoWwuSydwRoHjZVt8UEBR+2p4rT35p8GAy5VTlWP8o5qXfJR/GWCN0nVZoYWsVUvx2jwgdBmQ==}
- vue-data-ui@3.17.1:
- resolution: {integrity: sha512-MRSWzNXQQpfWQq5GMaxwNoOFYnHEj5sAui19HaA9rT5eHdgAAgwqJS1Gzx+7XBqNcYmW4MK/3qzX8KH0BbiiQQ==}
+ vue-data-ui@3.17.3:
+ resolution: {integrity: sha512-Adfyb/x2Jy0BdpGgugckK44/XRW43lVChqsJuM3cVdx9x87A9Q4sDfH2HjAxLH2BWIeQcEgkI6ozXf8m/97tHw==}
peerDependencies:
jspdf: '>=3.0.1'
vue: '>=3.3.0'
@@ -23600,7 +23600,7 @@ snapshots:
vue-component-type-helpers@3.2.6: {}
- vue-data-ui@3.17.1(vue@3.5.30(typescript@6.0.2)):
+ vue-data-ui@3.17.3(vue@3.5.30(typescript@6.0.2)):
dependencies:
vue: 3.5.30(typescript@6.0.2)
diff --git a/public/robots.txt b/public/robots.txt
index bdd4add70..1efdb87b4 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,5 +1,19 @@
-User-agent: *
-Allow: /
+Allow: /$
+Allow: /about$
+Allow: /accessibility$
+Allow: /blog
+Allow: /brand$
+Allow: /pds$
+Allow: /privacy$
+Allow: /translation-status$
+Allow: /recharging$
+Allow: /__og-image__/*
+Allow: /opensearch.xml$
+
+Disallow: /
+
+# User-agent: *
+# Allow: /
# Search pages: infinite query-param combinations
Disallow: /search
diff --git a/scripts/compare-translations.ts b/scripts/compare-translations.ts
index c67099562..3afd9bd76 100644
--- a/scripts/compare-translations.ts
+++ b/scripts/compare-translations.ts
@@ -3,12 +3,11 @@ import type { LocaleObject } from '@nuxtjs/i18n'
import * as process from 'node:process'
import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'
import { basename, join, resolve } from 'node:path'
-import { fileURLToPath } from 'node:url'
import { deepCopy } from '@intlify/shared'
import { countryLocaleVariants, currentLocales } from '../config/i18n.ts'
import { COLORS } from './utils.ts'
-const LOCALES_DIRECTORY = fileURLToPath(new URL('../i18n/locales', import.meta.url))
+const LOCALES_DIRECTORY = join(import.meta.dirname, '../i18n/locales')
const REFERENCE_FILE_NAME = 'en.json'
type NestedObject = { [key: string]: unknown }
diff --git a/scripts/find-invalid-translations.ts b/scripts/find-invalid-translations.ts
index 5c32edf07..173ae7a2b 100644
--- a/scripts/find-invalid-translations.ts
+++ b/scripts/find-invalid-translations.ts
@@ -1,10 +1,9 @@
/* eslint-disable no-console */
import { join } from 'node:path'
-import { fileURLToPath } from 'node:url'
import { createI18NReport, type I18NItem } from 'vue-i18n-extract'
import { colors } from './utils/colors.ts'
-const LOCALES_DIRECTORY = fileURLToPath(new URL('../i18n/locales', import.meta.url))
+const LOCALES_DIRECTORY = join(import.meta.dirname, '../i18n/locales')
const REFERENCE_FILE_NAME = 'en.json'
const VUE_FILES_GLOB = './app/**/*.?(vue|ts|js)'
diff --git a/scripts/generate-fixtures.ts b/scripts/generate-fixtures.ts
index fdad17fc4..bf71c0516 100644
--- a/scripts/generate-fixtures.ts
+++ b/scripts/generate-fixtures.ts
@@ -12,9 +12,8 @@
import { writeFileSync, mkdirSync, existsSync } from 'node:fs'
import { dirname, join } from 'node:path'
-import { fileURLToPath } from 'node:url'
-const FIXTURES_DIR = fileURLToPath(new URL('../test/fixtures', import.meta.url))
+const FIXTURES_DIR = join(import.meta.dirname, '../test/fixtures')
const NPM_REGISTRY = 'https://registry.npmjs.org'
const NPM_API = 'https://api.npmjs.org'
diff --git a/scripts/generate-i18n-schema.ts b/scripts/generate-i18n-schema.ts
index 2f1b498d6..9f991880f 100644
--- a/scripts/generate-i18n-schema.ts
+++ b/scripts/generate-i18n-schema.ts
@@ -1,10 +1,9 @@
/* oxlint-disable no-console */
import { readFile, writeFile } from 'node:fs/promises'
import { join } from 'node:path'
-import { fileURLToPath } from 'node:url'
import { colors } from './utils/colors.ts'
-const I18N_DIRECTORY = fileURLToPath(new URL('../i18n', import.meta.url))
+const I18N_DIRECTORY = join(import.meta.dirname, '../i18n')
const LOCALES_DIRECTORY = join(I18N_DIRECTORY, 'locales')
const REFERENCE_FILE_NAME = 'en.json'
const SCHEMA_FILE_NAME = 'schema.json'
diff --git a/scripts/remove-unused-translations.ts b/scripts/remove-unused-translations.ts
index 75632a938..602d9643d 100644
--- a/scripts/remove-unused-translations.ts
+++ b/scripts/remove-unused-translations.ts
@@ -1,11 +1,10 @@
/* eslint-disable no-console */
import { join } from 'node:path'
-import { fileURLToPath } from 'node:url'
import { createI18NReport, type I18NItem } from 'vue-i18n-extract'
import { colors } from './utils/colors.ts'
import { readdir, readFile, writeFile } from 'node:fs/promises'
-const LOCALES_DIRECTORY = fileURLToPath(new URL('../i18n/locales', import.meta.url))
+const LOCALES_DIRECTORY = join(import.meta.dirname, '../i18n/locales')
const REFERENCE_FILE_NAME = 'en.json'
const VUE_FILES_GLOB = './app/**/*.?(vue|ts|js)'
diff --git a/scripts/unocss-checker.ts b/scripts/unocss-checker.ts
index 697621d58..0cf58cd8a 100644
--- a/scripts/unocss-checker.ts
+++ b/scripts/unocss-checker.ts
@@ -1,6 +1,5 @@
import type { Dirent } from 'node:fs'
import { glob, readFile } from 'node:fs/promises'
-import { fileURLToPath } from 'node:url'
import { resolve } from 'node:path'
import { createGenerator } from 'unocss'
import { presetRtl } from '../uno-preset-rtl.ts'
@@ -9,7 +8,7 @@ import { COLORS } from './utils.ts'
import { presetWind4 } from 'unocss'
const argvFiles = process.argv.slice(2)
-const APP_DIRECTORY = fileURLToPath(new URL('../app', import.meta.url))
+const APP_DIRECTORY = resolve(import.meta.dirname, '../app')
async function checkFile(path: Dirent): Promise {
if (path.isDirectory() || !path.name.endsWith('.vue')) {
diff --git a/server/utils/atproto/oauth.ts b/server/utils/atproto/oauth.ts
index 58152fd2b..ae9ba489d 100644
--- a/server/utils/atproto/oauth.ts
+++ b/server/utils/atproto/oauth.ts
@@ -41,11 +41,11 @@ export function getOauthClientMetadata(pkAlg: string | undefined = undefined): O
? webUriSchema.parse(`${clientUri}/.well-known/jwks.json`)
: undefined
- // If anything changes here, please make sure to also update /shared/schemas/oauth.ts to match
return {
client_name: 'npmx.dev',
client_id,
client_uri: clientUri,
+ logo_uri: webUriSchema.parse(`${clientUri}/logo-icon.svg`),
scope,
redirect_uris: [redirect_uri],
grant_types: ['authorization_code', 'refresh_token'],
diff --git a/test/nuxt/a11y.spec.ts b/test/nuxt/a11y.spec.ts
index 09f2f1f04..46bba7bba 100644
--- a/test/nuxt/a11y.spec.ts
+++ b/test/nuxt/a11y.spec.ts
@@ -144,10 +144,11 @@ import {
LandingLogo,
LinkBase,
CallToAction,
- ChartPatternSlot,
CodeDirectoryListing,
CodeFileTree,
+ CodeHeader,
CodeMobileTreeDrawer,
+ CodeSkeletonLoader,
CodeViewer,
CopyToClipboardButton,
CollapsibleSection,
@@ -1256,6 +1257,44 @@ describe('component accessibility audits', () => {
})
})
+ describe('CodeHeader', () => {
+ it('should have no accessibility violations', async () => {
+ const component = await mountSuspended(CodeHeader, {
+ props: {
+ filePath: 'misc/true.js',
+ loading: false,
+ isViewingFile: true,
+ isBinaryFile: false,
+ fileContent: {
+ package: 'vite',
+ version: '1.0.0',
+ path: 'misc/true.js',
+ language: 'javascript',
+ contentType: 'application/javascript',
+ content: 'const x = 1;',
+ html: 'const x = 1; ',
+ lines: 1,
+ },
+ markdownViewMode: 'preview',
+ selectedLines: null,
+ getCodeUrlWithPath: (path = '') => `/package-code/vite/v/1.0.0/${path}`,
+ packageName: 'vite',
+ version: '1.0.0',
+ },
+ })
+ const results = await runAxe(component)
+ expect(results.violations).toEqual([])
+ })
+ })
+
+ describe('CodeSkeletonLoader', () => {
+ it('should have no accessibility violations', async () => {
+ const component = await mountSuspended(CodeSkeletonLoader)
+ const results = await runAxe(component)
+ expect(results.violations).toEqual([])
+ })
+ })
+
describe('CodeViewer', () => {
it('should have no accessibility violations', async () => {
const component = await mountSuspended(CodeViewer, {
@@ -2261,23 +2300,6 @@ describe('component accessibility audits', () => {
})
})
- describe('ChartPatternSlot', () => {
- it('should have no accessibility violations', async () => {
- const component = await mountSuspended(ChartPatternSlot, {
- props: {
- id: 'perennius',
- seed: 1,
- foregroundColor: 'black',
- fallbackColor: 'transparent',
- maxSize: 24,
- minSize: 16,
- },
- })
- const results = await runAxe(component)
- expect(results.violations).toEqual([])
- })
- })
-
describe('CopyToClipboardButton', () => {
it('should have no accessibility violations in default state', async () => {
const component = await mountSuspended(CopyToClipboardButton, {
diff --git a/test/unit/a11y-component-coverage.spec.ts b/test/unit/a11y-component-coverage.spec.ts
index a73b58dd6..6100cc04d 100644
--- a/test/unit/a11y-component-coverage.spec.ts
+++ b/test/unit/a11y-component-coverage.spec.ts
@@ -11,7 +11,6 @@
import fs from 'node:fs'
import path from 'node:path'
import { assert, describe, it } from 'vitest'
-import { fileURLToPath } from 'node:url'
/**
* Components explicitly skipped from a11y testing with reasons.
@@ -152,9 +151,9 @@ function getTestedComponents(
}
describe('a11y component test coverage', () => {
- const componentsDir = fileURLToPath(new URL('../../app/components', import.meta.url))
- const componentsDtsPath = fileURLToPath(new URL('../../.nuxt/components.d.ts', import.meta.url))
- const testFilePath = fileURLToPath(new URL('../nuxt/a11y.spec.ts', import.meta.url))
+ const componentsDir = path.join(import.meta.dirname, '../../app/components')
+ const componentsDtsPath = path.join(import.meta.dirname, '../../.nuxt/components.d.ts')
+ const testFilePath = path.join(import.meta.dirname, '../nuxt/a11y.spec.ts')
it('should have accessibility tests for all components (or be explicitly skipped)', () => {
// Get all Vue components
diff --git a/test/unit/app/utils/charts.spec.ts b/test/unit/app/utils/charts.spec.ts
index 6a82d7e82..72c3d6c99 100644
--- a/test/unit/app/utils/charts.spec.ts
+++ b/test/unit/app/utils/charts.spec.ts
@@ -15,9 +15,6 @@ import {
sanitise,
insertLineBreaks,
applyEllipsis,
- createSeedNumber,
- createSeededSvgPattern,
- createChartPatternSlotMarkup,
type TrendLineConfig,
type TrendLineDataset,
type VersionsBarConfig,
@@ -1402,252 +1399,3 @@ describe('applyEllipsis', () => {
expect(applyEllipsis('you need to touch grass', 13)).toBe('you need to t...')
})
})
-
-describe('createSeedNumber', () => {
- it('returns the same hash for the same input', () => {
- expect(createSeedNumber('react')).toBe(createSeedNumber('react'))
- expect(createSeedNumber('vue')).toBe(createSeedNumber('vue'))
- })
-
- it('returns different hashes for different inputs', () => {
- expect(createSeedNumber('react')).not.toBe(createSeedNumber('vue'))
- expect(createSeedNumber('svelte')).not.toBe(createSeedNumber('solid'))
- })
-
- it('returns a 32 bit unsigned integer', () => {
- const result = createSeedNumber('react')
- expect(Number.isInteger(result)).toBe(true)
- expect(result).toBeGreaterThanOrEqual(0)
- expect(result).toBeLessThanOrEqual(4294967295)
- })
-
- it('handles an empty string', () => {
- const result = createSeedNumber('')
- expect(Number.isInteger(result)).toBe(true)
- expect(result).toBeGreaterThanOrEqual(0)
- expect(result).toBeLessThanOrEqual(4294967295)
- })
-
- it('is case sensitive', () => {
- expect(createSeedNumber('react')).not.toBe(createSeedNumber('React'))
- })
-})
-
-describe('createSeededSvgPattern', () => {
- it('returns deterministic output for the same seed', () => {
- const first = createSeededSvgPattern('react')
- const second = createSeededSvgPattern('react')
- expect(first).toEqual(second)
- })
-
- it('returns different output for different seeds', () => {
- const first = createSeededSvgPattern('react')
- const second = createSeededSvgPattern('vue')
- expect(second).not.toEqual(first)
- })
-
- it('returns a valid pattern object shape', () => {
- const result = createSeededSvgPattern('react')
- expect(typeof result.width).toBe('number')
- expect(typeof result.height).toBe('number')
- expect(typeof result.rotation).toBe('number')
- expect(typeof result.patternType).toBe('string')
- expect(typeof result.contentMarkup).toBe('string')
- })
-
- it('uses default options when none are provided', () => {
- const result = createSeededSvgPattern('react')
- expect(result.width).toBeGreaterThanOrEqual(8)
- expect(result.width).toBeLessThanOrEqual(20)
- expect(result.height).toBe(result.width)
- expect(result.contentMarkup.length).toBeGreaterThan(0)
- })
-
- it('uses the provided foreground and background colors', () => {
- const result = createSeededSvgPattern('react', {
- foregroundColor: '#ff0000',
- backgroundColor: '#00ff00',
- })
- expect(result.contentMarkup).toContain('#ff0000')
- expect(result.contentMarkup).toContain('#00ff00')
- expect(result.contentMarkup).toContain(' {
- const result = createSeededSvgPattern('react', {
- backgroundColor: 'transparent',
- })
- expect(result.contentMarkup).not.toContain(' {
- const result = createSeededSvgPattern('react', {
- minimumSize: 10,
- maximumSize: 16,
- })
- expect(result.width).toBeGreaterThanOrEqual(10)
- expect(result.width).toBeLessThanOrEqual(16)
- expect(result.height).toBe(result.width)
- })
-
- it('always returns one of the supported pattern types', () => {
- const allowedPatternTypes = [
- 'diagonalLines',
- 'verticalLines',
- 'horizontalLines',
- 'crosshatch',
- 'dots',
- 'grid',
- 'zigzag',
- ]
- const result = createSeededSvgPattern('react')
- expect(allowedPatternTypes).toContain(result.patternType)
- })
-
- it('returns a supported rotation value', () => {
- const allowedRotations = [0, 15, 30, 45, 60, 75, 90, 120, 135]
- const result = createSeededSvgPattern('react')
- expect(allowedRotations).toContain(result.rotation)
- })
-
- it('returns svg markup matching the selected pattern type', () => {
- const seeds = [
- 'react',
- 'vue',
- 'svelte',
- 'solid',
- 'angular',
- 'ember',
- 'preact',
- 'lit',
- 'alpine',
- 'nuxt',
- 'next',
- 'astro',
- 'qwik',
- 'backbone',
- ]
-
- const expectedTagByPatternType: Record<
- ReturnType['patternType'],
- string
- > = {
- diagonalLines: ' {
- const result = createSeededSvgPattern(12345)
- expect(typeof result.width).toBe('number')
- expect(typeof result.contentMarkup).toBe('string')
- expect(result.contentMarkup.length).toBeGreaterThan(0)
- })
-
- it('returns deterministic output for equivalent numeric and string seeds', () => {
- const numericSeedResult = createSeededSvgPattern(12345)
- const stringSeedResult = createSeededSvgPattern('12345')
- expect(numericSeedResult).toEqual(stringSeedResult)
- })
-})
-
-describe('createChartPatternSlotMarkup', () => {
- it('returns a pattern element with the provided id', () => {
- const result = createChartPatternSlotMarkup({
- id: 'pattern-1',
- seed: 7,
- color: '#ff0000',
- foregroundColor: '#ffffff',
- fallbackColor: 'transparent',
- maxSize: 24,
- minSize: 16,
- })
-
- expect(result).toContain('')
- })
-
- it('includes width, height, rotation, and content markup from the generated pattern', () => {
- const generatedPattern = createSeededSvgPattern(1, {
- foregroundColor: '#000',
- backgroundColor: 'transparent',
- minimumSize: 16,
- maximumSize: 24,
- })
-
- const result = createChartPatternSlotMarkup({
- id: 'pattern-1',
- seed: 1,
- foregroundColor: '#000',
- fallbackColor: 'transparent',
- maxSize: 24,
- minSize: 16,
- })
-
- expect(result).toContain(`width="${generatedPattern.width}"`)
- expect(result).toContain(`height="${generatedPattern.height}"`)
- expect(result).toContain(`patternTransform="rotate(${generatedPattern.rotation})"`)
- expect(result).toContain(generatedPattern.contentMarkup)
- })
-
- it('is deterministic for the same inputs', () => {
- const first = createChartPatternSlotMarkup({
- id: 'pattern-stable',
- seed: 'nuxt',
- color: '#00ff00',
- foregroundColor: '#000000',
- fallbackColor: 'transparent',
- maxSize: 40,
- minSize: 10,
- })
-
- const second = createChartPatternSlotMarkup({
- id: 'pattern-stable',
- seed: 'nuxt',
- color: '#00ff00',
- foregroundColor: '#000000',
- fallbackColor: 'transparent',
- maxSize: 40,
- minSize: 10,
- })
-
- expect(first).toBe(second)
- })
-
- it('changes when the id changes', () => {
- const first = createChartPatternSlotMarkup({
- id: 'pattern-a',
- seed: 1,
- color: '#00ff00',
- foregroundColor: '#000000',
- fallbackColor: 'transparent',
- maxSize: 40,
- minSize: 10,
- })
-
- const second = createChartPatternSlotMarkup({
- id: 'pattern-b',
- seed: 2,
- color: '#00ff00',
- foregroundColor: '#000000',
- fallbackColor: 'transparent',
- maxSize: 40,
- minSize: 10,
- })
-
- expect(first).not.toBe(second)
- })
-})
diff --git a/uno.config.ts b/uno.config.ts
index fae3f4578..76bb1269a 100644
--- a/uno.config.ts
+++ b/uno.config.ts
@@ -140,6 +140,7 @@ export default defineConfig({
// Layout
['container', 'max-w-6xl mx-auto px-4 sm:px-6'],
['container-sm', 'max-w-5xl mx-auto px-4 sm:px-6'],
+ ['flex-split', 'flex items-center justify-between'],
// Focus states - subtle but accessible
['focus-ring', 'outline-none focus-visible:(ring-2 ring-fg/50 ring-offset-2)'],
diff --git a/vite.config.ts b/vite.config.ts
index 2f8ffcdfe..e34f71b12 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,9 +1,8 @@
-import { fileURLToPath } from 'node:url'
import { defineConfig } from 'vite-plus'
import { defineVitestProject } from '@nuxt/test-utils/config'
import { playwright } from 'vite-plus/test/browser-playwright'
-const rootDir = fileURLToPath(new URL('.', import.meta.url))
+const rootDir = import.meta.dirname
export default defineConfig({
run: {
@@ -187,7 +186,7 @@ export default defineConfig({
environment: 'nuxt',
environmentOptions: {
nuxt: {
- rootDir: fileURLToPath(new URL('.', import.meta.url)),
+ rootDir,
overrides: {
vue: {
runtimeCompiler: true,