Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
0a47093a6e chore(deps-dev): Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/coverage-v8` from 4.0.10 to 4.0.12
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.12/packages/coverage-v8)

Updates `vitest` from 4.0.10 to 4.0.12
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.12/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 17:19:29 +00:00
17 changed files with 267 additions and 996 deletions

View File

@@ -21,9 +21,9 @@ jobs:
os: [ ubuntu-latest, windows-latest, macos-latest ]
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: '.nvmrc'
- run: npm ci
@@ -41,9 +41,9 @@ jobs:
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: '.nvmrc'
- run: npm ci
@@ -56,7 +56,7 @@ jobs:
# Build and upload desktop CLI artifacts
- name: Set up Go
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
with:
go-version: ^1.23.x
cache-dependency-path: desktop/go.sum
@@ -90,7 +90,7 @@ jobs:
contents: read
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- run: npm ci
- run: npm run test-unit-ci
@@ -108,7 +108,7 @@ jobs:
contents: read
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- run: npm ci
- name: Cypress run
@@ -129,7 +129,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- run: npm ci
- name: Cypress run

View File

@@ -38,11 +38,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
uses: github/codeql-action/init@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,7 +53,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
uses: github/codeql-action/autobuild@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -67,4 +67,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
uses: github/codeql-action/analyze@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5

View File

@@ -16,13 +16,13 @@ jobs:
run:
shell: bash
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
fetch-depth: 0
ref: main
- name: Use Node.js from nvmrc
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: ".nvmrc"
@@ -32,7 +32,7 @@ jobs:
./build/bump-version-changelog.js ${{ inputs.version }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: Bump version to ${{ inputs.version }}
branch: bump-version-to-${{ inputs.version }}

View File

@@ -12,11 +12,11 @@ jobs:
contents: write
if: ${{ github.event_name == 'push' }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: { persist-credentials: false }
- name: Use Node.js from nvmrc
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: '.nvmrc'
@@ -50,6 +50,6 @@ jobs:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- run: docker build -t ghcr.io/maplibre/maputnik:main .
- run: docker push ghcr.io/maplibre/maputnik:main

View File

@@ -15,14 +15,14 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
fetch-depth: 0
ref: main
persist-credentials: false
- name: Use Node.js from nvmrc
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: ".nvmrc"
@@ -42,19 +42,19 @@ jobs:
run:
shell: bash
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
fetch-depth: 0
ref: main
- name: Use Node.js from nvmrc
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version-file: ".nvmrc"
registry-url: "https://registry.npmjs.org"
- name: Set up Go for desktop build
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
with:
go-version: ^1.23.x
cache-dependency-path: desktop/go.sum

View File

@@ -12,7 +12,6 @@
- Upgraded codemirror from version 5 to version 6
- Add code editor to allow editing the entire style
- Add support for sprite object in setting modal
- Allow root-relative urls in the stylefile
- _...Add new stuff here..._
### 🐞 Bug fixes
@@ -26,7 +25,6 @@
- Fix issue with missing bottom error panel
- Fixed headers in left panes (Layers list and Layer editor) to remain visible when scrolling
- Fix error when using a source from localhost
- Fix an issue with scrolling when using the code editor
- _...Add new stuff here..._
## 3.0.0

View File

@@ -178,11 +178,11 @@ describe("modals", () => {
});
it("sprite object", () => {
when.setTextInJsonEditor(JSON.stringify([{ id: "1", url: "2" }]));
when.setTextInJsonEditor(JSON.stringify([{id: "1", url: "2"}]));
when.click("modal:settings.name");
then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
sprite: [{ id: "1", url: "2" }],
sprite: [{ id: "1", url: "2"}],
});
});
@@ -342,8 +342,8 @@ describe("modals", () => {
});
it("add variable", () => {
when.wait(100);
when.click("global-state-add-variable");
when.wait(100);
then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
state: { key1: { default: "value" } },
});
@@ -373,7 +373,6 @@ describe("modals", () => {
it("edit variable key", () => {
when.click("global-state-add-variable");
when.wait(100);
when.setValue("global-state-variable-key:0", "mykey");
when.typeKeys("{enter}");
when.wait(100);
@@ -384,7 +383,6 @@ describe("modals", () => {
it("edit variable value", () => {
when.click("global-state-add-variable");
when.wait(100);
when.setValue("global-state-variable-value:0", "myvalue");
when.typeKeys("{enter}");
when.wait(100);

View File

@@ -1,6 +1,6 @@
export default {
output: "src/locales/$LOCALE/$NAMESPACE.json",
locales: ["de", "fr", "he", "it", "ja", "ko", "zh"],
locales: [ "de", "fr", "he", "it","ja", "zh" ],
// Because some keys are dynamically generated, i18next-parser can't detect them.
// We add these keys manually, so we don't want to remove them.

918
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -30,13 +30,13 @@
"@codemirror/lint": "^6.9.2",
"@codemirror/state": "^6.5.2",
"@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "^6.38.8",
"@codemirror/view": "^6.38.7",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@mapbox/mapbox-gl-rtl-text": "^0.3.0",
"@maplibre/maplibre-gl-geocoder": "^1.9.3",
"@maplibre/maplibre-gl-inspect": "^1.8.2",
"@maplibre/maplibre-gl-geocoder": "^1.9.1",
"@maplibre/maplibre-gl-inspect": "^1.8.0",
"@maplibre/maplibre-gl-style-spec": "^24.3.1",
"array-move": "^4.0.0",
"buffer": "^6.0.3",
@@ -44,10 +44,10 @@
"codemirror": "^6.0.2",
"color": "^5.0.3",
"detect-browser": "^5.3.0",
"downshift": "^9.0.12",
"downshift": "^9.0.10",
"events": "^3.3.0",
"file-saver": "^2.0.5",
"i18next": "^25.7.2",
"i18next": "^25.6.3",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-resources-to-backend": "^1.2.1",
"json-stringify-pretty-compact": "^4.0.0",
@@ -59,7 +59,7 @@
"lodash.get": "^4.4.2",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"maplibre-gl": "^5.14.0",
"maplibre-gl": "^5.13.0",
"maputnik-design": "github:maputnik/design#172b06c",
"ol": "^10.7.0",
"ol-mapbox-style": "^13.1.1",
@@ -72,7 +72,7 @@
"react-collapse": "^5.1.1",
"react-color": "^2.19.3",
"react-dom": "^19.2.0",
"react-i18next": "^16.3.5",
"react-i18next": "^16.3.3",
"react-icons": "^5.5.0",
"react-markdown": "^10.1.0",
"reconnecting-websocket": "^4.4.0",
@@ -99,10 +99,10 @@
},
"devDependencies": {
"@cypress/code-coverage": "^3.14.7",
"@eslint/js": "^9.39.2",
"@eslint/js": "^9.39.1",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@rollup/plugin-replace": "^6.0.2",
"@shellygo/cypress-test-utils": "^6.0.6",
"@shellygo/cypress-test-utils": "^6.0.4",
"@stylistic/eslint-plugin": "^5.6.1",
"@types/codemirror": "^5.60.17",
"@types/color": "^4.2.0",
@@ -126,11 +126,11 @@
"@types/string-hash": "^1.1.3",
"@types/wicg-file-system-access": "^2023.10.7",
"@vitejs/plugin-react": "^5.1.1",
"@vitest/coverage-v8": "^4.0.15",
"@vitest/coverage-v8": "^4.0.14",
"cors": "^2.8.5",
"cypress": "^15.7.1",
"cypress": "^15.6.0",
"cypress-plugin-tab": "^1.0.5",
"eslint": "^9.39.2",
"eslint": "^9.39.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.4.23",
@@ -139,15 +139,15 @@
"istanbul-lib-coverage": "^3.2.2",
"postcss": "^8.5.6",
"react-hot-loader": "^4.13.1",
"sass": "^1.95.0",
"stylelint": "^16.26.1",
"sass": "^1.94.2",
"stylelint": "^16.26.0",
"stylelint-config-recommended-scss": "^16.0.2",
"stylelint-scss": "^6.13.0",
"stylelint-scss": "^6.12.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.49.0",
"typescript-eslint": "^8.48.0",
"uuid": "^13.0.0",
"vite": "^7.3.0",
"vite": "^7.2.4",
"vite-plugin-istanbul": "^7.2.1",
"vitest": "^4.0.15"
"vitest": "^4.0.14"
}
}

View File

@@ -19,7 +19,6 @@ const CodeEditorInternal: React.FC<CodeEditorProps> = (props) => {
value={props.value}
onChange={props.onChange}
className={"maputnik-code-editor"}
withScroll={true}
/>;
</>;
};

View File

@@ -7,7 +7,6 @@ import stringifyPretty from "json-stringify-pretty-compact";
import {createEditor} from "../libs/codemirror-editor-factory";
import type { StylePropertySpecification } from "maplibre-gl";
import type { TransactionSpec } from "@codemirror/state";
export type InputJsonProps = {
value: object
@@ -17,11 +16,6 @@ export type InputJsonProps = {
onBlur?(...args: unknown[]): unknown
lintType: "layer" | "style" | "expression" | "json"
spec?: StylePropertySpecification | undefined
/**
* When setting this and using search and replace, the editor will scroll to the selected text
* Use this only when the editor is the only element in the page.
*/
withScroll?: boolean
};
type InputJsonInternalProps = InputJsonProps & WithTranslation;
@@ -34,7 +28,6 @@ class InputJsonInternal extends React.Component<InputJsonInternalProps, InputJso
static defaultProps = {
onFocus: () => {},
onBlur: () => {},
withScroll: false
};
_view: EditorView | undefined;
_el: HTMLDivElement | null = null;
@@ -81,18 +74,16 @@ class InputJsonInternal extends React.Component<InputJsonInternalProps, InputJso
componentDidUpdate(prevProps: InputJsonProps) {
if (!this.state.isEditing && prevProps.value !== this.props.value) {
this._cancelNextChange = true;
const transactionSpec: TransactionSpec = {
const currentSelection = this._view!.state.selection;
this._view!.dispatch({
changes: {
from: 0,
to: this._view!.state.doc.length,
insert: this.getPrettyJson(this.props.value)
}
};
if (this.props.withScroll) {
transactionSpec.selection = this._view!.state.selection;
transactionSpec.scrollIntoView = true;
}
this._view!.dispatch(transactionSpec);
},
selection: currentSelection,
scrollIntoView: true
});
}
}

View File

@@ -10,7 +10,6 @@ export const supportedLanguages = {
"he": "עברית",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"zh": "简体中文"
} as const;

View File

@@ -36,12 +36,6 @@ describe("validate", () => {
});
});
describe("when URL is root relative", () => {
it("should return ErrorType.None", () => {
expect(validate("/static/style.json")).toBe(ErrorType.None);
});
});
describe("when window.location.protocol is https:", () => {
beforeEach(() => {
Object.defineProperty(window.location, "protocol", {

View File

@@ -45,13 +45,8 @@ function getProtocolSafe(url: string): { protocol?: string, isLocal?: boolean }
}
};
export function validate(url?: string): ErrorType {
if (!url) {
return ErrorType.None;
}
// allow root-relative URLs ("/static/style.json") but do not allow protocol-relative URLs ("//example.com")
if (url.startsWith("/") && !url.startsWith("//")) {
export function validate(url: string): ErrorType {
if (url === "") {
return ErrorType.None;
}

View File

@@ -49,10 +49,9 @@ The following users can help you with the relevant languages:
| de | German | [@josxha](https://github.com/josxha) |
| en | English | [@HarelM](https://github.com/HarelM) |
| fr | French | [@lhapaipai](https://github.com/lhapaipai) |
| he | Hebrew | [@HarelM](https://github.com/HarelM) |
| hr | Hebrew | [@HarelM](https://github.com/HarelM) |
| it | Italian | [@napo](https://github.com/napo) |
| ja | Japanese | [@keichan34](https://github.com/keichan34) |
| ko | Korean | [@jinifor](https://github.com/jinifor) |
| zh | Simplified Chinese | [@jieme](https://github.com/jieme) |
You can test the UI in different languages using the dropdown in the top menu

View File

@@ -1,210 +0,0 @@
{
"Input value": "입력 값",
"Data value": "데이터 값",
"Output value": "값",
"Function": "함수",
"Select a type of data scale (default is 'categorical').": "데이터 스케일 유형을 선택하세요 (기본값 'categorical')",
"Base": "베이스",
"Input a data property to base styles off of.": "스타일의 기준이 될 데이터 속성을 입력하세요.",
"Default": "기본값",
"Stops": "기준점",
"Zoom": "줌",
"Add stop": "기준점 추가",
"Convert to expression": "표현식으로 변환",
"Remove zoom level from stop": "기준점에서 줌 레벨 제거",
"Revert from expression": "표현식에서 되돌리기",
"Delete expression": "표현식 삭제",
"Convert property into a zoom function": "속성을 줌 함수로 변환",
"Convert property to data function": "속성을 데이터 함수로 변환",
"Convert property into a elevation function": "속성을 고도 함수로 변환",
"Layer <1>{formatLayerId(layerId)}</1>: {parsed.data.message}": "레이어 <1>{formatLayerId(layerId)}</1>: {parsed.data.message}",
"switch to layer": "레이어 전환",
"Map": "맵",
"Inspect": "검사",
"Deuteranopia filter": "녹색맹 필터",
"Protanopia filter": "적색맹 필터",
"Tritanopia filter": "청색맹 필터",
"Achromatopsia filter": "전색맹 필터",
"Layers list": "레이어 목록",
"Layer editor": "레이어 편집기",
"Map view": "맵 뷰",
"Maputnik on GitHub": "GitHub의 Maputnik",
"Open": "열기",
"Save": "저장",
"Code Editor": "코드 편집기",
"Data Sources": "데이터 소스",
"Style Settings": "스타일 설정",
"Global State": "전역 상태",
"View": "보기",
"Color accessibility": "색상 접근성",
"Help": "도움말",
"Close": "닫기",
"Click to close the editor": "편집기를 닫으려면 클릭하세요",
"Comments for the current layer. This is non-standard and not in the spec.": "현재 레이어에 대한 설명입니다. 이것은 비표준이며 사양에 포함되지 않습니다.",
"Comments": "주석",
"Comment...": "주석 입력...",
"Max Zoom": "최대 줌",
"Min Zoom": "최소 줌",
"Source": "소스",
"Source Layer": "소스 레이어",
"Type": "유형",
"Nested filters are not supported.": "중첩 필터는 지원되지 않습니다.",
"Upgrade to expression": "표현식으로 업그레이드",
"Filter": "필터",
"every filter matches": "모든 필터 일치",
"no filter matches": "필터 불일치",
"any filter matches": "일부 필터 일치",
"Add filter": "필터 추가",
"You've entered an old style filter.": "이전 스타일 필터를 입력했습니다.",
"Switch to filter editor.": "필터 편집기로 전환합니다.",
"Delete filter block": "필터 블록 삭제",
"Add value": "값 추가",
"Remove array item": "배열 항목 제거",
"Must provide protocol: <1>https://</1>": "프로토콜을 포함해주세요: <1>https://</1>",
"Must provide protocol: <1>http://</1> or <3>https://</3>": "프로토콜을 포함해주세요: <1>http://</1> 또는 <3>https://</3>",
"CORS policy won't allow fetching resources served over http from https, use a <1>https://</1> domain": "CORS 정책으로 인해 https에서 http 리소스를 가져올 수 없습니다. <1>https://</1> 도메인을 사용하세요",
"General layout properties": "일반 레이아웃 속성",
"Text layout properties": "텍스트 레이아웃 속성",
"Icon layout properties": "아이콘 레이아웃 속성",
"Text paint properties": "텍스트 페인트 속성",
"Icon paint properties": "아이콘 페인트 속성",
"Paint properties": "페인트 속성",
"Layout properties": "레이아웃 속성",
"Layer": "레이어",
"JSON Editor": "JSON 편집기",
"Delete": "삭제",
"Duplicate": "복제",
"Show": "표시",
"Hide": "숨기기",
"Move layer up": "레이어 위로 이동",
"Move layer down": "레이어 아래로 이동",
"Layer: {{layerId}}": "레이어: {{layerId}}",
"Layers": "레이어",
"Collapse": "접기",
"Expand": "펼치기",
"Add Layer": "레이어 추가",
"Search": "검색",
"Zoom:": "줌:",
"Close popup": "팝업 닫기",
"cursor:": "커서:",
"center:": "중심:",
"rotation:": "회전:",
"Close modal": "모달 닫기",
"Layer ID already exists": "레이어 ID가 이미 존재합니다",
"Debug": "디버그",
"Options": "옵션",
"Links": "링크",
"<0>Open in OSM</0>. Opens the current view on openstreetmap.org": "<0>OSM에서 열기</0>. 현재 뷰를 openstreetmap.org에서 엽니다",
"Save Style": "스타일 저장",
"Save the JSON style to your computer.": "JSON 스타일을 컴퓨터에 저장합니다.",
"Save as": "다른 이름으로 저장",
"Create HTML": "HTML 생성",
"Key": "키",
"Value": "값",
"Remove variable": "변수 제거",
"Global State Variables": "전역 상태 변수",
"No global state variables defined. Add variables to create reusable values in your style.": "전역 상태 변수가 정의되지 않았습니다. 스타일에서 재사용 가능한 값을 생성하려면 변수를 추가하세요.",
"Add Variable": "변수 추가",
"Cancel": "취소",
"Open Style": "스타일 열기",
"Open local Style": "로컬 스타일 열기",
"Open a local JSON style from your computer.": "컴퓨터에서 로컬 JSON 스타일을 엽니다.",
"Load from URL": "URL에서 불러오기",
"Load from a URL. Note that the URL must have <1>CORS enabled</1>.": "URL에서 불러옵니다. URL은 <1>CORS가 활성화</1>되어 있어야 합니다.",
"Style URL": "스타일 URL",
"Enter URL...": "URL 입력...",
"Gallery Styles": "갤러리 스타일",
"Open one of the publicly available styles to start from.": "공개 스타일 중 하나를 선택하여 시작하세요.",
"Loading style": "스타일 로딩 중",
"Loading: {{requestUrl}}": "로딩: {{requestUrl}}",
"Name": "이름",
"Owner": "소유자",
"Owner ID of the style. Used by Mapbox or future style APIs.": "스타일 소유자의 ID입니다. Mapbox 또는 향후 스타일 API에서 사용됩니다.",
"Sprite URL": "스프라이트 URL",
"Glyphs URL": "글리프 URL",
"Center": "중심 좌표",
"Bearing": "방위각",
"Pitch": "경사각",
"Light anchor": "라이트 고정점",
"Light color": "라이트 색상",
"Light intensity": "라이트 강도",
"Light position": "라이트 위치",
"Terrain source": "터레인 소스",
"Terrain exaggeration": "터레인 고도 배율",
"Transition delay": "전환 지연",
"Transition duration": "전환 지속시간",
"Projection": "투영법",
"Open Layers (experimental)": "레이어 열기 (실험적)",
"Shortcuts menu": "단축키 메뉴",
"Open modal": "모달 열기",
"Export modal": "모달 내보내기",
"Data Sources modal": "데이터 소스 모달",
"Style Settings modal": "스타일 설정 모달",
"Toggle inspect": "검사 전환",
"Focus map": "포커스 맵",
"Debug modal": "디버그 모달",
"Increase the zoom level by 1.": "줌 레벨을 1 증가시킵니다.",
"Increase the zoom level by 2.": "줌 레벨을 2 증가시킵니다.",
"Decrease the zoom level by 1.": "줌 레벨을 1 감소시킵니다.",
"Decrease the zoom level by 2.": "줌 레벨을 2 감소시킵니다.",
"Pan up by 100 pixels.": "100픽셀 위로 이동합니다.",
"Pan down by 100 pixels.": "100픽셀 아래로 이동합니다.",
"Pan left by 100 pixels.": "100픽셀 왼쪽으로 이동합니다.",
"Pan right by 100 pixels.": "100픽셀 오른쪽으로 이동합니다.",
"Increase the rotation by 15 degrees.": "회전을 15도 증가시킵니다.",
"Decrease the rotation by 15 degrees.": "회전을 15도 감소시킵니다.",
"Increase the pitch by 10 degrees.": "경사각을 10도 증가시킵니다.",
"Decrease the pitch by 10 degrees.": "경사각을 10도 감소시킵니다.",
"Shortcuts": "단축키",
"Press <1>ESC</1> to lose focus of any active elements, then press one of:": "<1>ESC</1>를 눌러 활성 요소의 포커스를 해제한 후, 다음 중 하나를 누르세요:",
"If the Map is in focused you can use the following shortcuts": "맵에 포커스가 맞춰진 경우 다음 단축키를 사용할 수 있습니다",
"Remove '{{sourceId}}' source": "'{{sourceId}}' 소스 제거",
"Source ID": "소스 ID",
"Unique ID that identifies the source and is used in the layer to reference the source.": "소스를 식별하고 레이어에서 소스를 참조하는 데 사용되는 고유 ID입니다.",
"Source Type": "소스 유형",
"GeoJSON (JSON)": "GeoJSON (JSON)",
"GeoJSON (URL)": "GeoJSON (URL)",
"Vector (TileJSON URL)": "벡터 (TileJSON URL)",
"Vector (Tile URLs)": "벡터 (Tile URLs)",
"Raster (TileJSON URL)": "래스터 (TileJSON URL)",
"Raster (Tile URLs)": "래스터 (Tile URLs)",
"Raster DEM (TileJSON URL)": "래스터 DEM (TileJSON URL)",
"Raster DEM (XYZ URLs)": "래스터 DEM (XYZ URLs)",
"Vector (PMTiles)": "벡터 (PMTiles)",
"Image": "이미지",
"Video": "비디오",
"Add Source": "소스 추가",
"Sources": "소스",
"Active Sources": "활성 소스",
"Choose Public Source": "공개 소스 선택",
"Add one of the publicly available sources to your style.": "공개적으로 사용 가능한 소스 중 하나를 스타일에 추가하세요.",
"Add New Source": "새 소스 추가",
"Add a new source to your style. You can only choose the source type and id at creation time!": "스타일에 새 소스를 추가합니다. 소스 유형과 ID는 생성 시에만 선택할 수 있습니다!",
"TileJSON URL": "TileJSON URL",
"Tile URL": "타일 URL",
"Scheme Type": "스키마 유형",
"Coord top left": "좌상단 좌표",
"Coord top right": "우상단 좌표",
"Coord bottom right": "우하단 좌표",
"Coord bottom left": "좌하단 좌표",
"Image URL": "이미지 URL",
"Video URL": "비디오 URL",
"GeoJSON URL": "GeoJSON URL",
"GeoJSON": "GeoJSON",
"Cluster": "클러스터",
"PMTiles URL": "PMTiles URL",
"Tile Size": "타일 크기",
"Encoding": "인코딩",
"Error:": "오류:",
"MapTiler Access Token": "MapTiler 액세스 토큰",
"Public access token for MapTiler Cloud.": "MapTiler Cloud용 공개 액세스 토큰입니다.",
"Learn More": "자세히 알아보기",
"Thunderforest Access Token": "Thunderforest 액세스 토큰",
"Public access token for Thunderforest services.": "Thunderforest 서비스용 공개 액세스 토큰입니다.",
"Stadia Maps API Key": "Stadia Maps API 키",
"API key for Stadia Maps.": "Stadia Maps용 API 키 입니다.",
"LocationIQ Access Token": "LocationIQ 액세스 토큰",
"Public access token for LocationIQ services.": "LocationIQ 서비스용 공개 액세스 토큰입니다.",
"Style Renderer": "스타일 렌더러",
"Choose the default Maputnik renderer for this style.": "이 스타일의 기본 Maputnik 렌더러를 선택하세요."
}