~{{ username }}
diff --git a/app/pages/~[username]/orgs.vue b/app/pages/~[username]/orgs.vue
index 138bd69139..a5128237e1 100644
--- a/app/pages/~[username]/orgs.vue
+++ b/app/pages/~[username]/orgs.vue
@@ -126,7 +126,7 @@ defineOgImageComponent('Default', {
-
+
~{{ username }}
{{ $t('user.orgs_page.title') }}
diff --git a/app/router.options.ts b/app/router.options.ts
index a6d9db7ccd..e978a5b6e2 100644
--- a/app/router.options.ts
+++ b/app/router.options.ts
@@ -1,19 +1,30 @@
import type { RouterConfig } from 'nuxt/schema'
export default {
- scrollBehavior(to, _from, savedPosition) {
+ scrollBehavior(to, from, savedPosition) {
// If the browser has a saved position (e.g. back/forward navigation), restore it
-
if (savedPosition) {
return savedPosition
}
+
+ // Scroll to top when main search query changes
+ if (to.path === '/search' && to.query.q !== from.query.q) {
+ return { left: 0, top: 0 }
+ }
+
+ // Preserve the current viewport for query-only updates on pages that opt in,
+ // such as compare where controls sync state to the URL in-place.
+ if (to.path === from.path && to.hash === from.hash && to.meta.preserveScrollOnQuery === true) {
+ return false
+ }
+
// If navigating to a hash anchor, scroll to it
if (to.hash) {
const { scrollMargin } = to.meta
return {
el: to.hash,
behavior: 'smooth',
- top: typeof scrollMargin == 'number' ? scrollMargin : 70,
+ top: typeof scrollMargin === 'number' ? scrollMargin : 70,
}
}
diff --git a/app/types/index.ts b/app/types/index.ts
index 5058830705..f736f8b329 100644
--- a/app/types/index.ts
+++ b/app/types/index.ts
@@ -10,5 +10,9 @@ declare module '#app' {
* @default 70
*/
scrollMargin?: number
+ /**
+ * preserve scroll position when only query params change on same path/hash
+ */
+ preserveScrollOnQuery?: boolean
}
}
diff --git a/app/utils/atproto/likes.ts b/app/utils/atproto/likes.ts
index 236abb9adb..c95fd20083 100644
--- a/app/utils/atproto/likes.ts
+++ b/app/utils/atproto/likes.ts
@@ -2,15 +2,12 @@ import { FetchError } from 'ofetch'
import { handleAuthError } from '~/utils/atproto/helpers'
import type { PackageLikes } from '#shared/types/social'
-export type LikeResult = { success: true; data: PackageLikes } | { success: false; error: Error }
+type LikeResult = { success: true; data: PackageLikes } | { success: false; error: Error }
/**
* Like a package via the API
*/
-export async function likePackage(
- packageName: string,
- userHandle?: string | null,
-): Promise
{
+async function likePackage(packageName: string, userHandle?: string | null): Promise {
try {
const result = await $fetch('/api/social/like', {
method: 'POST',
@@ -28,10 +25,7 @@ export async function likePackage(
/**
* Unlike a package via the API
*/
-export async function unlikePackage(
- packageName: string,
- userHandle?: string | null,
-): Promise {
+async function unlikePackage(packageName: string, userHandle?: string | null): Promise {
try {
const result = await $fetch('/api/social/like', {
method: 'DELETE',
diff --git a/app/utils/atproto/profile.ts b/app/utils/atproto/profile.ts
index 43968ea5b9..0c3ed242a4 100644
--- a/app/utils/atproto/profile.ts
+++ b/app/utils/atproto/profile.ts
@@ -1,7 +1,7 @@
import { FetchError } from 'ofetch'
import { handleAuthError } from './helpers'
-export type UpdateProfileResult = {
+type UpdateProfileResult = {
success: boolean
error?: Error
}
diff --git a/app/utils/charts.ts b/app/utils/charts.ts
index d22750aa95..12ed2c0958 100644
--- a/app/utils/charts.ts
+++ b/app/utils/charts.ts
@@ -720,3 +720,378 @@ 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()
+ */
+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}
+
+ `
+}
diff --git a/app/utils/file-icons.ts b/app/utils/file-icons.ts
index e4d510c1af..6647e43a0e 100644
--- a/app/utils/file-icons.ts
+++ b/app/utils/file-icons.ts
@@ -146,6 +146,7 @@ export const FILENAME_ICONS: Record = {
'yarn.lock': 'vscode-icons-file-type-yarn',
'.yarnrc': 'vscode-icons-file-type-yarn',
'.yarnrc.yml': 'vscode-icons-file-type-yarn',
+ 'bun.lock': 'vscode-icons-file-type-bun',
'bun.lockb': 'vscode-icons-file-type-bun',
'bunfig.toml': 'vscode-icons-file-type-bun',
'deno.json': 'vscode-icons-file-type-deno',
diff --git a/app/utils/versions.ts b/app/utils/versions.ts
index 88f3c4bc33..e2aa8741a7 100644
--- a/app/utils/versions.ts
+++ b/app/utils/versions.ts
@@ -51,6 +51,73 @@ export function getPrereleaseChannel(version: string): string {
return match ? match[1]!.toLowerCase() : ''
}
+/**
+ * Priority order for well-known dist-tags.
+ * Lower number = higher priority in display order.
+ * Unknown tags fall back to Infinity and are sorted by publish date descending.
+ */
+export const TAG_PRIORITY: Record = {
+ latest: 0,
+ stable: 1,
+ rc: 2,
+ beta: 3,
+ next: 4,
+ alpha: 5,
+ canary: 6,
+ nightly: 7,
+ experimental: 8,
+ legacy: 9,
+}
+
+/**
+ * Get the display priority for a dist-tag.
+ * Uses fuzzy matching so e.g. "v2-legacy" matches "legacy".
+ * @param tag - The tag name (e.g., "beta", "v2-legacy")
+ * @returns Numeric priority (lower = higher priority); Infinity for unknown tags
+ */
+export function getTagPriority(tag: string | undefined): number {
+ if (!tag) return Infinity
+ for (const [key, priority] of Object.entries(TAG_PRIORITY)) {
+ if (tag.toLowerCase().includes(key)) return priority
+ }
+ return Infinity
+}
+
+/**
+ * Compare two tagged version rows for display ordering.
+ * Sorts by minimum tag priority first; falls back to publish date descending.
+ * @param rowA - First row
+ * @param rowB - Second row
+ * @param versionTimes - Map of version string to ISO publish time
+ * @returns Negative/zero/positive comparator value
+ */
+export function compareTagRows(
+ rowA: TaggedVersionRow,
+ rowB: TaggedVersionRow,
+ versionTimes: Record,
+): number {
+ const priorityA = Math.min(...rowA.tags.map(getTagPriority))
+ const priorityB = Math.min(...rowB.tags.map(getTagPriority))
+ if (priorityA !== priorityB) return priorityA - priorityB
+ const timeA = versionTimes[rowA.version] ?? ''
+ const timeB = versionTimes[rowB.version] ?? ''
+ return timeB.localeCompare(timeA)
+}
+
+/**
+ * Compare two version group keys for display ordering.
+ * Sorts by major descending, then by minor descending for 0.x groups.
+ * @param a - Group key (e.g. "1", "0.9")
+ * @param b - Group key (e.g. "2", "0.10")
+ * @returns Negative/zero/positive comparator value
+ */
+export function compareVersionGroupKeys(a: string, b: string): number {
+ const [majorA, minorA] = a.split('.').map(Number)
+ const [majorB, minorB] = b.split('.').map(Number)
+ if (majorA !== majorB) return (majorB ?? 0) - (majorA ?? 0)
+ return (minorB ?? -1) - (minorA ?? -1)
+}
+
/**
* Sort tags with 'latest' first, then alphabetically
* @param tags - Array of tag names
diff --git a/cli/package.json b/cli/package.json
index 1fc037477b..a924c17e1a 100644
--- a/cli/package.json
+++ b/cli/package.json
@@ -2,26 +2,26 @@
"name": "npmx-connector",
"version": "0.0.1",
"description": "Local connector for npmx.dev - enables authenticated npm operations from the web UI",
+ "homepage": "https://npmx.dev",
+ "bugs": {
+ "url": "https://github.com/npmx-dev/npmx.dev/issues"
+ },
"license": "MIT",
- "type": "module",
"repository": {
"type": "git",
"url": "git+https://github.com/npmx-dev/npmx.dev.git",
"directory": "cli"
},
- "bugs": {
- "url": "https://github.com/npmx-dev/npmx.dev/issues"
- },
- "homepage": "https://npmx.dev",
"bin": {
"npmx-connector": "./dist/cli.mjs"
},
- "exports": {
- ".": "./dist/index.mjs"
- },
"files": [
"dist"
],
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.mjs"
+ },
"scripts": {
"build": "tsdown",
"dev": "NPMX_CLI_DEV=true node src/cli.ts",
@@ -40,9 +40,9 @@
"validate-npm-package-name": "^7.0.2"
},
"devDependencies": {
- "@types/node": "24.11.0",
+ "@types/node": "24.12.0",
"@types/validate-npm-package-name": "4.0.2",
- "tsdown": "0.20.3",
+ "tsdown": "0.21.4",
"typescript": "5.9.3"
},
"engines": {
diff --git a/config/env.ts b/config/env.ts
index 49daac01ae..d673c5cafd 100644
--- a/config/env.ts
+++ b/config/env.ts
@@ -6,8 +6,6 @@ import * as process from 'node:process'
import { version as packageVersion } from '../package.json'
import { getNextVersion } from '../scripts/next-version'
-export { packageVersion as version }
-
/**
* Environment variable `PULL_REQUEST` provided by Netlify.
* @see {@link https://docs.netlify.com/build/configure-builds/environment-variables/#git-metadata}
@@ -17,7 +15,7 @@ export { packageVersion as version }
*
* Whether triggered by a GitHub PR
*/
-export const isPR = process.env.PULL_REQUEST === 'true' || !!process.env.VERCEL_GIT_PULL_REQUEST_ID
+const isPR = process.env.PULL_REQUEST === 'true' || !!process.env.VERCEL_GIT_PULL_REQUEST_ID
/**
* Environment variable `REVIEW_ID` provided by Netlify.
@@ -28,7 +26,7 @@ export const isPR = process.env.PULL_REQUEST === 'true' || !!process.env.VERCEL_
*
* Pull request number (if in a PR environment)
*/
-export const prNumber = process.env.REVIEW_ID || process.env.VERCEL_GIT_PULL_REQUEST_ID || null
+const prNumber = process.env.REVIEW_ID || process.env.VERCEL_GIT_PULL_REQUEST_ID || null
/**
* Environment variable `BRANCH` provided by Netlify.
@@ -39,7 +37,7 @@ export const prNumber = process.env.REVIEW_ID || process.env.VERCEL_GIT_PULL_REQ
*
* Git branch
*/
-export const gitBranch = process.env.BRANCH || process.env.VERCEL_GIT_COMMIT_REF
+const gitBranch = process.env.BRANCH || process.env.VERCEL_GIT_COMMIT_REF
/**
* Whether this is the canary environment (main.npmx.dev).
@@ -68,7 +66,7 @@ export const isCanary =
*
* Whether this is some sort of preview environment.
*/
-export const isPreview =
+const isPreview =
isPR ||
(process.env.CONTEXT && process.env.CONTEXT !== 'production') ||
process.env.VERCEL_ENV === 'preview' ||
@@ -118,7 +116,7 @@ export const getProductionUrl = () =>
: undefined
const git = Git()
-export async function getGitInfo() {
+async function getGitInfo() {
let branch
try {
branch = gitBranch || (await git.revparse(['--abbrev-ref', 'HEAD']))
diff --git a/config/i18n.ts b/config/i18n.ts
index aca626d74d..5993b7551a 100644
--- a/config/i18n.ts
+++ b/config/i18n.ts
@@ -358,9 +358,9 @@ const locales: (LocaleObjectData | (Omit & { code: str
function buildLocales() {
const useLocales = Object.values(locales).reduce((acc, data) => {
- const variants = countryLocaleVariants[data.code]
- if (variants) {
- variants.forEach(l => {
+ const localeVariants = countryLocaleVariants[data.code]
+ if (localeVariants) {
+ localeVariants.forEach(l => {
const entry: LocaleObjectData = {
...data,
code: l.code,
@@ -406,8 +406,10 @@ export const datetimeFormats = Object.values(currentLocales).reduce((acc, data)
}, {} as DateTimeFormats)
export const numberFormats = Object.values(currentLocales).reduce((acc, data) => {
- if (data.numberFormats) {
- acc[data.code] = { ...data.numberFormats }
+ const numberFormatsArray = data.numberFormats
+ if (numberFormatsArray) {
+ acc[data.code] = { ...numberFormatsArray }
+
delete data.numberFormats
} else {
acc[data.code] = {
diff --git a/docs/app/components/BadgeGenerator.vue b/docs/app/components/BadgeGenerator.vue
new file mode 100644
index 0000000000..8d36371233
--- /dev/null
+++ b/docs/app/components/BadgeGenerator.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![Badge Preview]()
+
Invalid
+
+
+
+
+
+
+
diff --git a/docs/app/components/BadgeGeneratorParameters.vue b/docs/app/components/BadgeGeneratorParameters.vue
new file mode 100644
index 0000000000..aa1b931dd9
--- /dev/null
+++ b/docs/app/components/BadgeGeneratorParameters.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![Badge Preview]()
+
+ {{ !isInputValid ? 'Invalid Parameters' : 'Not Found' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+
+
+
+
+
+
+ #
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/content/1.getting-started/1.introduction.md b/docs/content/1.getting-started/1.introduction.md
index 427ada95b4..3945904189 100644
--- a/docs/content/1.getting-started/1.introduction.md
+++ b/docs/content/1.getting-started/1.introduction.md
@@ -5,11 +5,11 @@ navigation:
icon: i-lucide:house
---
-npmx.dev provides a better way to browse the npm registry.
+npmx.dev is a fast, modern way to browse the npm registry.
## What is npmx.dev?
-npmx.dev is a fast, modern browser for the npm registry. It doesn't aim to replace [npmjs.com](https://www.npmjs.com/), but provides a better UI and developer experience for browsing packages, viewing documentation, and exploring code.
+npmx.dev is a fast, modern browser for the npm registry, focused on a great developer experience for browsing packages, viewing documentation, and exploring code.
## What you can do
diff --git a/docs/content/2.guide/1.features.md b/docs/content/2.guide/1.features.md
index 75e8decb24..d15505da57 100644
--- a/docs/content/2.guide/1.features.md
+++ b/docs/content/2.guide/1.features.md
@@ -88,117 +88,3 @@ Quick access to online development environments detected from package READMEs:
| :icon{name="i-lucide:pen-tool"} [CodePen](https://codepen.io) | Social development environment for front-end |
| :icon{name="i-simple-icons-jsfiddle"} [JSFiddle](https://jsfiddle.net) | Online editor for web snippets |
| :icon{name="i-simple-icons-replit"} [Replit](https://replit.com) | Collaborative browser-based IDE |
-
-### Custom badges
-
-You can add custom npmx badges to your markdown files using the following syntax:
-
-```md
-[](https://npmx.dev/package/YOUR_PACKAGE)
-```
-
-::tip
-Make sure to replace `TYPE` with one of the options listed below and `YOUR_PACKAGE` with the actual package name (e.g., `vue`, `lodash`, or `@nuxt/kit`).
-::
-
-#### Available Badge Types
-
-- **version**: Shows the latest or specific version of the package. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"}
-- **license**: Displays the package license (e.g., MIT, Apache-2.0). :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"}
-- **size**: Shows the install size (via Bundlephobia) or unpacked size. :img{src="https://img.shields.io/badge/%23a855f7-a855f7" class="inline align-middle h-5 w-14"}
-- **downloads**: Displays monthly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
-- **downloads-day**: Displays daily download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
-- **downloads-week**: Displays weekly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
-- **downloads-month**: Alias for monthly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
-- **downloads-year**: Displays yearly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
-- **vulnerabilities**: Shows the number of vulnerabilities found via OSV. :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%23ef4444-ef4444" class="inline align-middle h-5 w-14"}
-- **dependencies**: Lists the total count of package dependencies. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
-- **created**: Displays the date the package was first published. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
-- **updated**: Displays the date of the most recent modification. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
-- **engines**: Shows the supported Node.js version range. :img{src="https://img.shields.io/badge/%23eab308-eab308" class="inline align-middle h-5 w-14"}
-- **types**: Indicates if TypeScript types are included. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
-- **maintainers**: Displays the total count of package maintainers. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
-- **deprecated**: Shows if the package is active or deprecated. :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%23ef4444-ef4444" class="inline align-middle h-5 w-14"}
-- **quality**: NPMS.io quality score based on linting and tests. :img{src="https://img.shields.io/badge/%23a855f7-a855f7" class="inline align-middle h-5 w-14"}
-- **popularity**: NPMS.io popularity score based on downloads and stars. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
-- **maintenance**: NPMS.io maintenance score based on activity. :img{src="https://img.shields.io/badge/%23eab308-eab308" class="inline align-middle h-5 w-14"}
-- **score**: The overall NPMS.io combined score. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"}
-- **name**: Simple badge displaying the package name. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
-
-#### Examples
-
-```md
-# Version Badge
-
-[](https://npmx.dev/package/nuxt)
-
-# License Badge
-
-[](https://npmx.dev/package/vue)
-
-# Monthly Downloads
-
-[](https://npmx.dev/package/lodash)
-
-# Scoped Package (Install Size)
-
-[](https://npmx.dev/package/@nuxt/kit)
-
-# Specific Version
-
-[](https://npmx.dev/package/react)
-
-# Quality Score
-
-[](https://npmx.dev/package/pinia)
-```
-
-#### Customization Parameters
-
-You can further customize your badges by appending query parameters to the badge URL.
-
-##### `labelColor`
-
-Overrides the default label color. You can pass a standard hex code (with or without the `#` prefix). The label text color is automatically chosen (black or white) based on WCAG contrast ratio, so the badge remains readable.
-
-- **Default**: `#0a0a0a`
-- **Usage**: `?labelColor=HEX_CODE`
-
-##### `label`
-
-Overrides the default label text. You can pass any string to customize the label displayed on the badge.
-
-- **Default**: Depends on the badge type (e.g., "version", "downloads/mo").
-- **Usage**: `?label=YOUR_LABEL`
-
-##### `color`
-
-Overrides the default strategy color. You can pass a standard hex code (with or without the `#` prefix). The text color is automatically chosen (black or white) based on WCAG contrast ratio, so the badge remains readable.
-
-- **Default**: Depends on the badge type (e.g., version is blue, downloads are orange).
-- **Usage**: `?color=HEX_CODE`
-
-| Example | URL |
-| :------------- | :------------------------------------ |
-| **Hot Pink** | `.../badge/version/nuxt?color=ff69b4` |
-| **Pure Black** | `.../badge/version/nuxt?color=000000` |
-| **Brand Blue** | `.../badge/version/nuxt?color=3b82f6` |
-
-##### `name`
-
-When set to `true`, this parameter replaces the static category label (like "version" or "downloads/mo") with the actual name of the package. This is useful for brand-focused READMEs.
-
-- **Default**: `false`
-- **Usage**: `?name=true`
-
-| Type | Default Label | With `name=true` |
-| ------------- | -------------------- | ---------------- |
-| **Version** | `version \| 3.12.0` | `nuxt \| 3.12.0` |
-| **Downloads** | `downloads/mo \| 2M` | `lodash \| 2M` |
-
-##### `style`
-
-Overrides the default badge appearance. Pass `shieldsio` to use the shields.io-compatible style.
-
-- **Default**: `default`
-- **Usage**: `?style=shieldsio`
diff --git a/docs/content/2.guide/6.badges.md b/docs/content/2.guide/6.badges.md
new file mode 100644
index 0000000000..d068fecf95
--- /dev/null
+++ b/docs/content/2.guide/6.badges.md
@@ -0,0 +1,123 @@
+---
+title: Badges
+description: Generate modern markdown badges with the npmx.dev API
+navigation:
+ icon: i-lucide:badge
+---
+
+npmx.dev offers many different SVG badges with stats about any package via its API. You can get the Markdown code to display an accessible badge which links to the package URL on npmx.dev with the following interactive generator:
+
+:badge-generator
+
+## Available Badge Types
+
+- **version**: Shows the latest or specific version of the package. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"}
+- **license**: Displays the package license (e.g., MIT, Apache-2.0). :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"}
+- **size**: Shows the install size (via Bundlephobia) or unpacked size. :img{src="https://img.shields.io/badge/%23a855f7-a855f7" class="inline align-middle h-5 w-14"}
+- **downloads**: Displays monthly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
+- **downloads-day**: Displays daily download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
+- **downloads-week**: Displays weekly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
+- **downloads-month**: Alias for monthly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
+- **downloads-year**: Displays yearly download statistics. :img{src="https://img.shields.io/badge/%23f97316-f97316" class="inline align-middle h-5 w-14"}
+- **vulnerabilities**: Shows the number of vulnerabilities found via OSV. :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%23ef4444-ef4444" class="inline align-middle h-5 w-14"}
+- **dependencies**: Lists the total count of package dependencies. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
+- **created**: Displays the date the package was first published. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
+- **updated**: Displays the date of the most recent modification. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
+- **engines**: Shows the supported Node.js version range. :img{src="https://img.shields.io/badge/%23eab308-eab308" class="inline align-middle h-5 w-14"}
+- **types**: Indicates if TypeScript types are included. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
+- **maintainers**: Displays the total count of package maintainers. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
+- **deprecated**: Shows if the package is active or deprecated. :img{src="https://img.shields.io/badge/%2322c55e-22c55e" class="inline align-middle h-5 w-14"} / :img{src="https://img.shields.io/badge/%23ef4444-ef4444" class="inline align-middle h-5 w-14"}
+- **quality**: NPMS.io quality score based on linting and tests. :img{src="https://img.shields.io/badge/%23a855f7-a855f7" class="inline align-middle h-5 w-14"}
+- **popularity**: NPMS.io popularity score based on downloads and stars. :img{src="https://img.shields.io/badge/%2306b6d4-06b6d4" class="inline align-middle h-5 w-14"}
+- **maintenance**: NPMS.io maintenance score based on activity. :img{src="https://img.shields.io/badge/%23eab308-eab308" class="inline align-middle h-5 w-14"}
+- **score**: The overall NPMS.io combined score. :img{src="https://img.shields.io/badge/%233b82f6-3b82f6" class="inline align-middle h-5 w-14"}
+- **name**: Simple badge displaying the package name. :img{src="https://img.shields.io/badge/%2364748b-64748b" class="inline align-middle h-5 w-14"}
+
+## Examples
+
+```md
+# Version Badge
+
+[](https://npmx.dev/package/nuxt)
+
+# License Badge
+
+[](https://npmx.dev/package/vue)
+
+# Monthly Downloads
+
+[](https://npmx.dev/package/lodash)
+
+# Scoped Package (Install Size)
+
+[](https://npmx.dev/package/@nuxt/kit)
+
+# Specific Version
+
+[](https://npmx.dev/package/react)
+
+# Quality Score
+
+[](https://npmx.dev/package/pinia)
+```
+
+## Customization Parameters
+
+You can further customize your badges by appending query parameters to the badge URL.
+
+Use this generator to get the Markdown code you desire:
+
+:badge-generator-parameters
+
+### `label`
+
+Overrides the default label text. You can pass any string to customize the label displayed on the left half of the badge.
+
+- **Default**: Depends on the badge type (e.g., "version", "downloads/mo").
+- **Usage**: `?label=YOUR_LABEL`
+
+### `value`
+
+Overrides the default value text of the badge. You can pass any string to customize the value displayed on the right half of the badge.
+
+- **Default**: Calculated values depending on the badge type (e.g., "v4.2.0", "5.4M").
+- **Usage**: `?label=YOUR_LABEL`
+
+### `labelColor`
+
+Overrides the default label color. You can pass a standard hex code (with or without the `#` prefix). The label text color is automatically chosen (black or white) based on WCAG contrast ratio, so the badge remains readable.
+
+- **Default**: `#0a0a0a`
+- **Usage**: `?labelColor=HEX_CODE`
+
+### `color`
+
+Overrides the default strategy color. You can pass a standard hex code (with or without the `#` prefix). The text color is automatically chosen (black or white) based on WCAG contrast ratio, so the badge remains readable.
+
+- **Default**: Depends on the badge type (e.g., version is blue, downloads are orange).
+- **Usage**: `?color=HEX_CODE`
+
+| Example | URL |
+| :------------- | :------------------------------------ |
+| **Hot Pink** | `.../badge/version/nuxt?color=ff69b4` |
+| **Pure Black** | `.../badge/version/nuxt?color=000000` |
+| **Brand Blue** | `.../badge/version/nuxt?color=3b82f6` |
+
+### `name`
+
+When set to `true`, this parameter replaces the static category label (like "version" or "downloads/mo") with the actual name of the package. This is useful for brand-focused READMEs.
+
+- **Default**: `false`
+- **Usage**: `?name=true`
+
+| Type | Default Label | With `name=true` |
+| ------------- | -------------------- | ---------------- |
+| **Version** | `version \| 3.12.0` | `nuxt \| 3.12.0` |
+| **Downloads** | `downloads/mo \| 2M` | `lodash \| 2M` |
+
+### `style`
+
+Overrides the default badge appearance. Pass `shieldsio` to use the shields.io-compatible style.
+
+- **Default**: `default`
+- **Usage**: `?style=shieldsio`
diff --git a/docs/package.json b/docs/package.json
index f35be4560e..10773bfbe1 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -2,15 +2,15 @@
"name": "npmx-docs",
"private": true,
"description": "npmx public docs site",
+ "bugs": {
+ "url": "https://github.com/npmx-dev/npmx.dev/issues"
+ },
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/npmx-dev/npmx.dev.git",
"directory": "docs"
},
- "bugs": {
- "url": "https://github.com/npmx-dev/npmx.dev/issues"
- },
"scripts": {
"dev": "nuxt dev",
"build": "nuxt build",
@@ -20,10 +20,10 @@
},
"dependencies": {
"@nuxt/ui": "4.5.1",
- "@nuxtjs/mdc": "0.20.1",
- "better-sqlite3": "12.6.2",
- "docus": "5.7.0",
+ "@nuxtjs/mdc": "0.20.2",
+ "better-sqlite3": "12.8.0",
+ "docus": "5.8.1",
"nuxt": "4.3.1",
- "tailwindcss": "4.2.1"
+ "tailwindcss": "4.2.2"
}
}
diff --git a/docs/shared/utils/badges.ts b/docs/shared/utils/badges.ts
new file mode 100644
index 0000000000..c9152c0fad
--- /dev/null
+++ b/docs/shared/utils/badges.ts
@@ -0,0 +1,32 @@
+export const BADGE_TYPES = Object.freeze([
+ 'version',
+ 'license',
+ 'size',
+ 'downloads',
+ 'downloads-day',
+ 'downloads-week',
+ 'downloads-month',
+ 'downloads-year',
+ 'vulnerabilities',
+ 'dependencies',
+ 'created',
+ 'updated',
+ 'engines',
+ 'types',
+ 'maintainers',
+ 'deprecated',
+ 'quality',
+ 'popularity',
+ 'maintenance',
+ 'score',
+ 'name',
+] as const)
+
+export type BadgeType = (typeof BADGE_TYPES)[number]
+
+export function titleCase(str: string) {
+ return str
+ .split('-')
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
+ .join(' per ')
+}
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 0000000000..307b2134b9
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ // https://nuxt.com/docs/guide/concepts/typescript
+ "files": [],
+ "references": [
+ {
+ "path": "./.nuxt/tsconfig.app.json"
+ },
+ {
+ "path": "./.nuxt/tsconfig.server.json"
+ },
+ {
+ "path": "./.nuxt/tsconfig.shared.json"
+ },
+ {
+ "path": "./.nuxt/tsconfig.node.json"
+ }
+ ]
+}
diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json
index 0f564fc8b7..c046ade81d 100644
--- a/i18n/locales/ar.json
+++ b/i18n/locales/ar.json
@@ -105,10 +105,14 @@
"theme_system": "ุณู
ุฉ ุงููุธุงู
",
"language": "ุงููุบุฉ",
"help_translate": "ุณุงูู
ูู ุชุฑุฌู
ุฉ npmx",
- "accent_colors": "ุฃููุงู ุงูู
ููุน",
+ "accent_colors": {
+ "label": "ุฃููุงู ุงูู
ููุน"
+ },
"clear_accent": "ู
ุณุญ ููู ุงูุชู
ููุฒ",
"translation_progress": "ุชูุฏู
ุงูุชุฑุฌู
ุฉ",
- "background_themes": "ุฏุฑุฌุฉ ุฎูููุฉ ุงูุตูุญุฉ"
+ "background_themes": {
+ "label": "ุฏุฑุฌุฉ ุฎูููุฉ ุงูุตูุญุฉ"
+ }
},
"i18n": {
"missing_keys": "{count} ุชุฑุฌู
ุงุช ู
ูููุฏุฉ | ุชุฑุฌู
ุฉ ูุงุญุฏุฉ ู
ูููุฏุฉ | ุชุฑุฌู
ุชุงู ู
ูููุฏุชุงู | {count} ุชุฑุฌู
ุงุช ู
ูููุฏุฉ | {count} ุชุฑุฌู
ุฉ ู
ูููุฏุฉ | {count} ุชุฑุฌู
ุฉ ู
ูููุฏุฉ",
diff --git a/i18n/locales/az-AZ.json b/i18n/locales/az-AZ.json
index aae98eeef1..e6709653e9 100644
--- a/i18n/locales/az-AZ.json
+++ b/i18n/locales/az-AZ.json
@@ -107,7 +107,7 @@
"reply_count": "{count} cavab",
"like_count": "{count} bษyษnmษ",
"repost_count": "{count} yenidษn paylaลฤฑm",
- "more_replies": "{count} cavab daha..."
+ "more_replies": "daha {count} cavab... | daha {count} cavab..."
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "Sistem",
"language": "Dil",
"help_translate": "npmx-i tษrcรผmษ etmษyษ kรถmษk edin",
- "accent_colors": "Vurฤu rษnglษri",
+ "accent_colors": {
+ "label": "Vurฤu rษnglษri"
+ },
"clear_accent": "Vurฤu rษngini tษmizlษ",
"translation_progress": "Tษrcรผmษ irษlilษyiลi",
- "background_themes": "Fon tonu",
+ "background_themes": {
+ "label": "Fon tonu"
+ },
"keyboard_shortcuts_enabled": "Klaviatura qฤฑsayollarฤฑnฤฑ aktivlษลdir",
"keyboard_shortcuts_enabled_description": "Klaviatura qฤฑsayollarฤฑ digษr brauzer vษ ya sistem qฤฑsayollarฤฑ ilษ toqquลarsa deaktiv edilษ bilษr"
},
diff --git a/i18n/locales/bg-BG.json b/i18n/locales/bg-BG.json
index b633cc5d66..e1306999ac 100644
--- a/i18n/locales/bg-BG.json
+++ b/i18n/locales/bg-BG.json
@@ -111,10 +111,14 @@
"theme_system": "ะกะธััะตะผะฝะฐ",
"language": "ะะทะธะบ",
"help_translate": "ะะพะผะพะณะฝะตัะต ะดะฐ ะฟัะตะฒะตะดะตะผ npmx",
- "accent_colors": "ะะบัะตะฝัะฝะธ ัะฒะตัะพะฒะต",
+ "accent_colors": {
+ "label": "ะะบัะตะฝัะฝะธ ัะฒะตัะพะฒะต"
+ },
"clear_accent": "ะะทัะธััะฒะฐะฝะต ะฝะฐ ะฐะบัะตะฝัะตะฝ ัะฒัั",
"translation_progress": "ะะฐะฟัะตะดัะบ ะฝะฐ ะฟัะตะฒะพะดะฐ",
- "background_themes": "ะคะพะฝะพะฒ ะฝัะฐะฝั",
+ "background_themes": {
+ "label": "ะคะพะฝะพะฒ ะฝัะฐะฝั"
+ },
"keyboard_shortcuts_enabled": "ะะบัะธะฒะธัะฐะฝะต ะฝะฐ ะบะปะฐะฒะธัะฝะธ ะบะพะผะฑะธะฝะฐัะธะธ",
"keyboard_shortcuts_enabled_description": "ะะปะฐะฒะธัะฝะธัะต ะบะพะผะฑะธะฝะฐัะธะธ ะผะพะณะฐั ะดะฐ ะฑัะดะฐั ะดะตะฐะบัะธะฒะธัะฐะฝะธ, ะฐะบะพ ะฒะปะธะทะฐั ะฒ ะบะพะฝัะปะธะบั ั ะดััะณะธ ะฑัะฐัะทััะฝะธ ะธะปะธ ัะธััะตะผะฝะธ ะฟัะตะบะธ ะฟััะธัะฐ"
},
diff --git a/i18n/locales/bn-IN.json b/i18n/locales/bn-IN.json
index 9118c95d8e..530394cbc5 100644
--- a/i18n/locales/bn-IN.json
+++ b/i18n/locales/bn-IN.json
@@ -74,7 +74,9 @@
"theme_system": "เฆธเฆฟเฆธเงเฆเงเฆฎ",
"language": "เฆญเฆพเฆทเฆพ",
"help_translate": "npmx เฆ
เฆจเงเฆฌเฆพเฆฆเง เฆธเฆพเฆนเฆพเฆฏเงเฆฏ เฆเฆฐเงเฆจ",
- "accent_colors": "เฆเฆเงเฆธเงเฆจเงเฆ เฆฐเฆ",
+ "accent_colors": {
+ "label": "เฆเฆเงเฆธเงเฆจเงเฆ เฆฐเฆ"
+ },
"clear_accent": "เฆเฆเงเฆธเงเฆจเงเฆ เฆฐเฆ เฆธเฆพเฆซ เฆเฆฐเงเฆจ",
"translation_progress": "เฆ
เฆจเงเฆฌเฆพเฆฆเงเฆฐ เฆ
เฆเงเฆฐเฆเฆคเฆฟ"
},
diff --git a/i18n/locales/cs-CZ.json b/i18n/locales/cs-CZ.json
index 83a47443ad..fe06406e56 100644
--- a/i18n/locales/cs-CZ.json
+++ b/i18n/locales/cs-CZ.json
@@ -107,7 +107,7 @@
"reply_count": "{count} odpovฤฤ | {count} odpovฤdi | {count} odpovฤdรญ",
"like_count": "{count} lajk | {count} lajky | {count} lajkลฏ",
"repost_count": "{count} repost | {count} reposty | {count} repostลฏ",
- "more_replies": "{count} dalลกรญ odpovฤฤ ... | {count} dalลกรญ odpovฤdi ... | {count} dalลกรญch odpovฤdรญ ..."
+ "more_replies": "jeลกtฤ {count} odpovฤฤโฆ | jeลกtฤ {count} odpovฤdiโฆ | jeลกtฤ {count} odpovฤdรญโฆ"
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "Systรฉmovรฉ",
"language": "Jazyk",
"help_translate": "Pomozte pลeloลพit npmx",
- "accent_colors": "Barvy akcentu",
+ "accent_colors": {
+ "label": "Barvy akcentu"
+ },
"clear_accent": "Vymazat barvu akcentu",
"translation_progress": "Pokrok pลekladu",
- "background_themes": "Odstรญn pozadรญ",
+ "background_themes": {
+ "label": "Odstรญn pozadรญ"
+ },
"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"
},
diff --git a/i18n/locales/de-DE.json b/i18n/locales/de-DE.json
index dfe3e2588c..83503c1030 100644
--- a/i18n/locales/de-DE.json
+++ b/i18n/locales/de-DE.json
@@ -107,7 +107,7 @@
"reply_count": "{count} Antwort | {count} Antworten",
"like_count": "{count} Like | {count} Likes",
"repost_count": "{count} Repost | {count} Reposts",
- "more_replies": "{count} weitere Antwort anzeigen | {count} weitere Antworten anzeigen"
+ "more_replies": "noch {count} Antwortโฆ | noch {count} Antwortenโฆ"
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "System",
"language": "Sprache",
"help_translate": "Hilf bei der รbersetzung von npmx",
- "accent_colors": "Akzentfarben",
+ "accent_colors": {
+ "label": "Akzentfarben"
+ },
"clear_accent": "Akzentfarbe zurรผcksetzen",
"translation_progress": "รbersetzungsfortschritt",
- "background_themes": "Hintergrundschattierung",
+ "background_themes": {
+ "label": "Hintergrundschattierung"
+ },
"keyboard_shortcuts_enabled": "Tastenkombinationen aktivieren",
"keyboard_shortcuts_enabled_description": "Tastenkombinationen kรถnnen deaktiviert werden, wenn sie mit anderen Browser- oder Systemkรผrzeln in Konflikt stehen"
},
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 549bc2c305..604333f944 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -96,6 +96,7 @@
},
"draft_badge": "Draft",
"draft_banner": "This is an unpublished draft. It may be incomplete or contain inaccuracies.",
+ "no_posts": "No posts found.",
"atproto": {
"view_on_bluesky": "View on Bluesky",
"reply_on_bluesky": "Reply on Bluesky",
@@ -138,16 +139,34 @@
"include_types_description": "Add {'@'}types package to install commands for untyped packages",
"hide_platform_packages": "Hide platform-specific packages in search",
"hide_platform_packages_description": "Hide native binary packages like {'@'}esbuild/linux-x64 from results",
+ "enable_graph_pulse_loop": "Enable looping of pulse effect on mini graph",
+ "enable_graph_pulse_loop_description": "Activate a continuous pulse animation on the weekly download graph. This animation may be distracting for some users.",
"theme": "Theme",
"theme_light": "Light",
"theme_dark": "Dark",
"theme_system": "System",
"language": "Language",
"help_translate": "Help translate npmx",
- "accent_colors": "Accent colors",
+ "translation_status": "Check global translation status",
+ "accent_colors": {
+ "label": "Accent colors",
+ "sky": "Sky",
+ "coral": "Coral",
+ "amber": "Amber",
+ "emerald": "Emerald",
+ "violet": "Violet",
+ "magenta": "Magenta"
+ },
"clear_accent": "Clear accent color",
"translation_progress": "Translation progress",
- "background_themes": "Background shade",
+ "background_themes": {
+ "label": "Background shade",
+ "neutral": "Neutral",
+ "stone": "Stone",
+ "zinc": "Zinc",
+ "slate": "Slate",
+ "black": "Black"
+ },
"keyboard_shortcuts_enabled": "Enable keyboard shortcuts",
"keyboard_shortcuts_enabled_description": "Keyboard shortcuts can be disabled if they conflict with other browser or system shortcuts"
},
@@ -205,7 +224,9 @@
"radicle": "View on Radicle",
"sourcehut": "View on SourceHut",
"tangled": "View on Tangled"
- }
+ },
+ "collapse": "Collapse",
+ "expand": "Expand"
},
"profile": {
"display_name": "Display Name",
@@ -284,7 +305,8 @@
"refs": "{count} ref | {count} refs",
"assets": "{count} asset | {count} assets"
},
- "view_source": "View source"
+ "view_source": "View source",
+ "skills_cli": "skills CLI"
},
"links": {
"main": "main",
@@ -302,8 +324,15 @@
"unlike": "Unlike this package"
},
"docs": {
+ "contents": "Contents",
+ "default_not_available": "Docs are not available for this version.",
"not_available": "Docs not available",
- "not_available_detail": "We could not generate docs for this version."
+ "not_available_detail": "We could not generate docs for this version.",
+ "page_title": "API Docs - npmx",
+ "page_title_name": "{name} docs - npmx",
+ "page_title_version": "{name} docs - npmx",
+ "og_title": "{name} - Docs",
+ "view_package": "View package"
},
"get_started": {
"title": "Get started",
@@ -363,7 +392,9 @@
"published": "Published",
"weekly_downloads": "Weekly downloads",
"keywords": "Keywords",
- "license": "License"
+ "license": "License",
+ "select": "Select package",
+ "select_maximum": "Maximum {count} packages can be selected"
},
"versions": {
"title": "Versions",
@@ -378,6 +409,7 @@
"all_covered": "All versions are covered by tags above",
"deprecated_title": "{version} (deprecated)",
"view_all": "View {count} version | View all {count} versions",
+ "view_all_versions": "View all versions",
"distribution_title": "Semver Group",
"distribution_modal_title": "Versions",
"distribution_range_date_same_year": "from {from} to {to}, {endYear}",
@@ -385,9 +417,11 @@
"grouping_major": "Major",
"grouping_minor": "Minor",
"grouping_versions_title": "Versions",
+ "grouping_versions_about": "About version grouping",
"grouping_versions_all": "All",
"grouping_versions_only_recent": "Only recent",
"grouping_usage_title": "Usage",
+ "grouping_usage_about": "About usage grouping",
"grouping_usage_all": "All",
"grouping_usage_most_used": "Most used",
"recent_versions_only_tooltip": "Show only versions published within the last year.",
@@ -402,7 +436,12 @@
"copy_alt": {
"per_version_analysis": "{version} version was downloaded {downloads} times",
"general_description": "Bar chart showing per-version downloads for {versions_count} {semver_grouping_mode} versions of the {package_name} package, {date_range_label} from the {first_version} version to the {last_version} version. The most downloaded version is {max_downloaded_version} with {max_version_downloads} downloads. {per_version_analysis}. {watermark}."
- }
+ },
+ "page_title": "Version History",
+ "current_tags": "Current Tags",
+ "version_filter_placeholder": "Filter versionsโฆ",
+ "version_filter_label": "Filter versions",
+ "no_match_filter": "No versions match {filter}"
},
"dependencies": {
"title": "Dependency ({count}) | Dependencies ({count})",
@@ -413,7 +452,8 @@
"outdated_major": "{count} major version behind (latest: {latest}) | {count} major versions behind (latest: {latest})",
"outdated_minor": "{count} minor version behind (latest: {latest}) | {count} minor versions behind (latest: {latest})",
"outdated_patch": "Patch update available (latest: {latest})",
- "has_replacement": "This dependency has suggested replacements"
+ "has_replacement": "This dependency has suggested replacements",
+ "vulnerabilities_count": "{count} vulnerability | {count} vulnerabilities"
},
"peer_dependencies": {
"title": "Peer Dependency ({count}) | Peer Dependencies ({count})",
@@ -437,7 +477,8 @@
"cancel_add": "Cancel adding owner",
"add_owner": "+ Add owner",
"show_more": "(show {count} more)",
- "show_less": "(show fewer)"
+ "show_less": "(show fewer)",
+ "maintainer_template": "{avatar} {char126}{name}"
},
"trends": {
"granularity": "Granularity",
@@ -513,11 +554,12 @@
"metrics": {
"esm": "ES Modules supported",
"cjs": "CommonJS supported",
- "no_esm": "No ES Modules support",
+ "no_esm": "ES Modules unsupported",
+ "wasm": "Has WebAssembly",
"types_label": "Types",
"types_included": "Types included",
"types_available": "Types available via {package}",
- "no_types": "No TypeScript types"
+ "no_types": "No types"
},
"license": {
"view_spdx": "View license text on SPDX",
@@ -855,6 +897,8 @@
"secure": "Without warnings",
"insecure": "With warnings"
},
+ "view_selected": "View selected",
+ "clear_selected_label": "Clear selected",
"sort": {
"label": "Sort packages",
"toggle_direction": "Toggle sort direction",
@@ -888,7 +932,8 @@
"popularity_score": "Popularity score",
"maintenance_score": "Maintenance score",
"combined_score": "Combined score",
- "security": "Security"
+ "security": "Security",
+ "selection": "Select package"
},
"view_mode": {
"label": "View mode",
@@ -920,19 +965,19 @@
"about": {
"title": "About",
"heading": "about",
- "meta_description": "npmx is a fast, modern browser for the npm registry. A better UX/DX for exploring npm packages.",
+ "meta_description": "npmx is a fast, modern browser for the npm registry. A great UX/DX for exploring npm packages.",
"what_we_are": {
"title": "What we are",
- "better_ux_dx": "better UX/DX",
+ "better_ux_dx": "great UX/DX",
"admin_ui": "admin UI",
- "description": "npmx is a {betterUxDx} for the npm package registry and tooling. We provide a fast, modern interface for exploring packages, with features like dark mode, keyboard navigation, code browsing, and connections to alternative registries like {jsr}.",
- "admin_description": "We also aim to provide a better {adminUi} for managing your packages, teams, and organizations โ all from the browser, powered by your local npm CLI."
+ "description": "npmx is a {betterUxDx} for the npm package registry and tooling. We strive to provide a fast, modern interface for exploring packages, with features like dark mode, keyboard navigation, code browsing, and connections to alternative registries like {jsr}.",
+ "admin_description": "We also aim to provide a great {adminUi} for managing your packages, teams, and organizations โ all from the browser, powered by your local npm CLI."
},
"what_we_are_not": {
"title": "What we're not",
"not_package_manager": "Not a package manager.",
"not_registry": "Not a registry.",
- "registry_description": "We don't host packages. We're just a better way to browse them.",
+ "registry_description": "We don't host packages. We're just a fast, modern way to browse them.",
"package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.",
"words": {
"already": "There are",
@@ -969,7 +1014,7 @@
"title": "Get involved",
"contribute": {
"title": "Contribute",
- "description": "Help us build a better npm experience.",
+ "description": "Help us build the npm experience we all want.",
"cta": "View on GitHub"
},
"community": {
@@ -1035,7 +1080,8 @@
"error": "Failed to load organizations",
"empty": "No organizations found",
"view_all": "View all"
- }
+ },
+ "pr": "Open GitHub pull request #{prNumber}"
},
"compare": {
"packages": {
@@ -1166,6 +1212,14 @@
"file_size_warning": "{size} exceeds the 250KB limit for comparison",
"compare_versions": "diff",
"compare_versions_title": "Compare with latest version",
+ "comparing_versions_label": "Comparing versions...",
+ "version_back_to_package": "Back to package",
+ "version_error_message": "Failed to compare versions.",
+ "version_invalid_url_format": {
+ "hint": "Invalid comparison URL. Use format: {0}",
+ "from_version": "from",
+ "to_version": "to"
+ },
"version_selector_title": "Compare with version",
"summary": "Summary",
"deps_count": "{count} dep | {count} deps",
@@ -1192,7 +1246,18 @@
"files_button": "Files",
"select_file_prompt": "Select a file from the sidebar to view its diff",
"close_files_panel": "Close files panel",
- "filter_files_label": "Filter files by change type"
+ "filter_files_label": "Filter files by change type",
+ "change_ratio": "Change ratio",
+ "char_edits": "Char edits",
+ "diff_distance": "Diff distance",
+ "loading_diff": "Loading diff...",
+ "loading_diff_error": "Failed to load diff",
+ "merge_modified_lines": "Merge modified lines",
+ "no_content_changes": "No content changes detected",
+ "options": "Options",
+ "view_file": "View file",
+ "view_in_code_browser": "View in code browser",
+ "word_wrap": "Word wrap"
},
"pds": {
"title": "npmx.social",
@@ -1332,6 +1397,29 @@
"link": "GitHub repository"
}
},
+ "translation_status": {
+ "title": "translation status",
+ "generated_at": "Generation date: {date}",
+ "welcome": "If you're interested in helping us to translate {npmx} into one of the languages listed below, you've come to the right place! This auto-updating page always lists all the content that could use your help right now.",
+ "p1": "We use {lang} as the default language, with a total of {count}. If you'd like to help add translations, locate the language in {bylang} and expand the details.",
+ "p1_lang": "American English (en-US)",
+ "p1_count": "0 messages | 1 message |{count} messages",
+ "p2": "Before starting, please read our {guide} to learn about our translation process and how you can get involved.",
+ "guide": "localization (i18n) guide",
+ "by_locale": "Translation progress by locale",
+ "by_file": "Translation progress by file",
+ "complete_text": "This translation is complete, amazing job!",
+ "missing_text": "missing",
+ "missing_keys": "There is no missing translations | Missing translation | Missing translations",
+ "progress_label": "Progress status for {locale}",
+ "table": {
+ "file": "File",
+ "status": "Status",
+ "error": "Error while loading file list.",
+ "empty": "No files found",
+ "file_link": "Edit {file} ({lang}) on GitHub"
+ }
+ },
"vacations": {
"title": "on vacation",
"meta_description": "The npmx team was recharging. Discord reopened after a week.",
@@ -1365,5 +1453,11 @@
"all": "all"
}
}
+ },
+ "action_bar": {
+ "title": "action bar",
+ "selection": "0 selected | 1 selected | {count} selected",
+ "shortcut": "Press \"{key}\" to focus actions",
+ "button_close_aria_label": "Close action bar"
}
}
diff --git a/i18n/locales/es.json b/i18n/locales/es.json
index 72995686a9..c3ab2a0e45 100644
--- a/i18n/locales/es.json
+++ b/i18n/locales/es.json
@@ -144,10 +144,14 @@
"theme_system": "Sistema",
"language": "Idioma",
"help_translate": "Ayuda a traducir npmx",
- "accent_colors": "Colores de acento",
+ "accent_colors": {
+ "label": "Colores de acento"
+ },
"clear_accent": "Limpiar color de acento",
"translation_progress": "Progreso de traducciรณn",
- "background_themes": "Tema de fondo",
+ "background_themes": {
+ "label": "Tema de fondo"
+ },
"keyboard_shortcuts_enabled": "Activar atajos de teclado",
"keyboard_shortcuts_enabled_description": "Los atajos de teclado pueden desactivarse si entran en conflicto con otros atajos del navegador o del sistema"
},
diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json
index e8c3385e53..8b1aca9b6c 100644
--- a/i18n/locales/fr-FR.json
+++ b/i18n/locales/fr-FR.json
@@ -107,7 +107,7 @@
"reply_count": "{count} rรฉponse | {count} rรฉponses",
"like_count": "{count} j'aime | {count} j'aime",
"repost_count": "{count} repartage | {count} repartages",
- "more_replies": "{count} rรฉponse de plus... | {count} rรฉponses de plus..."
+ "more_replies": "{count} rรฉponse supplรฉmentaire... | {count} rรฉponses supplรฉmentaires..."
}
},
"settings": {
@@ -142,10 +142,25 @@
"theme_system": "Systรจme",
"language": "Langue de l'interface",
"help_translate": "Aidez-nous ร traduire npmx",
- "accent_colors": "Couleurs d'accentuation",
+ "accent_colors": {
+ "label": "Couleurs d'accentuation",
+ "sky": "Ciel",
+ "coral": "Corail",
+ "amber": "Ambre",
+ "emerald": "รmeraude",
+ "violet": "Violet",
+ "magenta": "Magenta"
+ },
"clear_accent": "Supprimer la couleur d'accentuation",
"translation_progress": "Progression de la traduction",
- "background_themes": "Teinte de fond",
+ "background_themes": {
+ "label": "Teinte de fond",
+ "neutral": "Neutre",
+ "stone": "Pierre",
+ "zinc": "Zinc",
+ "slate": "Ardoise",
+ "black": "Noir"
+ },
"keyboard_shortcuts_enabled": "Activer les raccourcis clavier",
"keyboard_shortcuts_enabled_description": "Les raccourcis clavier peuvent รชtre dรฉsactivรฉs s'ils entrent en conflit avec d'autres raccourcis du navigateur ou du systรจme"
},
@@ -289,8 +304,15 @@
"unlike": "Retirer le like"
},
"docs": {
+ "contents": "Sommaire",
+ "default_not_available": "La documentation n'est pas disponible pour cette version.",
"not_available": "Documentation non disponible",
- "not_available_detail": "Nous n'avons pas pu gรฉnรฉrer la documentation pour cette version."
+ "not_available_detail": "Nous n'avons pas pu gรฉnรฉrer la documentation pour cette version.",
+ "page_title": "Documentation API - npmx",
+ "page_title_name": "Documentation {name} - npmx",
+ "page_title_version": "Documentation {name} - npmx",
+ "og_title": "{name} - Documentation",
+ "view_package": "Voir le paquet"
},
"get_started": {
"title": "Commencer",
@@ -903,19 +925,19 @@
"about": {
"title": "ร propos",
"heading": "ร propos",
- "meta_description": "npmx est un navigateur rapide et moderne pour le registre npm. Une meilleure UX/DX pour explorer les paquets npm.",
+ "meta_description": "npmx est un navigateur rapide et moderne pour le registre npm. Une excellente UX/DX pour explorer les paquets npm.",
"what_we_are": {
"title": "Ce que nous sommes",
- "better_ux_dx": "meilleure UX/DX",
+ "better_ux_dx": "excellente UX/DX",
"admin_ui": "interface d'administration",
"description": "npmx est une {betterUxDx} pour le registre npm et ses outils. Nous fournissons une interface rapide et moderne pour explorer les paquets, avec des fonctionnalitรฉs comme le mode sombre, la navigation au clavier, la visualisation du code, et des connexions ร des registres alternatifs comme {jsr}.",
- "admin_description": "Nous visons รฉgalement ร fournir une meilleure {adminUi} pour gรฉrer vos paquets, รฉquipes et organisations โ le tout depuis le navigateur, alimentรฉ par votre CLI npm local."
+ "admin_description": "Nous visons รฉgalement ร fournir une excellente {adminUi} pour gรฉrer vos paquets, รฉquipes et organisations โ le tout depuis le navigateur, alimentรฉ par votre CLI npm local."
},
"what_we_are_not": {
"title": "Ce que nous ne sommes pas",
"not_package_manager": "Nous ne sommes pas un gestionnaire de paquets.",
"not_registry": "Nous ne sommes pas un registre.",
- "registry_description": "Nous n'hรฉbergeons pas de paquets. Nous sommes juste une meilleure faรงon de les explorer.",
+ "registry_description": "Nous n'hรฉbergeons pas de paquets. Nous sommes une faรงon rapide et moderne de les explorer.",
"package_managers_exist": "{already} {people} {building} {managers} {package} {really} {cool}.",
"words": {
"already": "Il y a",
@@ -952,7 +974,7 @@
"title": "Participer",
"contribute": {
"title": "Contribuer",
- "description": "Aidez-nous ร crรฉer une meilleure expรฉrience npm.",
+ "description": "Aidez-nous ร crรฉer l'expรฉrience npm que nous voulons tous.",
"cta": "Voir sur GitHub"
},
"community": {
diff --git a/i18n/locales/hi-IN.json b/i18n/locales/hi-IN.json
index 6840614575..63f832c7fc 100644
--- a/i18n/locales/hi-IN.json
+++ b/i18n/locales/hi-IN.json
@@ -75,7 +75,9 @@
"theme_system": "เคธเคฟเคธเฅเคเคฎ",
"language": "เคญเคพเคทเคพ",
"help_translate": "npmx เคเคพ เค
เคจเฅเคตเคพเคฆ เคเคฐเคจเฅ เคฎเฅเค เคฎเคฆเคฆ เคเคฐเฅเค",
- "accent_colors": "เคเคเฅเคธเฅเคเค เคฐเคเค",
+ "accent_colors": {
+ "label": "เคเคเฅเคธเฅเคเค เคฐเคเค"
+ },
"clear_accent": "เคเคเฅเคธเฅเคเค เคฐเคเค เคธเคพเคซเคผ เคเคฐเฅเค",
"translation_progress": "เค
เคจเฅเคตเคพเคฆ เคชเฅเคฐเคเคคเคฟ"
},
diff --git a/i18n/locales/hu-HU.json b/i18n/locales/hu-HU.json
index 8040f4d48d..ed65c307ea 100644
--- a/i18n/locales/hu-HU.json
+++ b/i18n/locales/hu-HU.json
@@ -111,10 +111,14 @@
"theme_system": "Rendszer",
"language": "Nyelv",
"help_translate": "Segรญts lefordรญtani az npmx-et",
- "accent_colors": "Akcentus szรญnek",
+ "accent_colors": {
+ "label": "Akcentus szรญnek"
+ },
"clear_accent": "Akcentus szรญn tรถrlรฉse",
"translation_progress": "Fordรญtรกs รกllapota",
- "background_themes": "Hรกttรฉr รกrnyalata",
+ "background_themes": {
+ "label": "Hรกttรฉr รกrnyalata"
+ },
"keyboard_shortcuts_enabled": "Billentyลฑzet parancsikonok engedรฉlyezรฉse",
"keyboard_shortcuts_enabled_description": "A billentyลฑzet parancsikonok letilthatรณk, ha รผtkรถznek mรกs bรถngรฉszล vagy rendszer parancsikonokkal"
},
diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json
index 0f13dd00e5..faa4c332fe 100644
--- a/i18n/locales/id-ID.json
+++ b/i18n/locales/id-ID.json
@@ -109,7 +109,7 @@
"reply_count": "{count} balasan | {count} balasan",
"like_count": "{count} suka | {count} suka",
"repost_count": "{count} repost | {count} repost",
- "more_replies": "{count} balasan lainnya... | {count} balasan lainnya..."
+ "more_replies": "{count} balasan lagi... | {count} balasan lagi..."
}
},
"settings": {
@@ -144,10 +144,14 @@
"theme_system": "Sistem",
"language": "Bahasa",
"help_translate": "Bantu terjemahkan npmx",
- "accent_colors": "Warna aksen",
+ "accent_colors": {
+ "label": "Warna aksen"
+ },
"clear_accent": "Hapus warna aksen",
"translation_progress": "Progres terjemahan",
- "background_themes": "Warna latar belakang",
+ "background_themes": {
+ "label": "Warna latar belakang"
+ },
"keyboard_shortcuts_enabled": "Aktifkan pintasan papan ketik",
"keyboard_shortcuts_enabled_description": "Pintasan papan ketik dapat dinonaktifkan jika bertentangan dengan pintasan peramban atau sistem lainnya."
},
diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json
index 52c6f8d235..ec6e221918 100644
--- a/i18n/locales/it-IT.json
+++ b/i18n/locales/it-IT.json
@@ -105,10 +105,14 @@
"theme_system": "Sistema",
"language": "Lingua",
"help_translate": "Aiuta a tradurre npmx",
- "accent_colors": "Colori di accento",
+ "accent_colors": {
+ "label": "Colori di accento"
+ },
"clear_accent": "Cancella colore di accento",
"translation_progress": "Progresso della traduzione",
- "background_themes": "Sfumatura di sfondo"
+ "background_themes": {
+ "label": "Sfumatura di sfondo"
+ }
},
"i18n": {
"missing_keys": "{count} chiave mancante | {count} chiavi mancanti",
@@ -145,6 +149,9 @@
"github": "Vedi su GitHub"
}
},
+ "profile": {
+ "invite": {}
+ },
"package": {
"not_found": "Pacchetto Non Trovato",
"not_found_message": "Impossibile trovare il pacchetto.",
@@ -229,9 +236,9 @@
"title": "Inizia",
"pm_label": "Gestore di pacchetti",
"copy_command": "Copia comando di installazione",
- "view_types": "Vedi {package}",
"copy_dev_command": "Copia comando di installazione dev",
- "dev_dependency_hint": "Di solito installato come dev dependency"
+ "dev_dependency_hint": "Di solito installato come dev dependency",
+ "view_types": "Vedi {package}"
},
"create": {
"title": "Crea nuovo progetto",
@@ -297,7 +304,8 @@
"more_tagged": "{count} altri taggati",
"all_covered": "Tutte le versioni sono coperte dai tag sopra",
"deprecated_title": "{version} (deprecato)",
- "view_all": "Visualizza {count} versione | Visualizza tutte le {count} versioni"
+ "view_all": "Visualizza {count} versione | Visualizza tutte le {count} versioni",
+ "copy_alt": {}
},
"dependencies": {
"title": "Dipendenza ({count}) | Dipendenze ({count})",
@@ -351,7 +359,8 @@
"y_axis_label": "{granularity} {facet}",
"items": {
"downloads": "Download"
- }
+ },
+ "copy_alt": {}
},
"downloads": {
"title": "Download settimanali",
@@ -794,6 +803,8 @@
"managers": "gestori di pacchetti"
}
},
+ "sponsors": {},
+ "oss_partners": {},
"team": {},
"contributors": {
"title": "{count} Collaboratore | {count} Collaboratori",
@@ -984,7 +995,9 @@
"up_to_you": "A tua scelta!"
},
"trends": {}
- }
+ },
+ "file_filter_option": {},
+ "filter": {}
},
"privacy_policy": {
"title": "Informativa sulla privacy",
@@ -1071,5 +1084,6 @@
"measures": {},
"limitations": {},
"contact": {}
- }
+ },
+ "action_bar": {}
}
diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json
index a63e8f8343..b876175b49 100644
--- a/i18n/locales/ja-JP.json
+++ b/i18n/locales/ja-JP.json
@@ -107,7 +107,7 @@
"reply_count": "{count} ไปถใฎ่ฟไฟก",
"like_count": "{count} ไปถใฎใใใญ",
"repost_count": "{count} ไปถใฎใชใในใ",
- "more_replies": "ใใใซ {count} ไปถใฎใชใใฉใคใ่กจ็คบ..."
+ "more_replies": "ใใใซ{count}ไปถใฎ่ฟไฟกโฆ"
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "ใทในใใ ",
"language": "่จ่ช",
"help_translate": "npmxใฎ็ฟป่จณใซๅๅใใ",
- "accent_colors": "ใขใฏใปใณใใซใฉใผ",
+ "accent_colors": {
+ "label": "ใขใฏใปใณใใซใฉใผ"
+ },
"clear_accent": "ใขใฏใปใณใใซใฉใผใใฏใชใข",
"translation_progress": "็ฟป่จณใฎ้ฒๆ็ถๆณ",
- "background_themes": "่ๆฏใทใงใผใ",
+ "background_themes": {
+ "label": "่ๆฏใทใงใผใ"
+ },
"keyboard_shortcuts_enabled": "ใญใผใใผใใทใงใผใใซใใใๆๅนๅ",
"keyboard_shortcuts_enabled_description": "ใใฉใฆใถใใทในใใ ใฎใทใงใผใใซใใใจ็ซถๅใใๅ ดๅใใญใผใใผใใทใงใผใใซใใใ็กๅนๅใงใใพใ"
},
diff --git a/i18n/locales/kn-IN.json b/i18n/locales/kn-IN.json
index 51b8302df6..5786e6a53c 100644
--- a/i18n/locales/kn-IN.json
+++ b/i18n/locales/kn-IN.json
@@ -75,7 +75,9 @@
"theme_system": "เฒธเฒฟเฒธเณเฒเฒฎเณ",
"language": "เฒญเฒพเฒทเณ",
"help_translate": "npmx เฒ
เฒจเณเฒตเฒพเฒฆเฒเณเฒเณ เฒธเฒนเฒพเฒฏ เฒฎเฒพเฒกเฒฟ",
- "accent_colors": "เฒ
เฒเณเฒธเณเฒเฒเณ เฒฌเฒฃเณเฒฃเฒเฒณเณ",
+ "accent_colors": {
+ "label": "เฒ
เฒเณเฒธเณเฒเฒเณ เฒฌเฒฃเณเฒฃเฒเฒณเณ"
+ },
"clear_accent": "เฒ
เฒเณเฒธเณเฒเฒเณ เฒฌเฒฃเณเฒฃ เฒคเณเฒฐเฒตเณเฒเณเฒณเฒฟเฒธเฒฟ",
"translation_progress": "เฒ
เฒจเณเฒตเฒพเฒฆ เฒชเณเฒฐเฒเฒคเฒฟ"
},
diff --git a/i18n/locales/mr-IN.json b/i18n/locales/mr-IN.json
index 5c1692f0d7..20de5e0234 100644
--- a/i18n/locales/mr-IN.json
+++ b/i18n/locales/mr-IN.json
@@ -72,10 +72,14 @@
"theme_system": "เคธเคฟเคธเฅเคเคฎ",
"language": "เคญเคพเคทเคพ",
"help_translate": "npmx เคเฅ เคญเคพเคทเคพเคเคคเคฐ เคเคฐเคฃเฅเคฏเคพเคค เคฎเคฆเคค เคเคฐเคพ",
- "accent_colors": "เคเคเฅเคเคพเคฐเคฃ เคฐเคเค",
+ "accent_colors": {
+ "label": "เคเคเฅเคเคพเคฐเคฃ เคฐเคเค"
+ },
"clear_accent": "เคเคเฅเคเคพเคฐเคฃ เคฐเคเค เคธเคพเคซ เคเคฐเคพ",
"translation_progress": "เคญเคพเคทเคพเคเคคเคฐ เคชเฅเคฐเคเคคเฅ",
- "background_themes": "เคชเคพเคฐเฅเคถเฅเคตเคญเฅเคฎเฅ เคเคเคพ"
+ "background_themes": {
+ "label": "เคชเคพเคฐเฅเคถเฅเคตเคญเฅเคฎเฅ เคเคเคพ"
+ }
},
"i18n": {
"missing_keys": "{count} เคญเคพเคทเคพเคเคคเคฐ เคเคพเคฏเคฌ เคเคนเฅ | {count} เคญเคพเคทเคพเคเคคเคฐเฅ เคเคพเคฏเคฌ เคเคนเฅเคค",
diff --git a/i18n/locales/nb-NO.json b/i18n/locales/nb-NO.json
index 63afe4dc61..0e6cbe9213 100644
--- a/i18n/locales/nb-NO.json
+++ b/i18n/locales/nb-NO.json
@@ -105,10 +105,14 @@
"theme_system": "System",
"language": "Sprรฅk",
"help_translate": "Hjelp med รฅ oversette npmx",
- "accent_colors": "Aksentfarger",
+ "accent_colors": {
+ "label": "Aksentfarger"
+ },
"clear_accent": "Fjern aksentfarge",
"translation_progress": "Oversettelsesfremdrift",
- "background_themes": "Bakgrunnsnyanse"
+ "background_themes": {
+ "label": "Bakgrunnsnyanse"
+ }
},
"i18n": {
"missing_keys": "{count} manglende oversettelse | {count} manglende oversettelser",
diff --git a/i18n/locales/ne-NP.json b/i18n/locales/ne-NP.json
index 06755befb0..a996e03c80 100644
--- a/i18n/locales/ne-NP.json
+++ b/i18n/locales/ne-NP.json
@@ -75,7 +75,9 @@
"theme_system": "เคธเคฟเคธเฅเคเคฎ",
"language": "เคญเคพเคทเคพ",
"help_translate": "npmx เค
เคจเฅเคตเคพเคฆ เคเคฐเฅเคจ เคธเคนเคฏเฅเค เคเคฐเฅเคจเฅเคนเฅเคธเฅ",
- "accent_colors": "เคเคเฅเคธเฅเคจเฅเค เคฐเคเคนเคฐเฅ",
+ "accent_colors": {
+ "label": "เคเคเฅเคธเฅเคจเฅเค เคฐเคเคนเคฐเฅ"
+ },
"clear_accent": "เคเคเฅเคธเฅเคจเฅเค เคฐเค เคนเคเคพเคเคจเฅเคนเฅเคธเฅ",
"translation_progress": "เค
เคจเฅเคตเคพเคฆ เคชเฅเคฐเคเคคเคฟ"
},
diff --git a/i18n/locales/pl-PL.json b/i18n/locales/pl-PL.json
index 8a63c9cb8d..8c25224427 100644
--- a/i18n/locales/pl-PL.json
+++ b/i18n/locales/pl-PL.json
@@ -107,7 +107,7 @@
"reply_count": "{count} odpowiedzi | {count} odpowiedลบ | {count} odpowiedzi | {count} odpowiedzi | {count} odpowiedzi",
"like_count": "{count} polubieล | {count} polubienie | {count} polubienia | {count} polubieล | {count} polubieล",
"repost_count": "{count} udostฤpnieล | {count} udostฤpnienie | {count} udostฤpnienia | {count} udostฤpnieล | {count} udostฤpnieล",
- "more_replies": "{count} odpowiedzi wiฤcej... | {count} odpowiedลบ wiฤcej... | {count} odpowiedzi wiฤcej... | {count} odpowiedzi wiฤcej... | {count} odpowiedzi wiฤcej..."
+ "more_replies": "jeszcze {count} odpowiedลบโฆ | jeszcze {count} odpowiedziโฆ | jeszcze {count} odpowiedziโฆ"
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "Systemowy",
"language": "Jฤzyk",
"help_translate": "Pomรณลผ tลumaczyฤ npmx",
- "accent_colors": "Kolory akcentu",
+ "accent_colors": {
+ "label": "Kolory akcentu"
+ },
"clear_accent": "Wyczyลฤ kolor akcentu",
"translation_progress": "Postฤp tลumaczenia",
- "background_themes": "Odcieล tลa",
+ "background_themes": {
+ "label": "Odcieล tลa"
+ },
"keyboard_shortcuts_enabled": "Wลฤ
cz skrรณty klawiaturowe",
"keyboard_shortcuts_enabled_description": "Skrรณty klawiaturowe mogฤ
zostaฤ wyลฤ
czone jeลli kolidujฤ
z innymi skrรณtami przeglฤ
darki lub systemu"
},
diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json
index 9fd9bc949b..f90b8a2943 100644
--- a/i18n/locales/pt-BR.json
+++ b/i18n/locales/pt-BR.json
@@ -13,13 +13,32 @@
"trademark_disclaimer": "npm รฉ uma marca registrada da npm, Inc. Este site nรฃo รฉ afiliado com npm, Inc.",
"footer": {
"about": "sobre",
+ "blog": "blog",
"docs": "documentaรงรฃo",
"source": "cรณdigo-fonte",
"social": "redes sociais",
- "chat": "chat"
+ "chat": "chat",
+ "builders_chat": "construtores",
+ "keyboard_shortcuts": "atalhos de teclado"
},
"shortcuts": {
- "section": {}
+ "section": {
+ "global": "Global",
+ "search": "Pesquisar",
+ "package": "Pacote"
+ },
+ "focus_search": "Focar pesquisa",
+ "show_kbd_hints": "Destacar dicas de teclado",
+ "settings": "Abrir configuraรงรตes",
+ "compare": "Abrir comparaรงรฃo",
+ "compare_from_package": "Comparaรงรฃo aberta (preenchida previamente com o pacote atual)",
+ "navigate_results": "Navegar resultados",
+ "go_to_result": "Ir para resultado",
+ "open_code_view": "Abrir visualizador de cรณdigo",
+ "open_docs": "Abrir documentaรงรฃo",
+ "disable_shortcuts": "Pode desativar os atalhos do teclado em {settings}.",
+ "open_main": "Abrir informaรงรฃo principal",
+ "open_diff": "Abrir diferenรงa de versรตes"
},
"search": {
"label": "Pesquisar pacotes npm",
@@ -27,21 +46,34 @@
"button": "pesquisar",
"searching": "Pesquisando...",
"found_packages": "Nenhum pacote encontrado | 1 pacote encontrado | {count} pacotes encontrados",
+ "found_packages_sorted": "Nenhum resultado encontrado | Classificando o resultado {count} superior | Classificando {count} resultados principais",
"updating": "(atualizando...)",
"no_results": "Nenhum pacote encontrado para \"{query}\"",
+ "rate_limited": "Limite de pedidos npm atingido, tente novamente em alguns instantes",
"title": "pesquisar",
+ "title_search": "pesquisa: {search}",
+ "title_packages": "pesquisa de pacotes",
+ "meta_description": "Resultados da pesquisa para '{search}'",
+ "meta_description_packages": "Pesquisa de pacotes npm",
"not_taken": "{name} nรฃo estรก em uso",
"claim_prompt": "Reivindicar este nome de pacote no npm",
"claim_button": "Reivindicar \"{name}\"",
"want_to_claim": "Deseja reivindicar este nome de pacote?",
"start_typing": "Comece a digitar para pesquisar pacotes",
+ "algolia_disclaimer": "Desenvolvido por Algolia",
"exact_match": "exato",
"suggestion": {
"user": "usuรกrio",
"org": "organizaรงรฃo",
"view_user_packages": "Ver pacotes deste usuรกrio",
"view_org_packages": "Ver pacotes desta organizaรงรฃo"
- }
+ },
+ "instant_search": "Pesquisa instantรขnea",
+ "instant_search_on": "ativada",
+ "instant_search_off": "desativada",
+ "instant_search_turn_on": "ativar",
+ "instant_search_turn_off": "desativar",
+ "instant_search_advisory": "{label} {state} โ {action}"
},
"nav": {
"main_navigation": "Principal",
@@ -55,6 +87,31 @@
"links": "Links",
"tap_to_search": "Toque para pesquisar"
},
+ "blog": {
+ "title": "Blog",
+ "heading": "blog",
+ "meta_description": "Insights e atualizaรงรตes da comunidade npmx",
+ "author": {
+ "view_profile": "Veja o perfil de {name} no Bluesky"
+ },
+ "draft_badge": "Rascunho",
+ "draft_banner": "Este รฉ um rascunho nรฃo publicado. Pode estar incompleto ou conter imprecisรตes.",
+ "atproto": {
+ "view_on_bluesky": "Ver no Bluesky",
+ "reply_on_bluesky": "Responder no Bluesky",
+ "likes_on_bluesky": "Curtidas no Bluesky",
+ "like_or_reply_on_bluesky": "Curta esta postagem ou adicione seu comentรกrio no Bluesky",
+ "no_comments_yet": "Nenhum comentรกrio ainda.",
+ "could_not_load_comments": "Nรฃo foi possรญvel carregar comentรกrios.",
+ "comments": "Comentรกrios",
+ "loading_comments": "Carregando comentรกrios...",
+ "updating": "Atualizando...",
+ "reply_count": "{count} resposta | {count} respostas",
+ "like_count": "{count} curtida | {count} curtidas",
+ "repost_count": "{count} repostagem | {count} repostagens",
+ "more_replies": "{count} mais resposta... | {count} mais respostas..."
+ }
+ },
"settings": {
"title": "configuraรงรตes",
"tagline": "personalize sua experiรชncia npmx",
@@ -62,9 +119,20 @@
"sections": {
"appearance": "Aparรชncia",
"display": "Exibiรงรฃo",
- "language": "Idioma"
+ "search": "Recursos de pesquisa",
+ "language": "Idioma",
+ "keyboard_shortcuts": "Atalhos de teclado"
+ },
+ "data_source": {
+ "label": "Fonte de dados",
+ "description": "Escolha onde o npmx obtรฉm os dados de pesquisa. As pรกginas de pacotes individuais sempre usam o registro npm diretamente.",
+ "npm": "Registro npm",
+ "npm_description": "Busca listagens de pesquisa, organizaรงรฃo e usuรกrios diretamente do registro oficial do npm. \nAutoritรกrio, mas pode ser mais lento.",
+ "algolia": "Algolia",
+ "algolia_description": "Usa Algolia para pesquisas e pรกginas organizacionais e de usuรกrios mais rรกpidas."
},
- "data_source": {},
+ "instant_search": "Pesquisa instantรขnea",
+ "instant_search_description": "Navega atรฉ ร pรกgina de pesquisa e atualiza os resultados conforme vocรช digita.",
"relative_dates": "Datas relativas",
"include_types": "Incluir {'@'}types na instalaรงรฃo",
"include_types_description": "Adicionar pacote {'@'}types aos comandos de instalaรงรฃo para pacotes sem tipo",
@@ -76,9 +144,16 @@
"theme_system": "Sistema",
"language": "Idioma",
"help_translate": "Ajude a traduzir npmx",
- "accent_colors": "Cores de destaque",
+ "accent_colors": {
+ "label": "Cores de destaque"
+ },
"clear_accent": "Limpar cor de destaque",
- "translation_progress": "Progresso de traduรงรฃo"
+ "translation_progress": "Progresso de traduรงรฃo",
+ "background_themes": {
+ "label": "Tom de fundo"
+ },
+ "keyboard_shortcuts_enabled": "Habilitar atalhos de teclado",
+ "keyboard_shortcuts_enabled_description": "Os atalhos de teclado podem ser desativados se entrarem em conflito com outros atalhos do navegador ou do sistema"
},
"i18n": {
"missing_keys": "{count} traduรงรฃo ausente | {count} traduรงรตes ausentes",
@@ -88,6 +163,13 @@
"edit_on_github": "Editar no GitHub",
"view_guide": "Guia de traduรงรฃo"
},
+ "error": {
+ "401": "Nรฃo autorizado",
+ "404": "Pรกgina nรฃo encontrada",
+ "500": "Erro do Servidor Interno",
+ "503": "Serviรงo nรฃo disponรญvel",
+ "default": "Algo deu errado"
+ },
"common": {
"loading": "Carregando...",
"loading_more": "Carregando mais...",
@@ -95,6 +177,7 @@
"end_of_results": "Fim dos resultados",
"try_again": "Tente novamente",
"close": "Fechar",
+ "or": "ou",
"retry": "Repetir",
"copy": "copiar",
"copied": "copiado!",
@@ -109,9 +192,40 @@
"members": "membros"
},
"scroll_to_top": "Rolar para o topo",
+ "cancel": "Cancelar",
+ "save": "Salvar",
+ "edit": "Editar",
+ "error": "Erro",
"view_on": {
- "npm": "visualizar no npm",
- "github": "Ver no GitHub"
+ "npm": "Ver no npm",
+ "github": "Ver no GitHub",
+ "gitlab": "Ver no GitLab",
+ "bitbucket": "Ver no Bitbucket",
+ "codeberg": "Ver no Codeberg",
+ "git_repo": "Ver no repositรณrio Git",
+ "forgejo": "Ver em Forgejo",
+ "gitea": "Ver no Gitea",
+ "gitee": "Ver no Gitee",
+ "radicle": "Ver na Radicle",
+ "sourcehut": "Ver no SourceHut",
+ "tangled": "Ver em Tangled"
+ }
+ },
+ "profile": {
+ "display_name": "Nome visรญvel",
+ "description": "Descriรงรฃo",
+ "no_description": "Sem descriรงรฃo",
+ "website": "Site",
+ "website_placeholder": "https://example.com",
+ "likes": "Curtidas",
+ "seo_title": "{handle} - npmx",
+ "seo_description": "Perfil npmx de {handle}",
+ "not_found": "Perfil nรฃo encontrado",
+ "not_found_message": "O perfil de {handle} nรฃo foi encontrado.",
+ "invite": {
+ "message": "Parece que eles ainda nรฃo estรฃo usando o npmx. Quer contar a eles sobre isso?",
+ "share_button": "Compartilhar no Bluesky",
+ "compose_text": "Olรก, {'@'}{handle}! Vocรช jรก conferiu npmx.dev? ร um navegador para o registro npm rรกpido, moderno e de cรณdigo aberto.\nhttps://npmx.dev"
}
},
"package": {
@@ -126,6 +240,13 @@
"version": "Esta versรฃo foi descontinuada.",
"no_reason": "Nenhum motivo fornecido"
},
+ "size_increase": {
+ "title_size": "Aumento significativo de tamanho desde v{version}",
+ "title_deps": "Aumento significativo no nรบmero de dependรชncias desde v{version}",
+ "title_both": "Aumento significativo de tamanho e dependรชncias desde v{version}",
+ "size": "O tamanho da instalaรงรฃo aumentou em {percent} ({size} maior)",
+ "deps": "{count} mais dependรชncias"
+ },
"replacement": {
"title": "Vocรช pode nรฃo precisar desta dependรชncia.",
"native": "Isso pode ser substituรญdo por {replacement}, disponรญvel desde Node {nodeVersion}.",
@@ -133,14 +254,18 @@
"documented": "A {community} marcou este pacote como tendo alternativas mais performรกticas.",
"none": "Este pacote foi marcado como nรฃo mais necessรกrio, e sua funcionalidade provavelmente estรก disponรญvel nativamente em todas as engines.",
"learn_more": "Saiba mais",
+ "learn_more_above": "Saiba mais acima.",
"mdn": "MDN",
- "community": "comunidade"
+ "community": "comunidade",
+ "consider_no_dep": "+ Considerar sem dependรชncias?"
},
"stats": {
"license": "Licenรงa",
"deps": "Deps",
"install_size": "Tamanho de Instalaรงรฃo",
"vulns": "Vulnerabilidades",
+ "published": "Publicado",
+ "published_tooltip": "Data em que {package}{'@'}{version} foi publicado",
"view_dependency_graph": "Ver grรกfico de dependรชncias",
"inspect_dependency_tree": "Inspecionar รกrvore de dependรชncias",
"size_tooltip": {
@@ -166,6 +291,7 @@
"view_source": "Ver cรณdigo-fonte"
},
"links": {
+ "main": "principal",
"repo": "repositรณrio",
"homepage": "pรกgina inicial",
"issues": "problemas",
@@ -175,7 +301,10 @@
"fund": "financiar",
"compare": "comparar"
},
- "likes": {},
+ "likes": {
+ "like": "Gosto deste pacote",
+ "unlike": "Nรฃo gosto deste pacote"
+ },
"docs": {
"not_available": "Documentaรงรฃo nรฃo disponรญvel",
"not_available_detail": "Nรฃo conseguimos gerar documentaรงรฃo para esta versรฃo."
@@ -184,11 +313,14 @@
"title": "Comece agora",
"pm_label": "Gerenciador de pacotes",
"copy_command": "Copiar comando de instalaรงรฃo",
+ "copy_dev_command": "Copie o comando de instalaรงรฃo dev",
+ "dev_dependency_hint": "Geralmente instalado como uma dependรชncia de desenvolvimento",
"view_types": "Ver {package}"
},
"create": {
"title": "Criar novo projeto",
- "copy_command": "Copiar comando de criaรงรฃo"
+ "copy_command": "Copiar comando de criaรงรฃo",
+ "view": "{packageName} tem o mesmo mantenedor. Clique para mais detalhes."
},
"run": {
"title": "Executar",
@@ -197,17 +329,47 @@
"readme": {
"title": "Readme",
"no_readme": "README nรฃo disponรญvel.",
- "callout": {}
+ "toc_title": "Sumรกrio",
+ "callout": {
+ "note": "Nota",
+ "tip": "Dica",
+ "important": "Importante",
+ "warning": "Aviso",
+ "caution": "Cuidado"
+ },
+ "copy_as_markdown": "Copiar README como Markdown"
+ },
+ "provenance_section": {
+ "title": "Proveniรชncia",
+ "built_and_signed_on": "Criado e assinado em {provider}",
+ "view_build_summary": "Ver resumo da compilaรงรฃo",
+ "source_commit": "Commit de origem",
+ "build_file": "Arquivo de compilaรงรฃo",
+ "public_ledger": "Registro pรบblico",
+ "transparency_log_entry": "Entrada de registro de transparรชncia",
+ "view_more_details": "Ver mais detalhes",
+ "error_loading": "Falha ao carregar detalhes de proveniรชncia"
+ },
+ "security_downgrade": {
+ "title": "Reduรงรฃo de confianรงa",
+ "description_to_none_provenance": "Esta versรฃo foi publicada sem {provenance}.",
+ "description_to_none_trustedPublisher": "Esta versรฃo foi publicada sem {trustedPublishing}.",
+ "description_to_provenance_trustedPublisher": "Esta versรฃo usa {provenance} mas nรฃo {trustedPublishing}.",
+ "fallback_install_provenance": "Os comandos de instalaรงรฃo estรฃo fixados na versรฃo {version}, a รบltima versรฃo com proveniรชncia.",
+ "fallback_install_trustedPublisher": "Os comandos de instalaรงรฃo sรฃo fixados em {version}, a รบltima versรฃo com publicaรงรฃo de confianรงa.",
+ "provenance_link_text": "proveniรชncia",
+ "trusted_publishing_link_text": "publicaรงรฃo de confianรงa"
},
- "provenance_section": {},
- "security_downgrade": {},
"keywords_title": "Palavras-chave",
"compatibility": "Compatibilidade",
"card": {
"publisher": "Publicador",
+ "published": "Publicado",
"weekly_downloads": "Downloads semanais",
"keywords": "Palavras-chave",
- "license": "Licenรงa"
+ "license": "Licenรงa",
+ "select": "Selecionar pacote",
+ "select_maximum": "No mรกximo {count} pacotes podem ser selecionados"
},
"versions": {
"title": "Versรตes",
@@ -221,7 +383,38 @@
"more_tagged": "{count} mais marcadas",
"all_covered": "Todas as versรตes estรฃo cobertas pelas tags acima",
"deprecated_title": "{version} (descontinuada)",
- "view_all": "Ver {count} versรฃo | Ver todas as {count} versรตes"
+ "view_all": "Ver {count} versรฃo | Ver todas as {count} versรตes",
+ "view_all_versions": "Ver todas as versรตes",
+ "distribution_title": "Grupo Semver",
+ "distribution_modal_title": "Versรตes",
+ "distribution_range_date_same_year": "de {from} a {to}, {endYear}",
+ "distribution_range_date_multiple_years": "de {from}, {startYear} a {to}, {endYear}",
+ "grouping_major": "Principal",
+ "grouping_minor": "Menor",
+ "grouping_versions_title": "Versรตes",
+ "grouping_versions_all": "Todos",
+ "grouping_versions_only_recent": "Somente recentes",
+ "grouping_usage_title": "Uso",
+ "grouping_usage_all": "Todos",
+ "grouping_usage_most_used": "Mais usado",
+ "recent_versions_only_tooltip": "Mostrar apenas versรตes publicadas no รบltimo ano.",
+ "show_low_usage_tooltip": "Incluir grupos de versรตes com menos de 1% do total de downloads.",
+ "y_axis_label": "Transferรชncias",
+ "filter_placeholder": "Filtrar por semver (por exemplo, ^3.0.0)",
+ "filter_invalid": "Intervalo semver invรกlido",
+ "filter_help": "Ajuda do filtro de Semver",
+ "filter_tooltip": "Filtre as versรตes usando um {link}. Por exemplo, ^3.0.0 mostra todas as versรตes 3.x.",
+ "filter_tooltip_link": "faixa semver",
+ "no_matches": "Nenhuma versรฃo corresponde a esta faixa",
+ "copy_alt": {
+ "per_version_analysis": "A versรฃo de {version} foi baixada {downloads} vezes",
+ "general_description": "Grรกfico de barras mostrando downloads por versรฃo para {versions_count} versรตes {semver_grouping_mode} do pacote {package_name}, {date_range_label} da versรฃo {first_version} atรฉ a versรฃo {last_version}. A versรฃo mais baixada รฉ {max_downloaded_version} com {max_version_downloads} downloads. {per_version_analysis}. {watermark}"
+ },
+ "page_title": "Histรณrico de versรตes",
+ "current_tags": "Tags atuais",
+ "version_filter_placeholder": "Filtrar versรตes...",
+ "version_filter_label": "Filtrar versรตes",
+ "no_match_filter": "Nenhuma versรฃo corresponde a {filter}"
},
"dependencies": {
"title": "Dependรชncias ({count})",
@@ -231,7 +424,8 @@
"view_vulnerabilities": "Ver vulnerabilidades",
"outdated_major": "{count} versรฃo principal desatualizada (mais recente: {latest}) | {count} versรตes principais desatualizadas (mais recente: {latest})",
"outdated_minor": "{count} versรฃo secundรกria desatualizada (mais recente: {latest}) | {count} versรตes secundรกrias desatualizadas (mais recente: {latest})",
- "outdated_patch": "Atualizaรงรฃo de patch disponรญvel (mais recente: {latest})"
+ "outdated_patch": "Atualizaรงรฃo de patch disponรญvel (mais recente: {latest})",
+ "has_replacement": "Esta dependรชncia tem substituiรงรตes sugeridas"
},
"peer_dependencies": {
"title": "Dependรชncias Pares ({count})",
@@ -270,10 +464,53 @@
"date_range_multiline": "{start}\npara {end}",
"download_file": "Baixar {fileType}",
"toggle_annotator": "Alternar anotador",
- "items": {}
+ "toggle_stack_mode": "Alternar modo de pilha",
+ "open_options": "Abrir opรงรตes",
+ "close_options": "Fechar opรงรตes",
+ "legend_estimation": "Estimativa",
+ "no_data": "Nรฃo hรก dados disponรญveis",
+ "y_axis_label": "{granularity} {facet}",
+ "facet": "Faceta",
+ "title": "Tendรชncias",
+ "contributors_skip": "Nรฃo mostrado em Colaboradores (sem repositรณrio GitHub):",
+ "items": {
+ "downloads": "Transferรชncias",
+ "likes": "Curtidas",
+ "contributors": "Colaboradores"
+ },
+ "data_correction": "Correรงรฃo de dados",
+ "average_window": "Janela mรฉdia",
+ "smoothing": "Suavizaรงรฃo",
+ "prediction": "Previsรฃo",
+ "known_anomalies": "Anomalias conhecidas",
+ "known_anomalies_description": "Interpola sobre picos de download conhecidos causados โโpor bots ou problemas de CI.",
+ "known_anomalies_ranges": "Intervalos de anomalia",
+ "known_anomalies_range": "De {start} a {end}",
+ "known_anomalies_range_named": "{packageName}: de {start} a {end}",
+ "known_anomalies_none": "Nenhuma anomalia conhecida para este pacote. | Nenhuma anomalia conhecida para estes pacotes.",
+ "known_anomalies_contribute": "Contribuir dados de anomalia",
+ "apply_correction": "Aplicar correรงรฃo",
+ "copy_alt": {
+ "trend_none": "principalmente plano",
+ "trend_strong": "forte",
+ "trend_weak": "fraca",
+ "trend_undefined": "indefinido (dados insuficientes)",
+ "button_label": "Copiar texto alternativo",
+ "watermark": "Na parte inferior, uma marca d'รกgua diz \"./npmx um navegador rรกpido e moderno para o registro npm\"",
+ "analysis": "{package_name} comeรงa em {start_value} e termina em {end_value}, mostrando uma tendรชncia {trend} com uma inclinaรงรฃo de {downloads_slope} downloads por intervalo de tempo",
+ "estimation": "O valor final รฉ uma estimativa baseada em dados parciais do perรญodo atual.",
+ "estimations": "Os valores finais sรฃo estimativas baseadas em dados parciais do perรญodo corrente.",
+ "compare": "Grรกfico de linhas de comparaรงรฃo de download de pacotes para: {packages}.",
+ "single_package": "Grรกfico de linhas de downloads para o pacote {package}.",
+ "general_description": "O eixo Y representa o nรบmero de downloads. O eixo X representa o intervalo de datas, de {start_date} a {end_date}, com um perรญodo de {granularity}.{estimation_notice} {packages_analysis}. {watermark}.",
+ "facet_bar_general_description": "Grรกfico de barras horizontais para: {packages}, comparando {facet} ({description}). {facet_analysis} {watermark}.",
+ "facet_bar_analysis": "{package_name} tem um valor de {value}."
+ }
},
"downloads": {
- "title": "Downloads Semanais"
+ "title": "Downloads Semanais",
+ "community_distribution": "Ver distribuiรงรฃo de adoรงรฃo pela comunidade",
+ "subtitle": "Em todas as versรตes"
},
"install_scripts": {
"title": "Scripts de Instalaรงรฃo",
@@ -310,7 +547,8 @@
"high": "alta",
"moderate": "moderada",
"low": "baixa"
- }
+ },
+ "fixed_in_title": "Corrigido na versรฃo {version}"
},
"deprecated": {
"label": "Descontinuado",
@@ -353,10 +591,15 @@
},
"sort": {
"downloads": "Mais baixados",
+ "published": "Publicado recentemente",
"name_asc": "Nome (A-Z)",
"name_desc": "Nome (Z-A)"
},
- "size": {}
+ "size": {
+ "b": "{size} B",
+ "kb": "{size} KB",
+ "mb": "{size} MB"
+ }
},
"connector": {
"modal": {
@@ -376,7 +619,8 @@
"warning": "AVISO",
"warning_text": "Isso permite que npmx acesse seu CLI do npm. Conecte-se apenas a sites em que vocรช confia.",
"connect": "Conectar",
- "connecting": "Conectando..."
+ "connecting": "Conectando...",
+ "auto_open_url": "Abrir pรกgina de autenticaรงรฃo automaticamente"
}
},
"operations": {
@@ -392,7 +636,9 @@
"otp_placeholder": "Digite o cรณdigo OTP...",
"otp_label": "Senha de um รบnico uso",
"retry_otp": "Tentar novamente com OTP",
+ "retry_web_auth": "Tente novamente com autenticaรงรฃo da Web",
"retrying": "Tentando novamente...",
+ "open_web_auth": "Abrir link de autenticaรงรฃo da web",
"approve_operation": "Aprovar operaรงรฃo",
"remove_operation": "Remover operaรงรฃo",
"approve_all": "Aprovar Tudo",
@@ -514,6 +760,7 @@
"invalid_name": "Nome de pacote invรกlido:",
"available": "Este nome estรก disponรญvel!",
"taken": "Este nome jรก foi reivindicado.",
+ "missing_permission": "Vocรช nรฃo tem permissรฃo para adicionar um pacote no scope {'@'}{scope}.",
"similar_warning": "Pacotes similares existem - npm pode rejeitar este nome:",
"related": "Pacotes relacionados:",
"scope_warning_title": "Considere usar um pacote com escopo em vez disso",
@@ -556,7 +803,9 @@
"preview": "visualizar",
"code": "cรณdigo"
},
- "file_path": "Caminho do arquivo"
+ "file_path": "Caminho do arquivo",
+ "binary_file": "Arquivo binรกrio",
+ "binary_rendering_warning": "Tipo de arquivo nรฃo suportado para visualizaรงรฃo."
},
"badges": {
"provenance": {
@@ -591,7 +840,13 @@
"more_keywords": "+{count} mais",
"clear_all": "Limpar tudo",
"remove_filter": "Remover filtro {label}",
- "chips": {},
+ "chips": {
+ "search": "Procurar",
+ "downloads": "Transferรชncias",
+ "keyword": "Palavra-chave",
+ "security": "Seguranรงa",
+ "updated": "Atualizado"
+ },
"download_range": {
"any": "Qualquer",
"lt100": "< 100",
@@ -612,6 +867,7 @@
"secure": "Sem avisos",
"insecure": "Com avisos"
},
+ "view_selected": "Ver selecionados",
"sort": {
"label": "Ordenar pacotes",
"toggle_direction": "Alternar direรงรฃo de classificaรงรฃo",
@@ -622,6 +878,7 @@
"downloads_day": "Downloads/dia",
"downloads_month": "Downloads/mรชs",
"downloads_year": "Downloads/ano",
+ "published": "รltima publicaรงรฃo",
"name": "Nome",
"quality": "Qualidade",
"popularity": "Popularidade",
@@ -637,13 +894,15 @@
"version": "Versรฃo",
"description": "Descriรงรฃo",
"downloads": "Downloads/sem",
+ "published": "รltima publicaรงรฃo",
"maintainers": "Mantenedores",
"keywords": "Palavras-chave",
"quality_score": "Pontuaรงรฃo de qualidade",
"popularity_score": "Pontuaรงรฃo de popularidade",
"maintenance_score": "Pontuaรงรฃo de manutenรงรฃo",
"combined_score": "Pontuaรงรฃo combinada",
- "security": "Seguranรงa"
+ "security": "Seguranรงa",
+ "selection": "Selecionar pacote"
},
"view_mode": {
"label": "Modo de exibiรงรฃo",
@@ -699,7 +958,20 @@
"managers": "gerenciadores de pacotes"
}
},
- "team": {},
+ "sponsors": {
+ "title": "Patrocinadores"
+ },
+ "oss_partners": {
+ "title": "Parceiros OSS"
+ },
+ "team": {
+ "title": "Equipe",
+ "governance": "Governanรงa",
+ "role_steward": "administrador",
+ "role_maintainer": "mantenedor",
+ "sponsor": "patrocinador",
+ "sponsor_aria": "Patrocinador {name} no GitHub"
+ },
"contributors": {
"title": "Contribuidores",
"description": "npmx รฉ totalmente de cรณdigo aberto, construรญdo por uma comunidade incrรญvel de contribuidores. Junte-se a nรณs e vamos construir juntos a experiรชncia de navegaรงรฃo npm que sempre quisemos.",
@@ -719,6 +991,11 @@
"description": "Converse, faรงa perguntas e compartilhe ideias.",
"cta": "Junte-se ao Discord"
},
+ "builders": {
+ "title": "Ajude a construir o npmx",
+ "description": "Junte-se aos construtores que moldam o futuro do npmx.",
+ "cta": "Junte-se ao Discord dos Construtores"
+ },
"follow": {
"title": "Mantenha-se atualizado",
"description": "Descubra as novidades sobre npmx.",
@@ -750,7 +1027,9 @@
"create_account": "Criar uma nova conta",
"connect_bluesky": "Conectar com Bluesky",
"what_is_atmosphere": "O que รฉ uma conta da Atmosfera?",
- "atmosphere_explanation": "{npmx} usa o {atproto} para alimentar muitos de seus recursos sociais, permitindo que os usuรกrios possuam seus dados e usem uma conta para todos os aplicativos compatรญveis. Depois de criar uma conta, vocรช pode usar outros aplicativos como {bluesky} e {tangled} com a mesma conta."
+ "atmosphere_explanation": "{npmx} usa o {atproto} para alimentar muitos de seus recursos sociais, permitindo que os usuรกrios possuam seus dados e usem uma conta para todos os aplicativos compatรญveis. Depois de criar uma conta, vocรช pode usar outros aplicativos como {bluesky} e {tangled} com a mesma conta.",
+ "default_input_error": "Insira um identificador vรกlido, DID ou um URL PDS completo",
+ "profile": "Perfil"
}
},
"header": {
@@ -783,10 +1062,13 @@
"section_packages": "Pacotes",
"section_facets": "Aspectos",
"section_comparison": "Comparaรงรฃo",
+ "copy_as_markdown": "Copiar tabela",
"loading": "Carregando dados do pacote...",
"error": "Falha ao carregar dados do pacote. Por favor, tente novamente.",
"empty_title": "Selecione pacotes para comparar",
- "empty_description": "Pesquise e adicione pelo menos 2 pacotes acima para ver uma comparaรงรฃo lado a lado de suas mรฉtricas."
+ "empty_description": "Pesquise e adicione pelo menos 2 pacotes acima para ver uma comparaรงรฃo lado a lado de suas mรฉtricas.",
+ "table_view": "Tabela",
+ "charts_view": "Grรกficos"
},
"selector": {
"search_label": "Pesquisar por pacotes",
@@ -797,7 +1079,15 @@
"packages_selected": "{count}/{max} pacotes selecionados.",
"add_hint": "Adicione pelo menos 2 pacotes para comparar."
},
- "no_dependency": {},
+ "no_dependency": {
+ "label": "(Sem dependรชncia)",
+ "typeahead_title": "O que Tiago faria?",
+ "typeahead_description": "Compare com nรฃo usar uma dependรชncia! Aprovado por e18e.",
+ "tooltip_title": "Vocรช pode nรฃo precisar de uma dependรชncia",
+ "tooltip_description": "Compare com nรฃo usar uma dependรชncia! O {link} mantรฉm uma lista de pacotes que podem ser substituรญdos por APIs nativas ou alternativas mais simples.",
+ "e18e_community": "comunidade e18e",
+ "add_column": "Adicionar coluna sem dependรชncia ร comparaรงรฃo"
+ },
"facets": {
"group_label": "Aspectos de comparaรงรฃo",
"all": "todos",
@@ -807,6 +1097,7 @@
"deselect_all": "Desselecionar todos os aspectos",
"select_category": "Selecionar todos os aspectos {category}",
"deselect_category": "Desselecionar todos os aspectos {category}",
+ "binary_only_tooltip": "Este pacote expรตe binรกrios e nenhuma exportaรงรฃo",
"categories": {
"performance": "Performance",
"health": "Saรบde",
@@ -814,42 +1105,251 @@
"security": "Seguranรงa e Conformidade"
},
"items": {
- "packageSize": {},
- "installSize": {},
- "dependencies": {},
- "totalDependencies": {},
- "downloads": {},
- "totalLikes": {},
- "lastUpdated": {},
- "deprecated": {},
- "engines": {},
- "types": {},
- "moduleFormat": {},
- "license": {},
- "vulnerabilities": {}
+ "packageSize": {
+ "label": "Tamanho do pacote",
+ "description": "Tamanho do pacote em si (descompactado)"
+ },
+ "installSize": {
+ "label": "Tamanho da instalaรงรฃo",
+ "description": "Tamanho total da instalaรงรฃo, incluindo todas as dependรชncias"
+ },
+ "dependencies": {
+ "label": "Dependรชncias Diretas",
+ "description": "Nรบmero de dependรชncias diretas"
+ },
+ "totalDependencies": {
+ "label": "Dependรชncias totais",
+ "description": "Nรบmero total de dependรชncias, incluindo transitivas"
+ },
+ "downloads": {
+ "label": "Downloads/semana",
+ "description": "Contagem de downloads semanais"
+ },
+ "totalLikes": {
+ "label": "Curtidas",
+ "description": "Nรบmero de curtidas"
+ },
+ "lastUpdated": {
+ "label": "Publicado",
+ "description": "Quando esta versรฃo foi publicada"
+ },
+ "deprecated": {
+ "label": "Obsoleto?",
+ "description": "Se o pacote estรก obsoleto"
+ },
+ "engines": {
+ "label": "Motores",
+ "description": "Requisitos de versรฃo do Node.js."
+ },
+ "types": {
+ "label": "Tipos",
+ "description": "Definiรงรตes de tipos TypeScript"
+ },
+ "moduleFormat": {
+ "label": "Formato do mรณdulo",
+ "description": "Suporte ESM/CJS"
+ },
+ "license": {
+ "label": "Licenรงa",
+ "description": "Licenรงa do pacote"
+ },
+ "vulnerabilities": {
+ "label": "Vulnerabilidades",
+ "description": "Vulnerabilidades de seguranรงa conhecidas"
+ }
+ },
+ "values": {
+ "any": "Qualquer",
+ "none": "Nenhum",
+ "unknown": "Desconhecido",
+ "deprecated": "Obsoleto",
+ "not_deprecated": "Nรฃo",
+ "types_included": "Incluรญdo",
+ "types_none": "Nenhum",
+ "vulnerabilities_summary": "{count} ({critical}C/{high}A)",
+ "up_to_you": "Vocรช decide!"
},
- "values": {},
- "trends": {}
+ "trends": {
+ "title": "Comparar tendรชncias"
+ }
+ },
+ "file_changes": "Alteraรงรตes de arquivo",
+ "files_count": "{count} arquivo | {count} arquivos",
+ "lines_hidden": "{count} linha escondida | {count} linhas escondidas",
+ "file_too_large": "Arquivo muito grande para comparar",
+ "file_size_warning": "{size} excede o limite de 250 KB para comparaรงรฃo",
+ "compare_versions": "diferenรงa",
+ "compare_versions_title": "Compare com a versรฃo mais recente",
+ "version_selector_title": "Comparar com versรฃo",
+ "summary": "Resumo",
+ "deps_count": "{count} dependรชncia | {count} dependรชncias",
+ "dependencies": "Dependรชncias",
+ "dev_dependencies": "Dependรชncias de desenvolvimento",
+ "peer_dependencies": "Dependรชncias de pares",
+ "optional_dependencies": "Dependรชncias opcionais",
+ "no_dependency_changes": "Sem alteraรงรตes de dependรชncia",
+ "file_filter_option": {
+ "all": "Todos ({count})",
+ "added": "Adicionado ({count})",
+ "removed": "Removidos ({count})",
+ "modified": "Modificado ({count})"
+ },
+ "search_files_placeholder": "Pesquisar arquivos...",
+ "no_files_all": "Nenhum arquivo",
+ "no_files_search": "Nenhum arquivo correspondente a \"{query}\"",
+ "no_files_filtered": "Nenhum arquivo {filter}",
+ "filter": {
+ "added": "adicionado",
+ "removed": "removido",
+ "modified": "modificado"
+ },
+ "files_button": "Arquivos",
+ "select_file_prompt": "Selecione um arquivo na barra lateral para ver suas diferenรงas",
+ "close_files_panel": "Fechar painel de arquivos",
+ "filter_files_label": "Filtrar arquivos por tipo de alteraรงรฃo"
+ },
+ "pds": {
+ "title": "npmx.social",
+ "meta_description": "O AT Protocol Personal Data Server (PDS) oficial para a comunidade npmx.",
+ "join": {
+ "title": "Junte-se ร comunidade",
+ "description": "Esteja vocรช criando sua primeira conta na atmosfera ou migrando uma jรก existente, vocรช pertence aqui. Vocรช pode migrar sua conta atual sem perder seu controle, suas postagens ou seus seguidores.",
+ "migrate": "Migrar com PDS MOOver"
+ },
+ "server": {
+ "title": "Detalhes do servidor",
+ "location_label": "Localizaรงรฃo:",
+ "location_value": "Nuremberga, Alemanha",
+ "infrastructure_label": "Infraestrutura:",
+ "infrastructure_value": "Hospedado em Hetzner",
+ "privacy_label": "Privacidade:",
+ "privacy_value": "Sujeito ร s rigorosas leis de proteรงรฃo de dados da UE",
+ "learn_more": "Aprenda como o npmx usa a atmosfera"
+ },
+ "community": {
+ "title": "Quem estรก aqui",
+ "description": "Algumas das {count} contas que jรก estรฃo chamando npmx.social sua casa:",
+ "loading": "Carregando comunidade PDS...",
+ "error": "Falha ao carregar a comunidade PDS.",
+ "empty": "Nenhum membro da comunidade para exibir.",
+ "view_profile": "Veja o perfil de {handle}",
+ "new_accounts": "...e mais {count} que sรฃo novos na atmosfera"
}
},
"privacy_policy": {
+ "title": "polรญtica de privacidade",
+ "last_updated": "รltima atualizaรงรฃo: {date}",
+ "welcome": "Bem-vindo ao {app}. Estamos empenhados em proteger a sua privacidade. Esta polรญtica explica quais dados coletamos, como os utilizamos e seus direitos em relaรงรฃo ร s suas informaรงรตes.",
"cookies": {
- "what_are": {},
- "types": {},
- "local_storage": {},
- "management": {}
- },
- "analytics": {},
- "authenticated": {},
- "data_retention": {},
- "your_rights": {},
- "contact": {},
- "changes": {}
+ "what_are": {
+ "title": "O que sรฃo cookies?",
+ "p1": "Cookies sรฃo pequenos arquivos de texto armazenados no seu dispositivo quando vocรช visita um site. O seu objetivo รฉ melhorar a sua experiรชncia de navegaรงรฃo, lembrando certas preferรชncias e configuraรงรตes."
+ },
+ "types": {
+ "title": "Que cookies utilizamos?",
+ "p1": "Utilizamos {bold} apenas para fins estritamente necessรกrios ao funcionamento do site. Nรฃo utilizamos cookies de terceiros ou de publicidade.",
+ "bold": "cookies tรฉcnicos essenciais",
+ "li1": "{li11}{separator} {li12}",
+ "li2": "{li21}{separator} {li22}",
+ "separator": ":",
+ "cookie_vdpl": "__vdpl",
+ "cookie_vdpl_desc": "Este cookie รฉ usado pelo nosso provedor de hospedagem (Vercel) para proteรงรฃo contra distorรงรฃo. Garante que vocรช busque ativos da versรฃo de implantaรงรฃo correta se uma nova atualizaรงรฃo for lanรงada enquanto vocรช navega. Nรฃo rastreia vocรช.",
+ "cookie_h3": "h3",
+ "cookie_h3_desc": "Este รฉ o nosso cookie de sessรฃo segura. Ele armazena o token de acesso OAuth quando vocรช conecta sua conta Atmosphere. ร essencial para manter sua sessรฃo autenticada."
+ },
+ "local_storage": {
+ "title": "Armazenamento local",
+ "p1": "Alรฉm dos cookies de sessรฃo, usamos o {bold} do seu navegador para salvar suas preferรชncias de exibiรงรฃo. \nIsso nos permite lembrar o tema (claro/escuro) e algumas outras {settings} que vocรช selecionou, para que vocรช nรฃo precise reconfigurรก-las a cada visita.",
+ "bold": "Armazenamento local",
+ "p2": "Esta informaรงรฃo รฉ puramente funcional, armazenada apenas no seu dispositivo e {bold2}. Utilizamo-la exclusivamente para melhorar a sua experiรชncia no nosso site.",
+ "bold2": "nรฃo contรฉm dados pessoais nem รฉ usado para rastreรก-lo",
+ "settings": "configuraรงรตes"
+ },
+ "management": {
+ "title": "Gerenciamento de cookies",
+ "p1": "Vocรช pode configurar seu navegador para aceitar, rejeitar ou excluir cookies de acordo com suas preferรชncias. No entanto, observe que {bold}.",
+ "bold": "rejeitar cookies essenciais pode impedir o acesso total ao aplicativo",
+ "p2": "Abaixo estรฃo links com instruรงรตes para gerenciamento de cookies nos navegadores mais utilizados:",
+ "chrome": "Google Chrome (abre em uma nova janela)",
+ "firefox": "Mozilla Firefox (abre em uma nova janela)",
+ "edge": "Microsoft Edge (abre em uma nova janela)"
+ }
+ },
+ "analytics": {
+ "title": "Anรกlise",
+ "p1": "Usamos {bold} para entender como os visitantes utilizam nosso site. Isso nos ajuda a melhorar a experiรชncia do usuรกrio e a identificar problemas.",
+ "bold": "Vercel Web Analytics",
+ "p2": "O Vercel Analytics foi projetado com a privacidade em mente:",
+ "li1": "Nรฃo usa cookies",
+ "li2": "Nรฃo coleta identificadores pessoais",
+ "li3": "Nรฃo rastreia usuรกrios em sites",
+ "li4": "Todos os dados sรฃo agregados e anonimizados",
+ "p3": "As รบnicas informaรงรตes coletadas incluem: URLs de pรกginas, referenciador, paรญs/regiรฃo, tipo de dispositivo, navegador e sistema operacional. \nEsses dados nรฃo podem ser usados โโpara identificar usuรกrios individuais."
+ },
+ "authenticated": {
+ "title": "Usuรกrios autenticados",
+ "p1": "Quando vocรช conecta sua conta {bold} ao npmx, armazenamos seu token de acesso OAuth em um cookie de sessรฃo seguro somente HTTP. \nEste token รฉ usado exclusivamente para autenticar solicitaรงรตes em seu nome.",
+ "bold": "Atmosfera",
+ "p2": "Nรฃo armazenamos suas credenciais e nรฃo acessamos nenhum dado alรฉm do necessรกrio para fornecer os recursos que vocรช utiliza. Vocรช pode desconectar sua conta a qualquer momento na pรกgina {settings}.",
+ "settings": "configuraรงรตes"
+ },
+ "data_retention": {
+ "title": "Retenรงรฃo de dados",
+ "p1": "Os cookies de sessรฃo sรฃo automaticamente eliminados quando fecha o navegador ou apรณs um perรญodo de inatividade. As preferรชncias de armazenamento local permanecem no seu dispositivo atรฉ que vocรช limpe os dados do navegador. Os dados analรญticos sรฃo retidos de forma agregada e nรฃo podem ser vinculados a usuรกrios individuais."
+ },
+ "your_rights": {
+ "title": "Seus direitos",
+ "p1": "Vocรช tem o direito de:",
+ "li1": "Acesse informaรงรตes sobre quais dados coletamos",
+ "li2": "Limpe seu armazenamento local e cookies a qualquer momento",
+ "li3": "Desconecte sua sessรฃo autenticada",
+ "li4": "Solicitar informaรงรตes sobre nossas prรกticas de dados",
+ "p2": "Como nรฃo coletamos dados pessoais, normalmente nรฃo hรก informaรงรตes pessoais para excluir ou exportar."
+ },
+ "contact": {
+ "title": "Contate-nos",
+ "p1": "Para qualquer dรบvida ou preocupaรงรฃo sobre esta polรญtica de privacidade, vocรช pode entrar em contato conosco abrindo um problema em nosso {link}.",
+ "link": "Repositรณrio GitHub"
+ },
+ "changes": {
+ "title": "Alteraรงรตes nesta polรญtica",
+ "p1": "Poderemos atualizar esta polรญtica de privacidade de tempos em tempos. Quaisquer alteraรงรตes serรฃo publicadas nesta pรกgina com uma data de revisรฃo atualizada."
+ }
},
"a11y": {
- "approach": {},
- "measures": {},
- "limitations": {},
- "contact": {}
+ "title": "acessibilidade",
+ "footer_title": "a11y",
+ "welcome": "Queremos que o {app} possa ser usado pelo maior nรบmero de pessoas possรญvel.",
+ "approach": {
+ "title": "Nossa abordagem",
+ "p1": "Tentamos seguir as Diretrizes de Acessibilidade de Conteรบdo da Web (WCAG) 2.2 e usรก-las como referรชncia ao construir recursos. Nรฃo reivindicamos conformidade total com nenhum nรญvel das WCAG โ a acessibilidade รฉ um processo contรญnuo e hรก sempre mais trabalho a fazer.",
+ "p2": "Este site รฉ um {about}. As melhorias de acessibilidade sรฃo feitas de forma incremental como parte do nosso desenvolvimento regular.",
+ "about_link": "projeto de cรณdigo aberto voltado para a comunidade"
+ },
+ "measures": {
+ "title": "O que fazemos",
+ "p1": "Algumas das coisas que pretendemos fazer em todo o site:",
+ "li1": "Use atributos semรขnticos HTML e ARIA quando apropriado.",
+ "li2": "Use tamanhos de texto relativos para poder ajustรก-los em seu navegador.",
+ "li3": "Suporta navegaรงรฃo pelo teclado em toda a interface.",
+ "li4": "Respeite as preferรชncias de media prefers-reduced-motion e prefers-color-scheme.",
+ "li5": "Projete com contraste de cores suficiente em mente.",
+ "li6": "Certifique-se de que o conteรบdo essencial esteja disponรญvel sem JavaScript, embora alguns recursos interativos exijam isso."
+ },
+ "limitations": {
+ "title": "Limitaรงรตes conhecidas",
+ "p1": "Algumas partes do site, principalmente conteรบdo de terceiros, como READMEs de pacotes, podem nรฃo cumprir com padrรตes de acessibilidade. Estamos trabalhando para melhorar essas รกreas ao longo do tempo."
+ },
+ "contact": {
+ "title": "Feedback",
+ "p1": "Se vocรช encontrar uma barreira de acessibilidade no {app}, informe-nos abrindo um problema em nosso {link}. Levamos esses relatรณrios a sรฉrio e faremos o nosso melhor para abordรก-los.",
+ "link": "Repositรณrio GitHub"
+ }
+ },
+ "action_bar": {
+ "title": "Barra de aรงรตes",
+ "selection": "0 selecionados | 1 selecionado | {count} selecionados",
+ "shortcut": "Pressione \"{key}\" para focar nas aรงรตes",
+ "button_close_aria_label": "Fechar barra de aรงรตes"
}
}
diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json
index 0e2a77bf85..edb18a6447 100644
--- a/i18n/locales/ru-RU.json
+++ b/i18n/locales/ru-RU.json
@@ -107,7 +107,7 @@
"reply_count": "{count} ะพัะฒะตั | {count} ะพัะฒะตัะฐ | {count} ะพัะฒะตัะพะฒ",
"like_count": "{count} ะปะฐะนะบ | {count} ะปะฐะนะบะฐ | {count} ะปะฐะนะบะพะฒ",
"repost_count": "{count} ัะตะฟะพัั | {count} ัะตะฟะพััะฐ | {count} ัะตะฟะพััะพะฒ",
- "more_replies": "ะัั {count} ะพัะฒะตัโฆ | ะัั {count} ะพัะฒะตัะฐโฆ | ะัั {count} ะพัะฒะตัะพะฒโฆ"
+ "more_replies": "ะตัั {count} ะพัะฒะตั... | ะตัั {count} ะพัะฒะตัะฐ... | ะตัั {count} ะพัะฒะตัะพะฒ..."
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "ะกะธััะตะผะฝะฐั",
"language": "ะฏะทัะบ",
"help_translate": "ะะพะผะพัั ั ะฟะตัะตะฒะพะดะพะผ npmx",
- "accent_colors": "ะะบัะตะฝัะฝัะต ัะฒะตัะฐ",
+ "accent_colors": {
+ "label": "ะะบัะตะฝัะฝัะต ัะฒะตัะฐ"
+ },
"clear_accent": "ะกะฑัะพัะธัั ะฐะบัะตะฝัะฝัะน ัะฒะตั",
"translation_progress": "ะัะพะณัะตัั ะฟะตัะตะฒะพะดะฐ",
- "background_themes": "ะััะตะฝะพะบ ัะพะฝะฐ",
+ "background_themes": {
+ "label": "ะััะตะฝะพะบ ัะพะฝะฐ"
+ },
"keyboard_shortcuts_enabled": "ะัะฟะพะปัะทะพะฒะฐัั ะณะพัััะธะต ะบะปะฐะฒะธัะธ",
"keyboard_shortcuts_enabled_description": "ะะพัััะธะต ะบะปะฐะฒะธัะธ ะผะพะถะฝะพ ะฒัะบะปััะธัั, ะตัะปะธ ะฒะพะทะฝะธะบะฐัั ะบะพะฝัะปะธะบัั ั ัะพัะตัะฐะฝะธัะผะธ ะบะปะฐะฒะธั ะฑัะฐัะทะตัะฐ ะธะปะธ ะพะฟะตัะฐัะธะพะฝะฝะพะน ัะธััะตะผั"
},
diff --git a/i18n/locales/ta-IN.json b/i18n/locales/ta-IN.json
index 5df18ccc04..335d4bc952 100644
--- a/i18n/locales/ta-IN.json
+++ b/i18n/locales/ta-IN.json
@@ -105,10 +105,14 @@
"theme_system": "เฎเฎฃเฎฟเฎฉเฎฟ",
"language": "เฎฎเฏเฎดเฎฟ",
"help_translate": "npmx-เฎ เฎฎเฏเฎดเฎฟเฎชเฏเฎฏเฎฐเฏเฎเฏเฎ เฎเฎคเฎตเฏเฎเฏเฎเฎณเฏ",
- "accent_colors": "เฎตเฎฒเฎฟเฎฏเฏเฎฑเฏเฎคเฏเฎคเฎฒเฏ เฎตเฎฃเฏเฎฃเฎเฏเฎเฎณเฏ",
+ "accent_colors": {
+ "label": "เฎตเฎฒเฎฟเฎฏเฏเฎฑเฏเฎคเฏเฎคเฎฒเฏ เฎตเฎฃเฏเฎฃเฎเฏเฎเฎณเฏ"
+ },
"clear_accent": "เฎตเฎฒเฎฟเฎฏเฏเฎฑเฏเฎคเฏเฎคเฎฒเฏ เฎตเฎฃเฏเฎฃเฎคเฏเฎคเฏ เฎ
เฎดเฎฟ",
"translation_progress": "เฎฎเฏเฎดเฎฟเฎชเฏเฎฏเฎฐเฏเฎชเฏเฎชเฏ เฎฎเฏเฎฉเฏเฎฉเฏเฎฑเฏเฎฑเฎฎเฏ",
- "background_themes": "เฎชเฎฟเฎฉเฏเฎชเฏเฎฒ เฎจเฎฟเฎดเฎฒเฏ"
+ "background_themes": {
+ "label": "เฎชเฎฟเฎฉเฏเฎชเฏเฎฒ เฎจเฎฟเฎดเฎฒเฏ"
+ }
},
"i18n": {
"missing_keys": "{count} เฎตเฎฟเฎเฏเฎชเฎเฏเฎ เฎฎเฏเฎดเฎฟเฎชเฏเฎฏเฎฐเฏเฎชเฏเฎชเฏ | {count} เฎตเฎฟเฎเฏเฎชเฎเฏเฎ เฎฎเฏเฎดเฎฟเฎชเฏเฎฏเฎฐเฏเฎชเฏเฎชเฏเฎเฎณเฏ",
diff --git a/i18n/locales/te-IN.json b/i18n/locales/te-IN.json
index 9ee690177e..9c98d2507f 100644
--- a/i18n/locales/te-IN.json
+++ b/i18n/locales/te-IN.json
@@ -75,7 +75,9 @@
"theme_system": "เฐธเฐฟเฐธเฑเฐเฐฎเฑ",
"language": "เฐญเฐพเฐท",
"help_translate": "npmx เฐ
เฐจเฑเฐตเฐพเฐฆเฐเฐฒเฑ เฐธเฐนเฐพเฐฏเฐ เฐเฑเฐฏเฐเฐกเฐฟ",
- "accent_colors": "เฐฏเฐพเฐเฑเฐธเฑเฐเฐเฑ เฐฐเฐเฐเฑเฐฒเฑ",
+ "accent_colors": {
+ "label": "เฐฏเฐพเฐเฑเฐธเฑเฐเฐเฑ เฐฐเฐเฐเฑเฐฒเฑ"
+ },
"clear_accent": "เฐฏเฐพเฐเฑเฐธเฑเฐเฐเฑ เฐฐเฐเฐเฑเฐจเฑ เฐเฑเฐฒเฐฟเฐฏเฐฐเฑ เฐเฑเฐฏเฐเฐกเฐฟ",
"translation_progress": "เฐ
เฐจเฑเฐตเฐพเฐฆ เฐชเฑเฐฐเฑเฐเฐคเฐฟ"
},
diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json
index ac6066ce08..c1b0a40b50 100644
--- a/i18n/locales/tr-TR.json
+++ b/i18n/locales/tr-TR.json
@@ -107,7 +107,7 @@
"reply_count": "{count} yanฤฑt",
"like_count": "{count} beฤeni",
"repost_count": "{count} yeniden paylaลฤฑm",
- "more_replies": "{count} yanฤฑt daha..."
+ "more_replies": "{count} yanฤฑt daha... | {count} yanฤฑt daha..."
}
},
"settings": {
@@ -142,10 +142,14 @@
"theme_system": "Sistem",
"language": "Dil",
"help_translate": "npmx'i รงevirmeye yardฤฑm edin",
- "accent_colors": "Vurgu renkleri",
+ "accent_colors": {
+ "label": "Vurgu renkleri"
+ },
"clear_accent": "Vurgu rengini temizle",
"translation_progress": "รeviri ilerlemesi",
- "background_themes": "Arka plan tonu",
+ "background_themes": {
+ "label": "Arka plan tonu"
+ },
"keyboard_shortcuts_enabled": "Klavye kฤฑsayollarฤฑ etkin",
"keyboard_shortcuts_enabled_description": "Hฤฑzlฤฑ navigasyon iรงin klavye kฤฑsayollarฤฑnฤฑ etkinleลtir"
},
diff --git a/i18n/locales/uk-UA.json b/i18n/locales/uk-UA.json
index fac79a98cd..8b8bb8a4e1 100644
--- a/i18n/locales/uk-UA.json
+++ b/i18n/locales/uk-UA.json
@@ -144,10 +144,15 @@
"theme_system": "ะกะธััะตะผะฝะฐ",
"language": "ะะพะฒะฐ",
"help_translate": "ะะพะฟะพะผะพะถััั ะฟะตัะตะบะปะฐััะธ npmx",
- "accent_colors": "ะะพะปััะฝั ะฐะบัะตะฝัะธ",
+ "translation_status": "ะะตัะตะณะปัะฝััะธ ะณะปะพะฑะฐะปัะฝะธะน ััะฐััั ะฟะตัะตะบะปะฐะดั",
+ "accent_colors": {
+ "label": "ะะพะปััะฝั ะฐะบัะตะฝัะธ"
+ },
"clear_accent": "ะัะธััะธัะธ ะบะพะปัั ะฐะบัะตะฝัั",
"translation_progress": "ะกัะฐััั ะฟะตัะตะบะปะฐะดั",
- "background_themes": "ะะพะปัั ัะพะฝั",
+ "background_themes": {
+ "label": "ะะพะปัั ัะพะฝั"
+ },
"keyboard_shortcuts_enabled": "ะฃะฒัะผะบะฝััะธ ะณะฐัััั ะบะปะฐะฒััั",
"keyboard_shortcuts_enabled_description": "ะะฐัััั ะบะปะฐะฒััั ะผะพะถะฝะฐ ะฒะธะผะบะฝััะธ, ัะบัะพ ะฒะพะฝะธ ะบะพะฝัะปัะบััััั ะท ะฝะฐะปะฐัััะฒะฐะฝะฝัะผะธ ะฑัะฐัะทะตัะฐ ะฐะฑะพ ัะธััะตะผะธ"
},
diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json
index e6cc3aa6f6..e75d889793 100644
--- a/i18n/locales/zh-CN.json
+++ b/i18n/locales/zh-CN.json
@@ -36,7 +36,9 @@
"go_to_result": "่ทณ่ฝฌๅฐ็ปๆ",
"open_code_view": "ๆๅผไปฃ็ ่งๅพ",
"open_docs": "ๆๅผๆๆกฃ",
- "disable_shortcuts": "ไฝ ๅฏไปฅๅจ{settings}ไธญ็ฆ็จๅฟซๆท้ฎใ"
+ "disable_shortcuts": "ไฝ ๅฏไปฅๅจ{settings}ไธญ็ฆ็จๅฟซๆท้ฎใ",
+ "open_main": "ๆฅ็ไธป่ฆไฟกๆฏ",
+ "open_diff": "ๆฅ็็ๆฌๅทฎๅผ"
},
"search": {
"label": "ๆ็ดข npm ๅ
",
@@ -77,7 +79,7 @@
"main_navigation": "ไธป้กต",
"popular_packages": "็ญ้จ่ฝฏไปถๅ
",
"settings": "่ฎพ็ฝฎ",
- "compare": "ๆฏ่พๅ
",
+ "compare": "ๅ
ๅฏนๆฏ",
"back": "่ฟๅ",
"menu": "่ๅ",
"mobile_menu": "ๅฏผ่ช่ๅ",
@@ -107,7 +109,7 @@
"reply_count": "{count} ๆกๅๅค | {count} ๆกๅๅค",
"like_count": "{count} ไธช่ต | {count} ไธช่ต",
"repost_count": "{count} ๆฌก่ฝฌๅ | {count} ๆฌก่ฝฌๅ",
- "more_replies": "่ฟๆ {count} ๆกๅๅค... | ่ฟๆ {count} ๆกๅๅค..."
+ "more_replies": "่ฟๆ {count} ๆกๅๅค..."
}
},
"settings": {
@@ -136,16 +138,22 @@
"include_types_description": "ไธบๆชๆไพ็ฑปๅๅฎไน็ๅ
่ชๅจๆทปๅ {'@'}types ๅ
ๅฐๅฎ่ฃ
ๅฝไปค",
"hide_platform_packages": "ๅจๆ็ดข็ปๆ้่ๅนณๅฐ็นๅฎๅ
",
"hide_platform_packages_description": "ๅจๆ็ดข็ปๆไธญ้่ๅนณๅฐ็นๅฎ็ๅ็ไบ่ฟๅถๅ
๏ผไพๅฆ {'@'}esbuild/linux-x64๏ผ",
+ "enable_graph_pulse_loop": "ๅฏ็จ่ฟทไฝ ๅพ่กจ่ๅฒๅพช็ฏๆๆ",
+ "enable_graph_pulse_loop_description": "ๅจๅจไธ่ฝฝ้ๅพ่กจไธๅฏ็จๆ็ปญ่ๅฒๅจ็ปใ้จๅ็จๆทๅฏ่ฝไผ่งๅพ่ฏฅๅจ็ปๆๆๆ้ ๆ่ง่งๅนฒๆฐใ",
"theme": "ไธป้ข",
"theme_light": "ๆต
่ฒ",
"theme_dark": "ๆทฑ่ฒ",
"theme_system": "่ท้็ณป็ป",
"language": "่ฏญ่จ",
"help_translate": "ๅธฎๅฉ็ฟป่ฏ npmx",
- "accent_colors": "ๅผบ่ฐ่ฒ",
+ "accent_colors": {
+ "label": "ๅผบ่ฐ่ฒ"
+ },
"clear_accent": "ๆธ
้คๅผบ่ฐ่ฒ",
"translation_progress": "็ฟป่ฏ่ฟๅบฆ",
- "background_themes": "่ๆฏ่ฒ่ฐ",
+ "background_themes": {
+ "label": "่ๆฏ่ฒ่ฐ"
+ },
"keyboard_shortcuts_enabled": "ๅฏ็จๅฟซๆท้ฎ",
"keyboard_shortcuts_enabled_description": "ๅฆๆๆไบๅฟซๆท้ฎไธๅ
ถไปๆต่งๅจๆ็ณป็ปๅฟซๆท้ฎๅฒ็ช๏ผๅฏไปฅ้ๆฉๅฐๅ
ถ็ฆ็จใ"
},
@@ -192,7 +200,17 @@
"error": "ๅ ่ฝฝๅบ้",
"view_on": {
"npm": "ๅจ npm ไธๆฅ็",
- "github": "ๅจ GitHub ไธๆฅ็"
+ "github": "ๅจ GitHub ไธๆฅ็",
+ "gitlab": "ๅจ GitLab ไธๆฅ็",
+ "bitbucket": "ๅจ Bitbucket ไธๆฅ็",
+ "codeberg": "ๅจ Codeberg ไธๆฅ็",
+ "git_repo": "ๅจ Git ไปๅบไธๆฅ็",
+ "forgejo": "ๅจ Forgejo ไธๆฅ็",
+ "gitea": "ๅจ Gitea ไธๆฅ็",
+ "gitee": "ๅจ Gitee ไธๆฅ็",
+ "radicle": "ๅจ Radicle ไธๆฅ็",
+ "sourcehut": "ๅจ SourceHut ไธๆฅ็",
+ "tangled": "ๅจ Tangled ไธๆฅ็"
}
},
"profile": {
@@ -275,6 +293,7 @@
"view_source": "ๆฅ็ๆบไปฃ็ "
},
"links": {
+ "main": "ไธป้กต",
"repo": "ไปๅบ",
"homepage": "ไธป้กต",
"issues": "่ฎฎ้ข",
@@ -350,7 +369,9 @@
"published": "ๅๅธไบ",
"weekly_downloads": "ๆฏๅจไธ่ฝฝ้",
"keywords": "ๅ
ณ้ฎ่ฏ",
- "license": "่ฎธๅฏ่ฏ"
+ "license": "่ฎธๅฏ่ฏ",
+ "select": "้ๆฉ่ฝฏไปถๅ
",
+ "select_maximum": "ๆๅคๅฏ้ๆฉ {count} ไธช่ฝฏไปถๅ
"
},
"versions": {
"title": "็ๆฌ",
@@ -365,6 +386,7 @@
"all_covered": "ๆๆ็ๆฌๅๅทฒๅ
ๅซไบไธๆนๆ ็ญพไธญใ",
"deprecated_title": "{version}๏ผๅทฒๅผ็จ๏ผ",
"view_all": "ๆฅ็ๅ
จ้จ {count} ไธช็ๆฌ",
+ "view_all_versions": "ๆฅ็ๆๆ็ๆฌ",
"distribution_title": "่ฏญไนๅ็ๆฌๅ็ป",
"distribution_modal_title": "็ๆฌ",
"distribution_range_date_same_year": "{endYear}ๅนด {from} ่ณ {to}",
@@ -376,6 +398,7 @@
"grouping_versions_only_recent": "ไป
ๆ่ฟ",
"grouping_usage_title": "ไฝฟ็จ็",
"grouping_usage_all": "ๅ
จ้จ",
+ "grouping_usage_most_used": "ๆๅธธ็จ",
"recent_versions_only_tooltip": "ไป
ๆพ็คบๅจ่ฟๅปไธๅนดๅ
ๅๅธ็็ๆฌใ",
"show_low_usage_tooltip": "ๅ
ๆฌไธ่ฝฝ้ไฝไบ 1% ็็ๆฌ็ปใ",
"y_axis_label": "ไธ่ฝฝ้",
@@ -388,7 +411,12 @@
"copy_alt": {
"per_version_analysis": "{version} ๏ผ{downloads}ๆฌก๏ผ",
"general_description": "ๆกๅฝขๅพๅฑ็คบไบ {package_name} ๅจ {date_range_label} ๆ้ด็ไธ่ฝฝ้ๅๅธ๏ผๆฐๆฎๆถต็ไบ{versions_count} ไธช {semver_grouping_mode}๏ผไป{first_version}ๅฐ{last_version}๏ผใไธ่ฝฝ้ๆ้ซ็็ๆฌๆฏ{max_downloaded_version}๏ผ่พพ{max_version_downloads}ๆฌกใๅ
ถไฝ็ๆฌไธ่ฝฝ้๏ผ{per_version_analysis}ใ{watermark}ใ"
- }
+ },
+ "page_title": "็ๆฌๅๅฒ",
+ "current_tags": "ๅฝๅๆ ็ญพ",
+ "version_filter_placeholder": "็ญ้็ๆฌโฆ",
+ "version_filter_label": "็ญ้็ๆฌ",
+ "no_match_filter": "ๆฒกๆไธโ{filter}โๅน้
็็ๆฌ"
},
"dependencies": {
"title": "ไพ่ต๏ผ{count} ไธช๏ผ",
@@ -423,7 +451,8 @@
"cancel_add": "ๅๆถๆทปๅ ๆฅๆ่
",
"add_owner": "+ ๆทปๅ ๆฅๆ่
",
"show_more": "๏ผๆพ็คบๅฆๅค {count} ไธช๏ผ",
- "show_less": "๏ผๆถ่ตท๏ผ"
+ "show_less": "๏ผๆถ่ตท๏ผ",
+ "maintainer_template": "{avatar} {char126}{name}"
},
"trends": {
"granularity": "ๅจๆ",
@@ -455,6 +484,7 @@
"data_correction": "ๆฐๆฎๆ กๆญฃ",
"average_window": "ๅนณๅ็ชๅฃ",
"smoothing": "ๅนณๆปๅค็",
+ "prediction": "้ขๆต",
"known_anomalies": "ๅทฒ็ฅๅผๅธธ",
"known_anomalies_description": "ๅฏนๅทฒ็ฅ็็ฑๆบๅจไบบๆCI้ฎ้ขๅฏผ่ด็ไธ่ฝฝๅณฐๅผ่ฟ่กๆๅผๅค็ใ",
"known_anomalies_ranges": "ๅผๅธธๅบ้ด",
@@ -475,7 +505,9 @@
"estimations": "๏ผๆณจ๏ผๆ็ปๅผไธบๅบไบ้จๅๆฐๆฎ็ไผฐ็ฎ๏ผ",
"compare": "ไปฅไธไธบ {packages} ็ไธ่ฝฝ้ๅฏนๆฏๆ็บฟๅพใ",
"single_package": "{package} ็ไธ่ฝฝ้ๆ็บฟๅพใ",
- "general_description": "Y ่ฝด่กจ็คบไธ่ฝฝ้๏ผX ่ฝด่กจ็คบๆฅๆ่ๅด๏ผ{start_date} ่ณ {end_date}๏ผ๏ผ็ป่ฎกๅจๆไธบ{granularity}ใ{estimation_notice} {packages_analysis}ใ{watermark}ใ"
+ "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": {
@@ -774,7 +806,9 @@
"preview": "้ข่ง",
"code": "ไปฃ็ "
},
- "file_path": "ๆไปถ่ทฏๅพ"
+ "file_path": "ๆไปถ่ทฏๅพ",
+ "binary_file": "ไบ่ฟๅถๆไปถ",
+ "binary_rendering_warning": "ๆไธๆฏๆ้ข่งโ{contentType}โ็ฑปๅ็ๆไปถใ"
},
"badges": {
"provenance": {
@@ -836,6 +870,7 @@
"secure": "ๆฒกๆ่ญฆๅ",
"insecure": "ๆ่ญฆๅ"
},
+ "view_selected": "ๆฅ็้ไธญ้กน",
"sort": {
"label": "ๆๅบๅ
",
"toggle_direction": "ๅๆขๆๅบๆนๅ",
@@ -869,7 +904,8 @@
"popularity_score": "ๅๆฌข่ฟๅบฆ",
"maintenance_score": "็ปดๆค็จๅบฆ",
"combined_score": "ๆปๅ",
- "security": "ๅฎๅ
จๆง"
+ "security": "ๅฎๅ
จๆง",
+ "selection": "้ๆฉ่ฝฏไปถๅ
"
},
"view_mode": {
"label": "่งๅพๆจกๅผ",
@@ -1016,24 +1052,27 @@
"error": "ๅ ่ฝฝ็ป็ปๅคฑ่ดฅ",
"empty": "ๆชๆพๅฐ็ป็ป",
"view_all": "ๆฅ็ๅ
จ้จ"
- }
+ },
+ "pr": "ๅจ GitHub ไธๆๅผ PR #{prNumber}"
},
"compare": {
"packages": {
- "title": "ๆฏ่พๅ
",
- "tagline": "ๅนถๆๆฏ่พ npm ๅ
๏ผๅธฎๅฉไฝ ้ๆฉๅ้็ๅ
ใ",
- "meta_title": "ๆฏ่พ {packages} - npmx",
- "meta_title_empty": "ๆฏ่พๅ
- npmx",
- "meta_description": "ๅนถๆๆฏ่พ {packages}",
- "meta_description_empty": "ๅนถๆๆฏ่พ npm ๅ
๏ผๅธฎๅฉไฝ ้ๆฉๅ้็ๅ
ใ",
+ "title": "ๅ
ๅฏนๆฏ",
+ "tagline": "ๅนถๆๅฏนๆฏ npm ๅ
๏ผๅธฎไฝ ้ๅบๆๅ้็ใ",
+ "meta_title": "ๅฏนๆฏ {packages} - npmx",
+ "meta_title_empty": "ๅ
ๅฏนๆฏ - npmx",
+ "meta_description": "ๅนถๆๅฏนๆฏ {packages}",
+ "meta_description_empty": "ๅนถๆๅฏนๆฏ npm ๅ
๏ผๅธฎไฝ ้ๅบๆๅ้็ใ",
"section_packages": "ๅ
",
"section_facets": "็ปดๅบฆ",
- "section_comparison": "ๆฏ่พ",
+ "section_comparison": "ๅฏนๆฏ",
"copy_as_markdown": "ๅคๅถไธบ Markdown",
"loading": "ๆญฃๅจๅ ่ฝฝๅ
ๆฐๆฎโฆ",
"error": "ๅ ่ฝฝๅ
ๆฐๆฎๅคฑ่ดฅใ่ฏท้่ฏใ",
"empty_title": "้ๆฉ่ฆๆฏ่พ็ๅ
",
- "empty_description": "ๅจไธๆนๆ็ดขๅนถๆทปๅ ่ณๅฐ 2 ไธชๅ
๏ผไปฅๆฅ็ๅฎไปฌๆๆ ็ๅนถๆๆฏ่พใ"
+ "empty_description": "ๅจไธๆนๆ็ดขๅนถๆทปๅ ่ณๅฐ 2 ไธชๅ
๏ผไปฅๆฅ็ๅฎไปฌๆๆ ็ๅนถๆๆฏ่พใ",
+ "table_view": "่กจๆ ผ่งๅพ",
+ "charts_view": "ๅพ่กจ่งๅพ"
},
"selector": {
"search_label": "ๆ็ดขๅ
",
@@ -1144,7 +1183,8 @@
"file_too_large": "ๆไปถ่ฟๅคง๏ผๆ ๆณๅฏนๆฏ",
"file_size_warning": "{size} ่ถ
ๅบไบ 250KB ็ๅฏนๆฏ้ๅถ",
"compare_versions": "ๅทฎๅผ",
- "compare_versions_title": "ไธๆๆฐ็ๆฌๆฏ่พ",
+ "compare_versions_title": "ไธๆๆฐ็ๆฌๅฏนๆฏ",
+ "version_selector_title": "็ๆฌๅฏนๆฏ",
"summary": "ๆ่ฆ",
"deps_count": "{count} ไธชไพ่ต",
"dependencies": "็ดๆฅไพ่ต้กน",
@@ -1309,5 +1349,11 @@
"p1": "ๅฆๆไฝ ๅจ {app} ไธ้ๅฐๆ ้็ข่ฎฟ้ฎ้ฎ้ข๏ผ่ฏทๅจๆไปฌ็ {link} ไธๆไบค Issue ๅ้ฆ็ปๆไปฌใๆไปฌไผ่ฎค็ๅฏนๅพ
่ฟไบๅ้ฆ๏ผๅนถๅฐฝๅ่งฃๅณใ",
"link": "GitHub ไปๅบ"
}
+ },
+ "action_bar": {
+ "title": "ๆไฝๆ ",
+ "selection": "0 ไธช้กน็ฎ่ขซ้ไธญ | 1 ไธช้กน็ฎ่ขซ้ไธญ | {count} ไธช้กน็ฎ่ขซ้ไธญ",
+ "shortcut": "ๆไธ \"{key}\" ๅฟซๆท้ฎไปฅๆง่กๆไฝ",
+ "button_close_aria_label": "ๅ
ณ้ญๆไฝ้ขๆฟ"
}
}
diff --git a/i18n/locales/zh-TW.json b/i18n/locales/zh-TW.json
index 6765344baf..363820fd49 100644
--- a/i18n/locales/zh-TW.json
+++ b/i18n/locales/zh-TW.json
@@ -13,10 +13,12 @@
"trademark_disclaimer": "npm ๆฏ npm, Inc. ็่จปๅๅๆจใๆฌ็ถฒ็ซ่ npm, Inc. ็กไปปไฝ้ธๅฑฌ้ไฟใ",
"footer": {
"about": "้ๆผ",
+ "blog": "้จ่ฝๆ ผ",
"docs": "ๆไปถ",
"source": "ๅๅง็ขผ",
"social": "็คพ็พคๅช้ซ",
"chat": "่ๅคฉ",
+ "builders_chat": "้็ผ่
่ๅคฉ",
"keyboard_shortcuts": "้ต็คๅฟซๆท้ต"
},
"shortcuts": {
@@ -34,7 +36,9 @@
"go_to_result": "ๅๅพๆๅฐ็ตๆ",
"open_code_view": "้ๅ็จๅผ็ขผๆชข่ฆ",
"open_docs": "้ๅๆไปถ",
- "disable_shortcuts": "ไฝ ๅฏไปฅๅจ {settings} ไธญๅ็จ้ต็คๅฟซ้้ตใ"
+ "disable_shortcuts": "ไฝ ๅฏไปฅๅจ {settings} ไธญๅ็จ้ต็คๅฟซ้้ตใ",
+ "open_main": "้ๅไธป่ฆ่ณ่จ",
+ "open_diff": "้ๅ็ๆฌๅทฎ็ฐ"
},
"search": {
"label": "ๆๅฐ npm ๅฅไปถ",
@@ -63,7 +67,13 @@
"org": "็ต็น",
"view_user_packages": "ๆชข่ฆๆญคไฝฟ็จ่
็ๅฅไปถ",
"view_org_packages": "ๆชข่ฆๆญค็ต็น็ๅฅไปถ"
- }
+ },
+ "instant_search": "็ซๅณๆๅฐ",
+ "instant_search_on": "้ๅ",
+ "instant_search_off": "้้",
+ "instant_search_turn_on": "้ๅ",
+ "instant_search_turn_off": "้้",
+ "instant_search_advisory": "{label} {state} โ {action}"
},
"nav": {
"main_navigation": "้ฆ้ ",
@@ -78,8 +88,29 @@
"tap_to_search": "้ปๆไปฅๆๅฐ"
},
"blog": {
- "author": {},
- "atproto": {}
+ "title": "้จ่ฝๆ ผ",
+ "heading": "้จ่ฝๆ ผ",
+ "meta_description": "ไพ่ช npmx ็คพ็พค็่ฆ่งฃ่ๆๆฐๅๆ
",
+ "author": {
+ "view_profile": "ๅจ Bluesky ไธๆฅ็ {name} ็ๅไบบๆชๆก"
+ },
+ "draft_badge": "่็จฟ",
+ "draft_banner": "้ๆฏๅฐๆช็ผไฝ็่็จฟใๅ
งๅฎนๅฏ่ฝไธๅฎๆดๆๅ
ๅซไธๆบ็ขบ็่ณ่จใ",
+ "atproto": {
+ "view_on_bluesky": "ๅจ Bluesky ไธๆฅ็",
+ "reply_on_bluesky": "ๅจ Bluesky ไธๅ่ฆ",
+ "likes_on_bluesky": "ๅจ Bluesky ไธ็ๅๆญก",
+ "like_or_reply_on_bluesky": "ๅจ Bluesky ไธๅๆญก้็ฏๆ็ซ ๆๆฐๅข็่จ",
+ "no_comments_yet": "ๅฐ็ก็่จใ",
+ "could_not_load_comments": "็กๆณ่ผๅ
ฅ็่จใ",
+ "comments": "็่จ",
+ "loading_comments": "ๆญฃๅจ่ผๅ
ฅ็่จโฏโฏ",
+ "updating": "ๆดๆฐไธญโฏโฏ",
+ "reply_count": "{count} ๅๅ่ฆ | {count} ๅๅ่ฆ",
+ "like_count": "{count} ๅๅๆญก | {count} ๅๅๆญก",
+ "repost_count": "{count} ๆฌก่ฝ็ผ | {count} ๆฌก่ฝ็ผ",
+ "more_replies": "้ๆ {count} ๅๅ่ฆโฏโฏ | ้ๆ {count} ๅๅ่ฆโฏโฏ"
+ }
},
"settings": {
"title": "่จญๅฎ",
@@ -100,21 +131,29 @@
"algolia": "Algolia",
"algolia_description": "ไฝฟ็จ 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": "ๅ็จ่ฟทไฝ ๅ่กจ็่่กๅพช็ฐๆๆ",
+ "enable_graph_pulse_loop_description": "ๅจๆฏ้ฑไธ่ผๅ่กจไธๅๅ้ฃ็บ็่่กๅ็ซใ่ซๆณจๆ๏ผๆญคๅ็ซๅฏ่ฝๆๅฐ้จๅไฝฟ็จ่
้ ๆ่ฆ่ฆบๅนฒๆพใ",
"theme": "ไธป้ก",
"theme_light": "ๆทบ่ฒ",
"theme_dark": "ๆทฑ่ฒ",
"theme_system": "่ท้จ็ณป็ตฑ",
"language": "่ช่จ",
"help_translate": "ๅๅฉ็ฟป่ญฏ npmx",
- "accent_colors": "ๅผท่ชฟ่ฒ",
+ "accent_colors": {
+ "label": "ๅผท่ชฟ่ฒ"
+ },
"clear_accent": "ๆธ
้คๅผท่ชฟ่ฒ",
"translation_progress": "็ฟป่ญฏ้ฒๅบฆ",
- "background_themes": "่ๆฏ่ฒ่ชฟ",
+ "background_themes": {
+ "label": "่ๆฏ่ฒ่ชฟ"
+ },
"keyboard_shortcuts_enabled": "ๅ็จ้ต็คๅฟซ้้ต",
"keyboard_shortcuts_enabled_description": "่ฅ่ๅ
ถไป็่ฆฝๅจๆ็ณป็ตฑๅฟซๆท้ต่ก็ช๏ผๅฏๅ็จ้ต็คๅฟซ้้ต"
},
@@ -126,7 +165,13 @@
"edit_on_github": "ๅจ GitHub ไธ็ทจ่ผฏ",
"view_guide": "็ฟป่ญฏๆๅ"
},
- "error": {},
+ "error": {
+ "401": "ๆช็ถๆๆฌ",
+ "404": "ๆพไธๅฐ้ ้ข",
+ "500": "ๅ
ง้จไผบๆๅจ้ฏ่ชค",
+ "503": "ๆๅ็กๆณไฝฟ็จ",
+ "default": "็ผ็ๆช้ ๆ็้ฏ่ชค"
+ },
"common": {
"loading": "่ผๅ
ฅไธญโฆ",
"loading_more": "่ผๅ
ฅๆดๅคไธญโฆ",
@@ -155,7 +200,17 @@
"error": "้ฏ่ชค",
"view_on": {
"npm": "ๅจ npm ไธๆชข่ฆ",
- "github": "ๅจ GitHub ไธๆชข่ฆ"
+ "github": "ๅจ GitHub ไธๆชข่ฆ",
+ "gitlab": "ๅจ GitLab ไธๆชข่ฆ",
+ "bitbucket": "ๅจ Bitbucket ไธๆชข่ฆ",
+ "codeberg": "ๅจ Codeberg ไธๆชข่ฆ",
+ "git_repo": "ๅจ Git ๅฒๅญๅบซไธๆชข่ฆ",
+ "forgejo": "ๅจ Forgejo ไธๆชข่ฆ",
+ "gitea": "ๅจ Gitea ไธๆชข่ฆ",
+ "gitee": "ๅจ Gitee ไธๆชข่ฆ",
+ "radicle": "ๅจ Radicle ไธๆชข่ฆ",
+ "sourcehut": "ๅจ SourceHut ไธๆชข่ฆ",
+ "tangled": "ๅจ Tangled ไธๆชข่ฆ"
}
},
"profile": {
@@ -238,6 +293,7 @@
"view_source": "ๆชข่ฆๅๅง็ขผ"
},
"links": {
+ "main": "main",
"repo": "ๅฒๅญๅบซ",
"homepage": "้ฆ้ ",
"issues": "Issues",
@@ -313,7 +369,9 @@
"published": "็ผๅธๆผ",
"weekly_downloads": "ๆฏ้ฑไธ่ผ้",
"keywords": "้้ตๅญ",
- "license": "ๆๆฌ"
+ "license": "ๆๆฌ",
+ "select": "้ธๆๅฅไปถ",
+ "select_maximum": "ๆๅค {count} ๅๅฅไปถๅฏไปฅ้ธๆ"
},
"versions": {
"title": "็ๆฌ",
@@ -328,6 +386,7 @@
"all_covered": "ๆๆ็ๆฌๅๅทฒๅ
ๅซๆผไธๆนๆจ็ฑคไธญใ",
"deprecated_title": "{version}๏ผๅทฒๆฃ็จ๏ผ",
"view_all": "ๆชข่ฆๅ
จ้จ {count} ๅ็ๆฌ",
+ "view_all_versions": "ๆชข่ฆๅ
จ้จ็ๆฌ",
"distribution_title": "่ช็พฉๅ็ๆฌ็พค็ต",
"distribution_modal_title": "็ๆฌ",
"distribution_range_date_same_year": "ๅพ {from} ่ณ {to}, {endYear}",
@@ -339,6 +398,7 @@
"grouping_versions_only_recent": "ๅ
้กฏ็คบ่ฟๆ็ๆฌ",
"grouping_usage_title": "ไฝฟ็จ้",
"grouping_usage_all": "ๅ
จ้จ",
+ "grouping_usage_most_used": "ๆๅธธไฝฟ็จ็ๆฌ",
"recent_versions_only_tooltip": "ๅ
้กฏ็คบ้ๅปไธๅนดๅ
ง็ผๅธ็็ๆฌใ",
"show_low_usage_tooltip": "ๅ
ๅซ็ธฝไธ่ผ้ไฝๆผ 1% ็็ๆฌ็พค็ตใ",
"y_axis_label": "ไธ่ผ้",
@@ -351,7 +411,12 @@
"copy_alt": {
"per_version_analysis": "{version} ็ๆฌไธ่ผไบ {downloads} ๆฌก",
"general_description": "้ทๆขๅๅ็พ {package_name} ๅฅไปถๅจ {date_range_label} ๆ้ใๅพ {first_version} ๅฐ {last_version} ็ {versions_count} ๅ {semver_grouping_mode} ็ๆฌไธ่ผ้ใไธ่ผ้ๆ้ซ็็ๆฌๆฏ {max_downloaded_version}๏ผๅ
ฑ {max_version_downloads} ๆฌกไธ่ผใ{per_version_analysis}ใ{watermark}ใ"
- }
+ },
+ "page_title": "็ๆฌๆญทๅฒ่จ้",
+ "current_tags": "็ถๅๆจ็ฑค",
+ "version_filter_placeholder": "็ฏฉ้ธ็ๆฌโฆ",
+ "version_filter_label": "็ฏฉ้ธ็ๆฌ",
+ "no_match_filter": "ๆฒๆ็ๆฌ็ฌฆๅ {filter}"
},
"dependencies": {
"title": "็ธไพ๏ผ{count} ๅ๏ผ",
@@ -386,7 +451,8 @@
"cancel_add": "ๅๆถๆฐๅขๆๆ่
",
"add_owner": "+ ๆฐๅขๆๆ่
",
"show_more": "๏ผ้กฏ็คบๅฆๅค {count} ๅ๏ผ",
- "show_less": "๏ผๆถๅ๏ผ"
+ "show_less": "๏ผๆถๅ๏ผ",
+ "maintainer_template": "{avatar} {char126}{name}"
},
"trends": {
"granularity": "้ฑๆ",
@@ -402,6 +468,8 @@
"download_file": "ไธ่ผ {fileType}",
"toggle_annotator": "ๅๆๆจ่จปๅทฅๅ
ท",
"toggle_stack_mode": "ๅๆๅ ็ๆจกๅผ",
+ "open_options": "้ๅ้ธ้
",
+ "close_options": "้้้ธ้
",
"legend_estimation": "ไผฐ่จๅผ",
"no_data": "็กๅฏ็จ่ณๆ",
"y_axis_label": "{granularity} {facet}",
@@ -416,6 +484,7 @@
"data_correction": "่ณๆไฟฎๆญฃ",
"average_window": "ๅนณๅ่ฆ็ช",
"smoothing": "ๅนณๆปๅ",
+ "prediction": "้ ไผฐๅผ",
"known_anomalies": "ๅทฒ็ฅ็ฐๅธธ",
"known_anomalies_description": "้ๅฐ็ฑๆฉๅจไบบๆ CI ๅ้ก้ ๆ็ๅทฒ็ฅไธ่ผๅฐๅณฐ้ฒ่กๅ
งๆไฟฎๆญฃใ",
"known_anomalies_ranges": "็ฐๅธธๅ้",
@@ -436,12 +505,15 @@
"estimations": "ๆ็ตๆธๅผๆฏๆ นๆ็ถๅ้ฑๆ็้จๅๆธๆๆๅ็้ ไผฐๅผใ",
"compare": "ๅฅไปถไธ่ผ้ๆฏ่ผๆ็ทๅ๏ผ{package_name}ใ",
"single_package": "ไธ่ผ {package} ๅฅไปถไธ่ผ้็ๆ็ทๅใ",
- "general_description": "Y ่ปธไปฃ่กจไธ่ผๆฌกๆธใX ่ปธไปฃ่กจๆฅๆ็ฏๅ๏ผๅพ {start_date} ่ณ {end_date}๏ผไปฅ {granularity} ็บๆ้ๅฎไฝใ {estimation_notice} {packages_analysis}. {watermark}."
+ "general_description": "Y ่ปธไปฃ่กจไธ่ผๆฌกๆธใX ่ปธไปฃ่กจๆฅๆ็ฏๅ๏ผๅพ {start_date} ่ณ {end_date}๏ผไปฅ {granularity} ็บๆ้ๅฎไฝใ {estimation_notice} {packages_analysis}. {watermark}.",
+ "facet_bar_general_description": "ๆฐดๅนณ้ทๆขๅ: {package} ็ {facet} ๅฐๆฏ({description}). {facet_analysis} {watermark}.",
+ "facet_bar_analysis": "{package_name} ๅผ็บ {value}."
}
},
"downloads": {
"title": "ๆฏ้ฑไธ่ผ้",
- "community_distribution": "ๆชข่ฆ็คพ็พคๆก็จๅๅธ"
+ "community_distribution": "ๆชข่ฆ็คพ็พคๆก็จๅๅธ",
+ "subtitle": "ๆๆ็ๆฌ"
},
"install_scripts": {
"title": "ๅฎ่ฃ่
ณๆฌ",
@@ -734,7 +806,9 @@
"preview": "้ ่ฆฝ",
"code": "็จๅผ็ขผ"
},
- "file_path": "ๆชๆก่ทฏๅพ"
+ "file_path": "ๆชๆก่ทฏๅพ",
+ "binary_file": "ไบ้ฒไฝๆชๆก",
+ "binary_rendering_warning": "ๆชๆก้กๅ \"{contentType}\" ไธๆฏๆด้ ่ฆฝใ"
},
"badges": {
"provenance": {
@@ -796,6 +870,7 @@
"secure": "็ก่ญฆๅ",
"insecure": "ๆ่ญฆๅ"
},
+ "view_selected": "ๆชข่ฆๅทฒ้ธๆๅฅไปถ",
"sort": {
"label": "ๆๅบๅฅไปถ",
"toggle_direction": "ๅๆๆๅบๆนๅ",
@@ -829,7 +904,8 @@
"popularity_score": "ๅๆญก่ฟๅบฆๅๆธ",
"maintenance_score": "็ถญ่ญท็จๅบฆๅๆธ",
"combined_score": "็ธฝๅ",
- "security": "ๅฎๅ
จๆง"
+ "security": "ๅฎๅ
จๆง",
+ "selection": "้ธๆๅฅไปถ"
},
"view_mode": {
"label": "ๆชข่ฆๆจกๅผ",
@@ -918,7 +994,11 @@
"description": "่ๅคฉใๆๅไธฆๅไบซๆณๆณใ",
"cta": "ๅ ๅ
ฅ Discord"
},
- "builders": {},
+ "builders": {
+ "title": "ๅนซๅฉๅปบ็ซ npmx",
+ "description": "ๅ ๅ
ฅๅปบ็ซ่
Discord๏ผๅ่้็ผใ",
+ "cta": "ๅ ๅ
ฅ Builders Discord"
+ },
"follow": {
"title": "ไฟๆๆดๆฐ",
"description": "ๆๆก npmx ็ๆๆฐๅๆ
ใ",
@@ -989,7 +1069,9 @@
"loading": "ๆญฃๅจ่ผๅ
ฅๅฅไปถ่ณๆโฆ",
"error": "่ผๅ
ฅๅฅไปถ่ณๆๅคฑๆใ่ซ้่ฉฆใ",
"empty_title": "้ธๆ่ฆๆฏ่ผ็ๅฅไปถ",
- "empty_description": "ๅจไธๆนๆๅฐไธฆๆฐๅข่ณๅฐ 2 ๅๅฅไปถ๏ผไปฅๆฅ็ๅฎๅๆๆจ็ไธฆๆๆฏ่ผใ"
+ "empty_description": "ๅจไธๆนๆๅฐไธฆๆฐๅข่ณๅฐ 2 ๅๅฅไปถ๏ผไปฅๆฅ็ๅฎๅๆๆจ็ไธฆๆๆฏ่ผใ",
+ "table_view": "่กจๆ ผๆชข่ฆ",
+ "charts_view": "ๅ่กจๆชข่ฆ"
},
"selector": {
"search_label": "ๆๅฐๅฅไปถ",
@@ -1097,7 +1179,11 @@
"file_changes": "ๆชๆก่ฎๆด",
"files_count": "{count} ๅๆชๆก",
"lines_hidden": "ๅทฒ้ฑ่ {count} ่ก",
+ "file_too_large": "ๆชๆกๅคงๅฐ้ๅคง๏ผ็กๆณๆฏ่ผ",
+ "file_size_warning": "ๆชๆกๅคงๅฐ {size} ่ถ
้ 250KB๏ผ็กๆณๆฏ่ผ",
"compare_versions": "ๅทฎ็ฐ",
+ "compare_versions_title": "ๆฏ่ผๆๆฐ็ๆฌ",
+ "version_selector_title": "ๆฏ่ผ็ๆฌ",
"summary": "ๆ่ฆ",
"deps_count": "{count} ๅ็ธไพๅฅไปถ",
"dependencies": "็ธไพๅฅไปถ",
@@ -1126,9 +1212,32 @@
"filter_files_label": "ไพ่ฎๆด้กๅ็ฏฉ้ธๆชๆก"
},
"pds": {
- "join": {},
- "server": {},
- "community": {}
+ "title": "npmx.social",
+ "meta_description": "็บ npmx ็คพ็พคๆไพ็ๅฎๆน AT Protocol ๅไบบ่ณๆไผบๆๅจ๏ผPDS๏ผใ",
+ "join": {
+ "title": "ๅ ๅ
ฅ็คพ็พค",
+ "description": "็ก่ซๆจๆฏๅจ Atmosphere ไธๅปบ็ซ็ฌฌไธๅๅธณ่๏ผ้ๆฏ่ฆ้ท็งป็พๆๅธณ่๏ผ้่ฃก้ฝๆญก่ฟๆจใๆจๅฏไปฅ้ท็งป็ฎๅ็ๅธณ่๏ผ่ไธๆ้บๅคฑๆจ็ไฝฟ็จ่
ๅ็จฑใ่ฒผๆๆ่ท้จ่
ใ",
+ "migrate": "ไฝฟ็จ PDS MOOver ๅทฅๅ
ท้ท็งป"
+ },
+ "server": {
+ "title": "ไผบๆๅจ่ฉณ็ดฐ่ณ่จ",
+ "location_label": "ไผบๆๅจไฝ็ฝฎ๏ผ",
+ "location_value": "ๅพทๅ็ดๅซๅ ก",
+ "infrastructure_label": "ๅบ็ค่จญๆฝ๏ผ",
+ "infrastructure_value": "ๆ็ฎกๆผ Hetzner",
+ "privacy_label": "้ฑ็งไฟ่ญท๏ผ",
+ "privacy_value": "้ตๅพชๆญ็ๅดๆ ผ็่ณๆไฟ่ญทๆณ่ฆ",
+ "learn_more": "็ญ่งฃ npmx ๅฆไฝไฝฟ็จ Atmosphere"
+ },
+ "community": {
+ "title": "่ชฐๅจ้่ฃก",
+ "description": "ไปฅไธๆฏๅจ npmx.social ่ฝ่
ณ็ {count} ๅๅธณ่ไธญ็ไธ้จๅ๏ผ",
+ "loading": "ๆญฃๅจ่ผๅ
ฅ PDS ็คพ็พคๆๅกโฏโฏ",
+ "error": "็กๆณ่ผๅ
ฅ PDS ็คพ็พคๆๅกใ",
+ "empty": "ๅฐ็ก็คพ็พคๆๅกๅฏ้กฏ็คบใ",
+ "view_profile": "ๆฅ็ {handle} ็ๅไบบๆชๆก",
+ "new_accounts": "โฏโฏ้ๆ {count} ๅๆฐๅ ๅ
ฅ Atmosphere ็ๅธณ่"
+ }
},
"privacy_policy": {
"title": "้ฑ็งๆฌๆฟ็ญ",
@@ -1239,5 +1348,11 @@
"p1": "ๅฆๆๆจๅจ {app} ้ๅฐ็ก้็ค้็ค๏ผ่ซๅจๆๅ็ {link} ๆไบค Issue ๅ็ฅๆๅใๆๅ้ๅธธ้่ฆ้ไบๅ ฑๅ๏ผไธฆๆ็กๅ่งฃๆฑบๅ้กใ",
"link": "GitHub ๅฒๅญๅบซ"
}
+ },
+ "action_bar": {
+ "title": "ๆไฝๅ",
+ "selection": "ๅทฒ้ธๆ 0 ๅๅฅไปถ | ๅทฒ้ธๆ 1 ๅๅฅไปถ | {count} ๅๅฅไปถ",
+ "shortcut": "ๆ \"{key}\" ไปฅ่็ฆๆไฝ",
+ "button_close_aria_label": "้้ๆไฝๅ"
}
}
diff --git a/i18n/schema.json b/i18n/schema.json
index fb0cc69fb5..289a299ed7 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -292,6 +292,9 @@
"draft_banner": {
"type": "string"
},
+ "no_posts": {
+ "type": "string"
+ },
"atproto": {
"type": "object",
"properties": {
@@ -418,6 +421,12 @@
"hide_platform_packages_description": {
"type": "string"
},
+ "enable_graph_pulse_loop": {
+ "type": "string"
+ },
+ "enable_graph_pulse_loop_description": {
+ "type": "string"
+ },
"theme": {
"type": "string"
},
@@ -436,9 +445,36 @@
"help_translate": {
"type": "string"
},
- "accent_colors": {
+ "translation_status": {
"type": "string"
},
+ "accent_colors": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "sky": {
+ "type": "string"
+ },
+ "coral": {
+ "type": "string"
+ },
+ "amber": {
+ "type": "string"
+ },
+ "emerald": {
+ "type": "string"
+ },
+ "violet": {
+ "type": "string"
+ },
+ "magenta": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
"clear_accent": {
"type": "string"
},
@@ -446,7 +482,28 @@
"type": "string"
},
"background_themes": {
- "type": "string"
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "neutral": {
+ "type": "string"
+ },
+ "stone": {
+ "type": "string"
+ },
+ "zinc": {
+ "type": "string"
+ },
+ "slate": {
+ "type": "string"
+ },
+ "black": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
},
"keyboard_shortcuts_enabled": {
"type": "string"
@@ -621,6 +678,12 @@
}
},
"additionalProperties": false
+ },
+ "collapse": {
+ "type": "string"
+ },
+ "expand": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -858,6 +921,9 @@
},
"view_source": {
"type": "string"
+ },
+ "skills_cli": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -910,11 +976,32 @@
"docs": {
"type": "object",
"properties": {
+ "contents": {
+ "type": "string"
+ },
+ "default_not_available": {
+ "type": "string"
+ },
"not_available": {
"type": "string"
},
"not_available_detail": {
"type": "string"
+ },
+ "page_title": {
+ "type": "string"
+ },
+ "page_title_name": {
+ "type": "string"
+ },
+ "page_title_version": {
+ "type": "string"
+ },
+ "og_title": {
+ "type": "string"
+ },
+ "view_package": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -1095,6 +1182,12 @@
},
"license": {
"type": "string"
+ },
+ "select": {
+ "type": "string"
+ },
+ "select_maximum": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -1138,6 +1231,9 @@
"view_all": {
"type": "string"
},
+ "view_all_versions": {
+ "type": "string"
+ },
"distribution_title": {
"type": "string"
},
@@ -1159,6 +1255,9 @@
"grouping_versions_title": {
"type": "string"
},
+ "grouping_versions_about": {
+ "type": "string"
+ },
"grouping_versions_all": {
"type": "string"
},
@@ -1168,6 +1267,9 @@
"grouping_usage_title": {
"type": "string"
},
+ "grouping_usage_about": {
+ "type": "string"
+ },
"grouping_usage_all": {
"type": "string"
},
@@ -1212,6 +1314,21 @@
}
},
"additionalProperties": false
+ },
+ "page_title": {
+ "type": "string"
+ },
+ "current_tags": {
+ "type": "string"
+ },
+ "version_filter_placeholder": {
+ "type": "string"
+ },
+ "version_filter_label": {
+ "type": "string"
+ },
+ "no_match_filter": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -1245,6 +1362,9 @@
},
"has_replacement": {
"type": "string"
+ },
+ "vulnerabilities_count": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -1317,6 +1437,9 @@
},
"show_less": {
"type": "string"
+ },
+ "maintainer_template": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -1546,6 +1669,9 @@
"no_esm": {
"type": "string"
},
+ "wasm": {
+ "type": "string"
+ },
"types_label": {
"type": "string"
},
@@ -2569,6 +2695,12 @@
},
"additionalProperties": false
},
+ "view_selected": {
+ "type": "string"
+ },
+ "clear_selected_label": {
+ "type": "string"
+ },
"sort": {
"type": "object",
"properties": {
@@ -2670,6 +2802,9 @@
},
"security": {
"type": "string"
+ },
+ "selection": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -3111,6 +3246,9 @@
}
},
"additionalProperties": false
+ },
+ "pr": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -3502,6 +3640,30 @@
"compare_versions_title": {
"type": "string"
},
+ "comparing_versions_label": {
+ "type": "string"
+ },
+ "version_back_to_package": {
+ "type": "string"
+ },
+ "version_error_message": {
+ "type": "string"
+ },
+ "version_invalid_url_format": {
+ "type": "object",
+ "properties": {
+ "hint": {
+ "type": "string"
+ },
+ "from_version": {
+ "type": "string"
+ },
+ "to_version": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
"version_selector_title": {
"type": "string"
},
@@ -3582,6 +3744,39 @@
},
"filter_files_label": {
"type": "string"
+ },
+ "change_ratio": {
+ "type": "string"
+ },
+ "char_edits": {
+ "type": "string"
+ },
+ "diff_distance": {
+ "type": "string"
+ },
+ "loading_diff": {
+ "type": "string"
+ },
+ "loading_diff_error": {
+ "type": "string"
+ },
+ "merge_modified_lines": {
+ "type": "string"
+ },
+ "no_content_changes": {
+ "type": "string"
+ },
+ "options": {
+ "type": "string"
+ },
+ "view_file": {
+ "type": "string"
+ },
+ "view_in_code_browser": {
+ "type": "string"
+ },
+ "word_wrap": {
+ "type": "string"
}
},
"additionalProperties": false
@@ -4000,6 +4195,75 @@
},
"additionalProperties": false
},
+ "translation_status": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "generated_at": {
+ "type": "string"
+ },
+ "welcome": {
+ "type": "string"
+ },
+ "p1": {
+ "type": "string"
+ },
+ "p1_lang": {
+ "type": "string"
+ },
+ "p1_count": {
+ "type": "string"
+ },
+ "p2": {
+ "type": "string"
+ },
+ "guide": {
+ "type": "string"
+ },
+ "by_locale": {
+ "type": "string"
+ },
+ "by_file": {
+ "type": "string"
+ },
+ "complete_text": {
+ "type": "string"
+ },
+ "missing_text": {
+ "type": "string"
+ },
+ "missing_keys": {
+ "type": "string"
+ },
+ "progress_label": {
+ "type": "string"
+ },
+ "table": {
+ "type": "object",
+ "properties": {
+ "file": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "empty": {
+ "type": "string"
+ },
+ "file_link": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ },
"vacations": {
"type": "object",
"properties": {
@@ -4102,6 +4366,24 @@
},
"additionalProperties": false
},
+ "action_bar": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "selection": {
+ "type": "string"
+ },
+ "shortcut": {
+ "type": "string"
+ },
+ "button_close_aria_label": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
"$schema": {
"type": "string"
}
diff --git a/knip.ts b/knip.ts
index cd012608b8..b40fc70b0d 100644
--- a/knip.ts
+++ b/knip.ts
@@ -4,24 +4,14 @@ const config: KnipConfig = {
workspaces: {
'.': {
entry: [
- 'app/pages/**/*.vue!',
- 'app/components/**/*.vue!',
- 'app/components/**/*.d.vue.ts!',
- 'app/composables/**/*.ts!',
- 'app/middleware/**/*.ts!',
- 'app/plugins/**/*.ts!',
- 'app/utils/**/*.ts!',
- 'server/**/*.ts!',
- 'modules/**/*.ts!',
- 'config/**/*.ts!',
- 'lunaria/**/*.ts!',
- 'shared/**/*.ts!',
'i18n/**/*.ts',
'lunaria.config.ts',
+ 'lunaria/lunaria.ts',
'pwa-assets.config.ts',
+ 'modules/*.ts',
'.lighthouserc.cjs',
'lighthouse-setup.cjs',
- 'uno-preset-rtl.ts!',
+ 'uno-preset-*.ts!',
'scripts/**/*.ts',
],
project: [
@@ -34,8 +24,6 @@ const config: KnipConfig = {
],
ignoreDependencies: [
'@iconify-json/*',
- '@voidzero-dev/vite-plus-core',
- 'vite-plus!',
'puppeteer',
/** Needs to be explicitly installed, even though it is not imported, to avoid type errors. */
'unplugin-vue-router',
@@ -45,9 +33,6 @@ const config: KnipConfig = {
/** Some components import types from here, but installing it directly could lead to a version mismatch */
'vue-router',
- /** Required by @nuxtjs/i18n at runtime but not directly imported in production code */
- '@intlify/shared',
-
/** Oxlint plugins don't get picked up yet */
'@e18e/eslint-plugin',
'eslint-plugin-regexp',
@@ -55,14 +40,20 @@ const config: KnipConfig = {
/** Used in test/e2e/helpers/ which is excluded from knip project scope */
'h3-next',
],
- ignoreUnresolved: ['#components', '#oauth/config'],
+ ignoreUnresolved: ['#oauth/config'],
+ ignoreFiles: [
+ 'app/components/Tooltip/Announce.vue',
+ 'app/components/UserCombobox.vue',
+ '**/*.unused.*',
+ ],
},
'cli': {
project: ['src/**/*.ts!', '!src/mock-*.ts'],
},
'docs': {
- entry: ['app/**/*.{ts,vue,css}'],
- ignoreDependencies: ['docus', 'better-sqlite3', '@nuxtjs/mdc', 'nuxt!'],
+ entry: ['app/**/*.{ts,vue,css}', 'shared/**/*.{ts,vue,css}'],
+ project: ['**/*.{ts,vue,cjs,mjs}'],
+ ignoreDependencies: ['@nuxtjs/mdc'],
},
},
}
diff --git a/lunaria/components.ts b/lunaria/components.ts
index a8c290727d..930b2b422c 100644
--- a/lunaria/components.ts
+++ b/lunaria/components.ts
@@ -6,6 +6,7 @@ import {
type StatusEntry,
} from '@lunariajs/core'
import { BaseStyles, CustomStyles } from './styles.ts'
+import type { I18nStatus } from '../shared/types/i18n-status.ts'
export function html(
strings: TemplateStringsArray,
@@ -33,8 +34,8 @@ function collapsePath(path: string) {
export const Page = (
config: LunariaConfig,
- status: LunariaStatus,
- lunaria: LunariaInstance,
+ status: I18nStatus,
+ _lunaria: LunariaInstance, // currenly not in use
): string => {
return html`
@@ -43,13 +44,13 @@ export const Page = (
${Meta} ${BaseStyles} ${CustomStyles}
- ${Body(config, status, lunaria)}
+ ${Body(config, status)}