jspaint/index.html

406 lines
46 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Paint</title>
<link href="styles/normalize.css" rel="stylesheet" type="text/css">
<link href="styles/layout.css" rel="stylesheet" type="text/css">
<link href="styles/print.css" rel="stylesheet" type="text/css" media="print">
<link href="lib/os-gui/layout.css" rel="stylesheet" type="text/css">
<!-- <link href="lib/os-gui/windows-98.css" rel="stylesheet" type="text/css"> -->
<!-- <link href="lib/os-gui/windows-default.css" rel="stylesheet" type="text/css" title="Windows Default"> -->
<!-- <link href="lib/os-gui/peggys-pastels.css" rel="alternate stylesheet" type="text/css" title="Peggy's Pastels"> -->
<link rel="apple-touch-icon" href="images/icons/apple-icon-180x180.png">
<!-- Chrome will pick the largest image for some reason, instead of the most appropriate one. -->
<!-- <link rel="icon" type="image/png" sizes="192x192" href="images/icons/192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="images/icons/32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="images/icons/96x96.png"> -->
<!-- <link rel="icon" type="image/png" sizes="16x16" href="images/icons/16x16.png"> -->
<link rel="shortcut icon" href="favicon.ico">
<link rel="mask-icon" href="images/icons/safari-pinned-tab.svg" color="red">
<link rel="manifest" href="manifest.webmanifest">
<meta name="msapplication-TileColor" content="#008080">
<meta name="msapplication-TileImage" content="images/icons/ms-icon-144x144.png">
<meta name="theme-color" content="#000080">
<meta name="viewport" content="width=device-width, user-scalable=no">
<meta name="description" content="Classic MS Paint in the browser, with extra features" />
<meta property="og:image:width" content="279">
<meta property="og:image:height" content="279">
<meta property="og:description" content="Classic MS Paint in the browser, with extra features.">
<meta property="og:title" content="JS Paint">
<meta property="og:url" content="https://jspaint.app">
<meta property="og:image" content="https://jspaint.app/images/icons/og-image-279x279.jpg">
<meta name="twitter:title" content="JS Paint">
<meta name="twitter:description" content="Classic MS Paint in the browser, with extra features">
<meta name="twitter:image" content="https://jspaint.app/images/meta/twitter-card-plz-no-crop.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@isaiahodhner">
<meta name="twitter:creator" content="@isaiahodhner">
<script src="src/theme.js"></script>
</head>
<body>
<div id="about-paint" style="display: none">
<h1 id="about-paint-header">
<img src="images/icons/32x32.png" width="32" height="32" id="paint-32x32" alt=""/>
<span id="jspaint-project-name">JS Paint</span>
<small id="jspaint-version" title="expect bugs!">Alpha</small>
<button id="view-project-news">View Project News</button>
</h1>
<div id="maybe-outdated-view-project-news" hidden>
<div id="maybe-outdated-line">
<div id="outdated" hidden>
<div class="on-official-host">
There's a new version of JS Paint. <a id="refresh-to-update" href=".">Refresh</a> to get it.
</div>
<div class="on-third-party-host">
This instance of JS Paint is outdated compared to <a href="https://jspaint.app" target="_blank">jspaint.app</a>.
</div>
<div class="on-dev-host">
This version of JS Paint is outdated compared to <a href="https://jspaint.app" target="_blank">jspaint.app</a>.
</div>
</div>
<div id="checking-for-updates" hidden>
Checking for updates...
</div>
<div id="failed-to-check-if-outdated" hidden>
Couldn't check for updates.
<span class="navigator-offline">You're offline.</span>
<span class="navigator-online">JS Paint may be outdated.</span>
</div>
</div>
</div>
<p>JS Paint is a web-based remake of MS Paint by <a href="https://isaiahodhner.io/">Isaiah Odhner</a>.</p>
<p>Read about the project and <b>extra features</b> on <a href="https://github.com/1j01/jspaint#readme">the README</a>.</p>
<p>Request features and report bugs <a href="https://github.com/1j01/jspaint/issues">on GitHub</a>
or <a href="mailto:isaiahodhner@gmail.com?subject=JS%20Paint">by email</a>.</p>
<p>If you want to support the project &amp; cover domain fees:
<a href="https://www.paypal.me/IsaiahOdhner" target="_blank">paypal.me/IsaiahOdhner</a>
</p>
</div>
<div id="news" hidden>
<article class="news-entry" id="news-2019-winter-update">
<h1>Winter Update</h1>
<time datetime="2019-12-20">2019-12-20</time>
<img width="563" height="334" style="max-width: 100%; height: auto;" src="https://i.postimg.cc/63Wc6vpG/2019-winter-update-candy-cane.gif"/>
<h2>Winter Theme</h2>
<p>
A new UI skin is available, under <b>Extras &gt; Themes &gt; Winter</b>, featuring winter and holiday icons, festive fonts, and a palette with seasonal colors and peppermint patterns.
</p>
<img width="256" height="16" src="images/winter/tools.png"/>
<p>
Merry Christmas and happy Hanukkah!
</p>
<h2>Better History</h2>
<b class="new">New:</b> Jump to any point in the document's history, forwards or backwards, with <b>Edit &gt; History</b> or <kbd>Ctrl+Shift+Y</kbd>.
<ul>
<li>
Click on Text in the history view to go back to text editing.
</li>
<li>
You can return to when a selection existed.
</li>
<li>
Note: these states are skipped over with normal Undo and Redo, so you need to use the History window.
</li>
<li>
Branching history: if you undo, and then make changes, you can get back to everything.
Future states are preserved.
</li>
</ul>
<b class="bad">Warning:</b> History is not saved with the autosave. Document history will be lost if you refresh the page, or close the tab, or if the tab crashes, or if you close or restart your browser, or likely if you're just on a phone and the mobile browser loses focus.
<h2>Improved Mobile Support</h2>
<p>
<b class="new">New:</b> Use two fingers to pan the view.
</p>
<p>
I recently made it easier to grab handles for resizing things.
With that, combined with multitouch panning,
JS Paint is much more useable on a phone.
</p>
<p><b class="bad">Caveat:</b> It's slow on some devices, and parts of the interface are still too small for touch.</p>
</article>
<article class="news-entry" id="news-2019-polygon-text-and-select">
<h1>Polygon, Text, and Select</h1>
<time datetime="2019-12-04">2019-12-04</time>
<p>
Handles are now way easier to drag, with extended click targets, similar to Paint from Windows 7.
It's not unreasonable to use with a touch screen now!
This applies to selections, textboxes, and the main canvas handles.
</p>
<p>
Resizing things while zoomed in is <a href="https://github.com/1j01/jspaint/issues/13#issuecomment-562247085">finally fixed</a>!
</p>
<p>
The Text tool now perfectly previews the pixels that will be placed on the canvas.
What you see is what you get!
Also it retains all browser editing behavior, like spellcheck,
using a convoluted, yet elegant overlaying strategy.
(I prototyped this <a href="https://jsfiddle.net/1j01/wnac09u3/">here</a>
and <a href="https://jsfiddle.net/1j01/qkvfjn1r/">here</a> if you're interested.)
</p>
<p>
With the fill-only option selected, the Polygon tool now previews with inverted lines, like MS Paint does.
(When you finish the polygon, the boundary of the shape matches the preview exactly,
because it actually <em>does</em> draw a stroke, just the same color as the fill.)
</p>
</article>
<article class="news-entry" id="news-2019-zoom-viewport">
<h1>Zoom To Mouse</h1>
<time datetime="2019-10-26">2019-10-26</time>
<p>
<b class="new">New:</b> The Magnifier now lets you zoom to a specific location,
showing a preview of the new viewport.
</p>
<p>
Also, when zooming out with the Magnifier,
or changing the zoom from the toolbar or menus,
the top left corner of the viewport is now kept anchored.
</p>
<p>
Also, pasting a selection will now go to the top left of the viewport,
instead of the entire document.
</p>
</article>
<article class="news-entry" id="news-2019-grid-zoom-cursors">
<h1>The Grid, Custom Zoom, and Dynamic Cursors</h1>
<time datetime="2019-10-09">2019-10-09</time>
<p>
<b class="new">New:</b> The Grid. Zoom to 4x+ and use <b>View &gt; Zoom &gt; Show Grid</b> or <kbd>Ctrl+G</kbd> to enable.
This works with browser zoom as well to provide crisp gridlines even if you zoom in with your browser.
</p>
<p>
<b class="new">New:</b> <b>View &gt; Zoom &gt; Custom Zoom</b>,
including an actually-custom numerical zoom option, unlike MS Paint.
</p>
<p>
<b class="new">New:</b> Dynamic cursors for brush and eraser,
so you now have a preview of exactly where the tool will draw.
</p>
<p>
Also, in the event that your browser clears canvases to free up memory,
you should be more likely to be able to undo to get back to a useful state.
</p>
</article>
<article class="news-entry" id="news-2019-async-clipboard">
<h1>Full Clipboard Support</h1>
<time datetime="2019-09-21">2019-09-21</time>
<p>
JS Paint now lets you copy real image data to the Clipboard, both with keyboard shortcuts and from the Edit menu.
This feature is available in Chrome 76+. Other browsers don't support it yet, as of Sep 2019.
</p>
<p>
Also: paste a URL of an image, and JS Paint will load it.
(This is an alternative to <b>File &gt; Load from URL</b>.)
</p>
</article>
<style>
#news {
background: white;
color: black;
}
.news-entry {
padding: 20px;
max-width: 563px;
}
.news-entry > h1 {
font-size: 1.3em;
margin: 0;
margin-bottom: 0.3em;
}
.news-entry > time {
font-size: 1.2em;
color: gray;
}
.news-entry > h2 {
font-size: 1.9em;
font-weight: normal;
margin: 0;
margin-bottom: 0.3em;
margin-top: 0.3em;
}
.news-entry .new {
color: green;
}
.news-entry .bad {
color: #d11a29;
}
</style>
</div>
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"
></script>
<script>
window.jQuery || document.write('<script src="lib/jquery-3.4.1.min.js"><\/script>');
</script>
<!-- <script src="localization/parse-rc-file.js"></script> -->
<script>
window.hide_hotkey = str => str.replace(/&(\w)/, "$1").replace(/\s?\(.\)/, "");
let localizations = {};
window.localize = (english_text, ...interpolations)=> {
const amp_index = english_text.indexOf("&");
if (amp_index > -1) {
const without_hotkey = english_text.replace(/&/, "");
if (localizations[without_hotkey]) {
const hotkey_def = english_text.slice(amp_index, amp_index + 2);
if (localizations[without_hotkey].toUpperCase().indexOf(hotkey_def.toUpperCase()) > -1) {
return interpolate(localizations[without_hotkey], interpolations);
} else {
if (localizations[without_hotkey].match(/&\w/)) {
// window.console && console.warn(`Localization has differing accelerator (hotkey) hint: '${localizations[without_hotkey]}' vs '${english_text}'`);
// TODO: detect differing accelerator more generally
// (and DRY interpolate() while you're at it)
return localizations[without_hotkey].replace(/&\w/, hotkey_def);
}
return interpolate(`${localizations[without_hotkey]} (${hotkey_def})`, interpolations);
}
}
}
if (localizations[english_text]) {
return interpolate(localizations[english_text], interpolations);
}
return interpolate(english_text, interpolations);
function interpolate(text, interpolations) {
for (let i = 0; i < interpolations.length; i++) {
text = text.replace(`%${i+1}`, interpolations[i]);
}
return text;
}
}
const base_lang = "en";
// This is used to generate the JSON data, but can't be used directly because it's async (the UI is rendered before it loads the text files.)
// Data was obtained with Resource Tuner.
// const get_strings = async (lang)=> {
// const rc_file_text = await (await fetch(`localization/${lang}/combined.rc`)).text();
// return parse_rc_file(rc_file_text);
// };
// const preprocess_localizations = async ()=> {
// const base_strings = await get_strings(base_lang);
// for (const target_lang of ["ko"]) {
// const target_strings = await get_strings(target_lang);
// const localizations = {};
// for (let i = 0; i < target_strings.length; i++) {
// localizations[base_strings[i]] = target_strings[i];
// }
// console.log(target_lang, localizations);
// localStorage[`localizations-${target_lang}`] = JSON.stringify(localizations);
// }
// };
// preprocess_localizations();
let language = base_lang;
try {
language = localStorage.language;
} catch (error) {}
if (language === "ko") {
localizations = {"MS Shell Dlg":"굴림","Printing":"인쇄 중","on the":"프린터 -","Cancel":"취소","New":"새로 만들기(&N)","&New ":"새로 만들기(&N)","New ":"새로 만들기(&N)","OK":"확인","&Help":"도움말(&H)","Help":"도움말(&H)","Custom Zoom":"사용자 정의 확대/축소","Current zoom:":"현재 배율:","Zoom to":"축소/확대 배율","&100%":"100%(&1)","100%":"100%(&1)","&200%":"200%(&2)","200%":"200%(&2)","&400%":"400%(&4)","400%":"400%(&4)","&600%":"600%(&6)","600%":"600%(&6)","&800%":"800%(&8)","800%":"800%(&8)","Color Table":"색상표","Attributes":"속성","&Width:":"너비(&W):","Width:":"너비(&W):","&Height:":"높이(&H):","Height:":"높이(&E):","Units":"단위","&Inches":"인치(&I)","Inches":"인치(&I)","C&m":"센티미터(&M)","Cm":"센티미터(&M)","&Pixels":"픽셀(&P)","Pixels":"픽셀(&P)","Colors":"색(&C)","&Black and white":"흑백(&B)","Black and white":"흑백(&B)","Co&lors":"컬러(&L)","Transparency":"투명","Use &Transparent background color":"투명한 배경색 사용(&T)","Use Transparent background color":"투명한 배경색 사용(&T)","Select &Color...":"색 선택(&C)...","Select Color...":"색 선택(&C)...","Select &Color":"색 선택(&C)","&Default":"기본값(&D)","Default":"기본값(&D)","Flip and Rotate":"대칭 이동/회전","Flip or rotate":"대칭 이동 또는 회전","&Flip horizontal":"수평 대칭 이동(&F)","Flip horizontal":"수평 대칭 이동(&F)","Flip &vertical":"수직 대칭 이동(&V)","Flip vertical":"수직 대칭 이동(&V)","&Rotate by angle":"회전 각도(&R)","Rotate by angle":"회전 각도(&R)","&90°":"90°(&9)","90°":"90°(&9)","&180°":"180°(&1)","180°":"180°(&1)","&270°":"270°(&2)","270°":"270°(&2)","Stretch and Skew":"늘이기/기울이기","Stretch":"늘이기","&Horizontal:":"수평(&H):","Horizontal:":"수평(&O):","&Vertical:":"수직(&V):","Vertical:":"수직(&E):","Skew":"기울이기","H&orizontal:":"수평(&O):","Degrees":"도","V&ertical:":"수직(&E):","Grid Settings":"눈금 설정","&Pixel Grid":"픽셀 눈금(&P)","Pixel Grid":"픽셀 눈금(&P)","&Tile Grid":"바둑판식 눈금(&T)","Tile Grid":"바둑판식 눈금(&T)","pixels":"픽셀","H&eight:":"높이(&E):","&Print...":"인쇄(&P)...","Print...":"인쇄(&P)...","&Print":"인쇄(&P)","&Next Page":"다음 페이지(&N)","Next Page":"다음 페이지(&N)","Pre&v Page":"이전 페이지(&V)","Prev Page":"이전 페이지(&V)","Zoom &In":"확대(&I)","Zoom In":"확대(&I)","Zoom &Out":"축소(&O)","Zoom Out":"축소(&O)","&Close":"닫기(&C)","Close":"닫기(&C)","Tools":"도구","Too many open files.":"열려있는 파일이 너무 많습니다.","Access denied.":"액세스할 수 없습니다.","Invalid file.":"잘못된 파일입니다.","Remove current folder.":"현재 폴더를 제거합니다.","Folder full.":"폴더가 꽉 차있습니다.","Bad seek.":"디스크 찾기 오류입니다.","Hard IO error.":"하드 입출력 오류입니다.","Sharing violation.":"공유 위반입니다.","Lock violation.":"잠금 위반입니다.","Disk full.":"디스크가 꽉 차있습니다.","End of file.":"파일의 끝입니다.","Sends the selection using mail or fax.":"메일이나 팩스를 이용하여 선택 영역을 전송합니다.","Prints the selection.":"선택 영역을 인쇄합니다.","Shows or hides the thumbnail.":"멀리 보기를 표시하거나 숨깁니다.","Shows Paint Help.":"그림판 도움말을 표시합니다.","Changes the window size.":"창 크기를 바꿉니다.","Changes the window position.":"창 위치를 바꿉니다.","Reduces the window to an icon.":"창을 아이콘 크기로 축소합니다.","Enlarges the window to full size.":"창을 전체 화면 크기로 확대합니다.","Switches to the next document window.":"다음 문서 창으로 전환합니다.","Switches to the previous document window.":"이전 문서 창으로 전환합니다.","Closes the active window and asks if you want to save changes.":"현재 창을 닫고 문서를 저장할 것인지 물어 봅니다.","Saving into this format may cause some loss of color information.\nDo you want to continue?":"이 형식으로 저장하면 일부 색상 정보가 손실될 수 있습니다.\n계속하시겠습니까?","Converting to black and white cannot be undone. This action affects the current file and may cause some loss of color information.\nDo you want to continue?":"흑백으로의 변환은 취소할 수 없습니다. 이 동작은 현재 파일에 영향을 주기 때문에 색 정보를 일부 손실할 수도 있습니다. \n계속하시겠습니까?","Bitmaps must be greater than one pixel on a side.":"비트맵의 한쪽 면이 1픽셀보다 커야 합니다.","Generic error.":"일반 오류.","File not found.":"파일을 찾을 수 없습니다.","Bad path.":"경로가 올바르지 않습니다.","No error message is available.":"오류 메시지를 사용할 수 없습니다.","An unsupported operation was attempted.":"지원되지 않는 작업을 시도했습니다.","A required resource was unavailable.":"필요한 리소스를 사용할 수 없습니다.","Out of memory.":"메모리가 부족합니다.","An unknown error has occurred.":"알 수 없는 오류가 발생했습니다.","This is not a valid .PCS file.":"이 파일은 올바른 .PCS 파일이 아닙니다.","This file is open for editing and cannot be overwritten.\nUse a different filename to save your changes.":"이 파일은 편집용으로 열었으므로 겹쳐쓸 수 없습니다.\n다른 파일 이름을 사용하여 변경 내용을 저장하십시오.","Unexpected file format.":"예상치 않은 파일 형식.","%1\nCannot find this file.\nPlease verify that the correct path and file name are given.":"%1\n이 파일을 찾을 수 없습니다.\n올바른 경로와 파일 이름이 주어졌는지 확인하십시오.","Destination disk drive is full.":"대상 디스크 드라이브가 꽉 찼습니다.","Unable to read from %1, it is opened by someone else.":"%1 파일을 읽을 수 없습니다. 다른 사용자가 사용 중입니다.","Unable to write to %1, it is read-only or opened by someone else.":"%1 파일에 기록할 수 없습니다. 읽기 전용이거나 다른 사용자가 사용 중입니다.","An unexpected error occurred while reading %1.":"%1 파일을 읽는 동안 예상치 않은 오류가 발생했습니다.","An unexpected error occurred while writing %1.":"%1 파일에 쓰는 동안 예상치 않은 오류가 발생했습니다.","Pastes a file into the selection.":"파일을 선택 영역에 붙여넣습니다.","Zooms the picture to 100%.":"그림을 원래 크기대로 합니다.","Zooms the picture to 400%.":"그림을 4배로 확대합니다.","Zooms the picture.":"그림 영역을 축소/확대합니다.","Displays the entire picture.":"그림을 전체 화면으로 표시합니다.","Shows or hides the thumbnail view of the picture.":"그림을 멀리 보기로 표시하거나 숨깁니다.","Shows or hides the grid.":"눈금을 표시하거나 숨깁니다.","Shows or hides the text toolbar.":"텍스트 도구 모음을 표시하거나 숨깁니다.","Error getting the Clipboard Data!":"클립보드 데이터를 가져오는데 오류가 일어났습니다!","No Printer Found @ page setup":"프린터를 찾을 수 없습니다(페이지 설정).","Unable to load mail system support.":"메일 시스템 지원 프로그램을 로드할 수 없습니다.","Mail system DLL is invalid.":"메일 시스템 DLL이 올바르지 않습니다.","Send Mail failed to send message.":"[편지 보내기]가 메시지를 보내지 못했습니다.","Sets or clears the text underline attribute.":"텍스트의 밑줄 속성을 설정하거나 해제합니다.","Shows or hides the tooltips.":"도구 설명을 표시하거나 숨깁니다.","Show Paint Help.":"그림판 도움말을 표시합니다.","Flips or rotates the picture or a selection.":"그림이나 선택한 부분을 대칭 이동 또는 회전시킵니다.","Stretches or skews the picture or a selection.":"그림 영역이나 선택 영역을 늘이거나 기울입니다.","Inverts the colors of the picture or a selection.":"그림 영역이나 선택 영역의 색을 반전 표시합니다.","Changes the attributes of the picture.":"그림 영역의 속성을 바꿉니다.","Clears the picture or selection.":"그림 영역이나 선택 영역을 지웁니다.","The font size must be a numeric value.":"글꼴 크기는 숫자여야 합니다.","Contains commands for working with the selected item(s).":"선택된 항목으로 작업할 명령입니다.","Contains commands for selecting and transferring items.":"항목을 선택하고 전송합니다.","Contains commands for customizing this window.":"창을 사용자 정의합니다.","Contains commands for manipulating pictures and setting attributes.":"그림을 조작하고 속성을 설정합니다.","Contains commands for using custom colors and drawing options.":"사용자 정의 색과 그리기 옵션을 사용합니다.","Contains commands for displaying Help for and information about Paint.":"그림판에 관한 도움말과 정보를 표시합니다.","Paint cannot open this file.":"파일을 열 수 없습니다.","Paint cannot read this file.":"파일을 읽을 수 없습니다.","This file is read-only.\nTo save your changes, use a different filename.":"이 파일은 읽기 전용입니다.\n변경 사항을 저장하려면 다른 파일 이름을 사용하십시오.","This file is already open.":"이 파일이 이미 열려 있습니다.","You must save the file before choosing it as Wallpaper.":"배경 무늬로 선택하기 전에 파일을 저장해야 합니다.","Please enter an integer.":"정수를 입력하십시오.","Please enter a number.":"숫자를 입력하십시오.","Please enter an integer between %1 and %2.":"%1에서 %2 사이의 정수를 입력하십시오.","Please enter a number between %1 and %2.":"%1에서 %2 사이의 숫자를 입력하십시오.","Please enter no more than %1 characters.":"%1개 이하의 문자를 입력하십시오.","Please select a button.":"단추를 선택하십시오.","Please enter an integer between 0 and 255.":"0에서 255사이의 정수를 입력하십시오.","Please enter a positive integer.":"양의 정수를 입력하십시오.","Please enter a date and/or time.":"날짜와(나) 시간을 입력하십시오.","Please enter a currency.":"통화를 입력하십시오.","This is not a valid bitmap file, or its format is not currently supported.":"올바른 비트맵 파일이 아니거나 현재 지원되지 않는 형식입니다.","This is not a valid icon.":"올바른 아이콘이 아닙니다.","This is not a valid cursor.":"올바른 커서가 아닙니다.","Save was interrupted, so your file has not been saved.":"저장 작업이 중단되었으므로 파일이 저장되지 않았습니다.","You cannot save to a read-only file.\nUse a different file name.":"읽기 전용 파일에 저장할 수 없습니다.\n다른 파일 이름을 사용하십시오.","Fonts":"글꼴 크기","Thumbnail":"멀리 보기","on %1":"- %1","&One Page":"한 페이지(&O)","One Page":"한 페이지(&O)","&Two Page":"두 페이지(&T)","Two Page":"두 페이지(&T)","Page %u":"%u 페이지","Page %u\nPages %u-%u\n":"%u 페이지\n%u-%u 페이지\n","Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||":"프린터 파일(*.prn)|*.prn|모든 파일(*.*)|*.*||","Print to File":"파일로 인쇄","to %1":"%1(으)로","%1\nUnable to register document.\nThe document may already be open.":"%1\n문서를 등록할 수 없습니다.\n문서가 이미 열려 있는 것 같습니다.","Update %1 before proceeding?":"계속하기 전에 %1을(를) 업데이트하시겠습니까?","Could not update client.":"클라이언트를 업데이트할 수 없습니다.","Failed to register. ActiveX features may not work properly.":"등록할 수 없습니다. ActiveX 기능이 올바르게 작동하지 않을 수 있습니다.","Failed to update the system registry.\nPlease try using REGEDIT.":"시스템 레지스트리를 업데이트할 수 없습니다.\nREGEDIT를 사용해 보십시오.","Unable to read write-only property.":"쓰기 전용 속성을 읽을 수 없습니다.","Unable to write read-only property.":"읽기 전용 속성을 쓸 수 없습니다.","Resets the text be without any attributes.":"텍스트가 속성을 가지지 않도록 다시 설정합니다.","Sets or clears the text bold attribute.":"텍스트의 '굵게' 속성을 설정하거나 해제합니다.","Sets or clears the text italic attribute.":"텍스트의 '기울임꼴' 속성을 설정하거나 해제합니다.","Selects the font used by the text.":"텍스트에 사용할 글꼴을 선택합니다.","Selects the point size of the text.":"텍스트의 글꼴 크기를 선택합니다.","Invalid filename.":"잘못된 파일 이름","Failed to open document.":"문서를 열 수 없습니다.","Failed to save document.":"문서를 저장할 수 없습니다.","Save changes to %1?":"%1의 변경 사항을 저장하시겠습니까?","Failed to create empty document.":"빈 문서를 만들 수 없습니다.","The file is too large to open.":"파일이 너무 커서 열 수 없습니다.","Could not start print job.":"인쇄 작업을 시작할 수 없습니다.","Failed to launch help.":"도움말을 시작할 수 없습니다.","Internal application error.":"내부 응용 프로그램 오류","Command failed.":"명령이 실행되지 않았습니다.","Insufficient memory to perform operation.":"메모리가 부족하여 작업을 수행할 수 없습니다.","System registry entries have been removed and the INI file (if any) was deleted.":"시스템 레지스트리 항목을 제거하고, 해당 파일이 있는 경우 INI 파일도 삭제했습니다.","Not all of the system registry entries (or INI file) were removed.":"시스템 레지스트리 항목 (또는 INI 파일)이 모두 제거되지 않았습니다.","This program requires the file %s, which was not found on this system.":"이 프로그램이 필요한 %s 파일을 시스템에서 찾을 수 없습니다.","This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.":"이 프로그램이 없는 export %s(%s 파일)에 연결되어 있습니다. 이 컴퓨터에 있는 %s이(가) 호환성 없는 버전일 수 있습니다.","Opens this document.":"이 문서를 엽니다.","Creates a new document.":"새 문서를 만듭니다.","Opens an existing document.":"기존 문서를 엽니다.","Closes the active document.":"현재 문서를 닫습니다.","Saves the active document.":"현재 문서를 저장합니다.","Saves the active document with a new name.":"현재 문서를 새로운 이름으로 저장합니다.","Changes the page layout.":"페이지 윤곽을 바꿉니다.","Specifies the default printer setup.":"기본 프린터 설정을 지정합니다.","Prints the active document and sets printing options.":"현재 문서를 인쇄하고 인쇄 옵션을 설정합니다.","Displays full pages.":"전체 페이지를 표시합니다.","No error occurred.":"오류가 발생하지 않았습니다.","An unknown error occurred while accessing %1.":"%1을(를) 액세스하는 동안 알 수 없는 오류가 발생했습니다.","%1 was not found.":"%1을(를) 찾을 수 없습니다.","%1 contains an invalid path.":"%1이(가) 잘못된 경로를 가지고 있습니다.","%1 could not be opened because there are too many open files.":"열려있는 파일이 너무 많기 때문에 %1을(를) 열지 못했습니다.","Access to %1 was denied.":"%1을(를) 액세스할 수 없습니다.","An invalid file handle was associated with %1.":"잘못된 파일 핸들이 %1와(과) 연결되었습니다.","%1 could not be removed because it is the current directory.":"%1은(는) 현재 디렉터리이기 때문에 제거하지 못했습니다.","%1 could not be created because the directory is full.":"디렉터리가 꽉 찼기 때문에 %1을(를) 만들지 못했습니다.","Seek failed on %1":"%1에서 찾지 못했습니다.","A hardware I/O error was reported while accessing %1.":"%1을(를) 액세스하는 동안 하드웨어 I/O 오류가 보고되었습니다.","A sharing violation occurred while accessing %1.":"%1을(를) 액세스하는 동안 공유 위반이 일어났습니다.","A locking violation occurred while accessing %1.":"%1을(를) 액세스하는 동안 잠금 위반이 일어났습니다.","Disk full while accessing %1.":"%1을(를) 액세스하는 동안 디스크가 꽉 찼습니다.","An attempt was made to access %1 past its end.":"%1의 끝을 지나 액세스하려고 했습니다.","&Update %1":"%1 업데이트(&U)","Update %1":"%1 업데이트(&U)","E&xit && Return to %1":"끝내고 %1(으)로 복귀(&X)","Exit Return to %1":"끝내고 %1(으)로 복귀(&X)","This file is already in use.\nClose the program, and then try again.":"이 파일이 이미 사용되고 있습니다.\n프로그램을 닫고 다시 실행하십시오.","Paint cannot save this file.":"이 파일을 저장할 수 없습니다.","All Picture Files":"모든 그림 파일","Sends a picture by using mail or fax.":"메일이나 팩스로 그림을 보냅니다.","Copies the selection to a file.":"선택 영역을 파일에 복사합니다.","Paint cannot save to the same filename with a different file type.\nUse a different filename to save your changes.":"같은 파일 이름을 다른 파일 형식으로 저장할 수 없습니다.\n다른 파일 이름을 사용하여 변경 내용을 저장하십시오.","The selection is now larger than the bitmap.\nWould you like the bitmap enlarged?":"선택 영역이 비트맵보다 큽니다.\n비트맵을 확대하시겠습니까?","The image in the clipboard is larger than the bitmap.\nWould you like the bitmap enlarged?":"클립보드에 저장된 이미지가 비트맵보다 큽니다.\n비트맵을 확대하시겠습니까?","Open":"열기","Save As":"다른 이름으로 저장","All Files (*.*)":"모든 파일(*.*)","Untitled":"제목 없음","Save Copy As":"복사본 저장","an unnamed file":"이름 없는 파일","Shows or hides the tool box.":"도구 상자를 표시하거나 숨깁니다.","Shows or hides the color box.":"색상표를 표시하거나 숨깁니다.","Only a Far East font can be used for vertical editing.":"수직 편집에서는 Far East 글꼴만 사용할 수 있습니다.","Painting":"페인팅","Cannot save file.":"파일을 저장할 수 없습니다.","Error removing temporary file.":"임시 파일을 지우는데 오류가 발생했습니다.","Get Colors":"색 가져오기","Save Colors":"색 저장","Edit Colors":"색 편집","Copy To":"선택 영역 저장","Paste From":"파일로부터 붙여넣기","Select Color":"색 선택","File last saved:":"마지막으로 저장된 파일:","Not Available":"사용할 수 없음","Size on disk:":"디스크 크기:","Draws a straight line with the selected line width.\nLine":"선택한 굵기의 직선을 그립니다.\\r\n선","Draws using an airbrush of the selected size.\nAirbrush":"선택한 크기의 에어브러쉬로 그립니다.\n에어브러쉬","Draws a curved line with the selected line width.\nCurve":"선택한 굵기의 곡선을 그립니다.\n곡선","Draws a polygon with the selected fill style.\nPolygon":"선택한 칠하기 유형의 다각형을 그립니다.\n다각형","Draws a rounded rectangle with the selected fill style.\nRounded Rectangle":"선택한 칠하기 유형의 둥근 직사각형을 그립니다.\n둥근 직사각형 ","Draws a free-form line one pixel wide.\nPencil":"1픽셀 굵기의 자유 곡선을 그립니다.\n연필","Erases a portion of the picture, using the selected eraser shape.\nEraser/Color Eraser":"선택한 지우개 모양으로 그림의 일부를 지웁니다.\n지우개/색 지우개","Changes the magnification.\nMagnifier":"확대율을 바꿉니다.\n돋보기","Picks up a color from the picture for drawing.\nPick Color":"그리기용으로 그림에서 색을 골라냅니다.\n색 골라내기","Restores the window to normal size.":"창을 본래 크기로 복원합니다.","Activates the task list.":"작업 목록을 활성화합니다.","Deletes the selection.":"선택 영역을 삭제합니다.","Erases everything.":"모든 부분을 지웁니다.","Copies the selection and puts it on the Clipboard.":"선택한 영역을 복사하여 클립보드에 저장합니다.","Cuts the selection and puts it on the Clipboard.":"선택한 영역을 잘라내어 클립보드에 저장합니다.","Finds the specified text.":"지정한 텍스트를 찾습니다.","Inserts the contents of the Clipboard.":"클립보드의 내용을 삽입합니다.","Repeats the last action.":"마지막 작업을 반복합니다.","Replaces specific text with different text.":"특정 텍스트를 다른 텍스트로 바꿉니다.","Selects everything.":"전체 문서를 선택합니다.","Undoes the last action.":"마지막 동작을 취소합니다.","Redoes the previously undone action.":"이전에 취소한 작업을 반복합니다.","The file is not in the correct format.":"파일 형식이 올바르지 않습니다.","Bitmap":"비트맵","An attempt was made to write to the reading %1.":"%1을(를) 읽는 동안 쓰려고 했습니다.","An attempt was made to read from the writing %1.":"%1을(를) 쓰는 동안 읽으려고 했습니다.","%1 has a bad format.":"%1이(가) 잘못된 포맷을 가지고 있습니다.","%1 contained an unexpected object.":"%1이(가) 예상하지 않은 개체를 가지고 있습니다.","%1 contains an incorrect schema.":"%1이(가) 잘못된 스키마를 가지고 있습니다.","Linked %s":"연결된 %s","Unknown Type":"알 수 없는 종류","Not enough room to paste text.\nEnlarge the text area and try again.":"텍스트를 붙여넣을 만한 공간이 없습니다.\n텍스트 영역을 늘리고 다시 하십시오.","24-bit Bitmap (*.bmp;*.dib)":"24비트 비트맵(*.bmp;*.dib)","All Files":"모든 파일","Palette|*.pal|":"색상표|*.pal|","untitled.pal":"제목없음.pal","OLE 2.0 was unable to start.\nMake sure that you are using the correct version of the OLE libraries.":"OLE 2.0을 시작할 수 없습니다.\n올바른 버전의 OLE 라이브러리를 사용하고 있는지 확인하십시오.","The grid spacing must be an integer between %d and %d.":"눈금 간격은 %d에서 %d 사이의 정수이어야 합니다.","Displays program information, version number, and copyright.":"프로그램 정보, 버전 번호, 저작권을 표시합니다.","Quits Paint.":"그림판을 마칩니다.","Opens Paint Help.":"그림판 도움말을 엽니다.","Displays instructions about how to use Help.":"도움말 사용법에 관한 설명을 표시합니다.","Displays Help for areas you click on.":"선택한 영역에 대한 도움말을 표시합니다.","Displays Help for the current task or command.":"현재 작업이나 명령에 대한 도움말을 표시합니다.","Centers this bitmap as the desktop wallpaper.":"이 비트맵을 바탕 화면의 배경 무늬로 가운데에 놓습니다.","Tiles this bitmap as the desktop wallpaper.":"이 비트맵을 바탕 화면의 배경 무늬에 바둑판식으로 놓습니다.","Shows or hides the status bar.":"상태 표시줄을 표시하거나 숨깁니다.","Paint\nuntitled\nBitmap Image\nBitmap Files (*.bmp)\n.bmp\nPaint.Picture\nBitmap Image":"그림판\n제목없음\n비트맵 이미지\n비트맵 파일(*.bmp)\n.bmp\nPaint.Picture\n비트맵 이미지","PCX Files":"PCX 파일","Icon Files":"아이콘 파일","Monochrome Bitmap (*.bmp;*.dib)":"흑백 비트맵(*.bmp;*.dib)","16 Color Bitmap (*.bmp;*.dib)":"16색 비트맵(*.bmp;*.dib)","256 Color Bitmap (*.bmp;*.dib)":"256색 비트맵(*.bmp;*.dib)","Places the text.":"텍스트를 넣습니다.","Makes the current selection either opaque or transparent.":"현재 선택한 부분을 불투명하게 또는 투명하게 합니다.","Creates a new color.":"새로운 색을 만듭니다.","Uses a previously saved palette of colors.":"이전에 저장된 색상표를 사용합니다.","Saves the current palette of colors to a file.":"현재 색상표를 파일로 저장합니다.","There is not enough memory or resources to complete operation.\nClose some programs, and then try again.":"메모리나 리소스가 부족하여 작업을 마칠 수 없습니다.\n몇몇 프로그램을 닫고 다시 하십시오.","Low on memory or resources.\nClose some programs, and then try again.":"메모리나 리소스가 부족합니다.\n필요 없는 프로그램을 닫고 다시 하십시오.","Group error.":"그룹 오류.","Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.":"문서를 인쇄할 수 없습니다. 디스크 공간이 충분하고 프린터가 올바르게 작동하는지 확인하십시오.","Draws using a brush with the selected shape and size.\nBrush":"선택한 모양과 크기의 붓으로 그립니다.\n붓","Draws a rectangle with the selected fill style.\nRectangle":"선택한 칠하기 유형으로 직사각형을 그립니다.\n직사각형","Draws a filled rectangle.":"칠해진 직사각형을 그립니다.","Draws an ellipse with the selected fill style.\nEllipse":"선택한 칠하기 유형으로 타원을 그립니다.\n타원","Draws a filled ellipse.":"칠해진 타원을 그립니다.","Paint":"그림판","For Help, click Help Topics on the Help Menu.":"도움말을 보려면 도움말 메뉴의 도움말 항목을 누르십시오.","Select an area on which to get Help.":"도움말을 참고할 항목을 선택하십시오.","%1 in %2":"%2의 %1","Selects a rectangular part of the picture to move, copy, or edit.\nSelect":"이동, 복사, 또는 편집할 그림의 직사각형 부분을 선택합니다.\n선택","Selects a free-form part of the picture to move, copy, or edit.\nFree-Form Select":"이동, 복사, 또는 편집할 그림의 자유형 부분을 선택합니다.\n자유형 선택","Inserts text into the picture.\nText":"그림에 텍스트를 입력합니다.\n텍스트","Fills an area with the current drawing color.\nFill With Color":"현재 그림 색으로 영역을 칠합니다.\n색 칠하기","&Hide":"숨기기(&H)","Hide":"숨기기(&H)","&Edit":"편집(&E)","Edit":"편집(&E)","&Undo":"실행 취소(&U)","Undo":"실행 취소(&U)","&Repeat":"반복(&R)","Repeat":"반복(&R)","Cu&t":"잘라내기(&T)","Cut":"잘라내기(&T)","&Copy":"복사(&C)","Copy":"복사(&C)","&Paste":"붙여넣기(&P)","Paste":"붙여넣기(&P)","Paste &From...":"파일로부터 붙여넣기(&F)...","Paste From...":"파일로부터 붙여넣기(&F)...","Paste &From":"파일로부터 붙여넣기(&F)","C&lear Selection":"선택 영역 지우기(&L)","Clear Selection":"선택 영역 지우기(&L)","Select &All":"모두 선택(&A)","Select All":"모두 선택(&A)","&View":"보기(&V)","View":"보기(&V)","&Tool Box":"도구 상자(&T)","Tool Box":"도구 상자(&T)","&Color Box":"색상표(&C)","Color Box":"색상표(&C)","&Status Bar":"상태 표시줄(&S)","Status Bar":"상태 표시줄(&S)","T&ext Toolbar":"텍스트 도구 모음(&E)","Text Toolbar":"텍스트 도구 모음(&E)","&Zoom":"축소/확대(&Z)","Zoom":"축소/확대(&Z)","&Normal Size":"보통(&N)","Normal Size":"보통(&N)","&Large Size":"크게(&L)","Large Size":"크게(&L)","C&ustom...":"사용자 정의(&U)...","Custom...":"사용자 정의(&U)...","C&ustom":"사용자 정의(&U)","Show &Grid":"눈금 표시(&G)","Show Grid":"눈금 표시(&G)","Show T&humbnail":"멀리 보기 표시(&H)","Show Thumbnail":"멀리 보기 표시(&H)","&View Bitmap":"비트맵 보기(&V)","View Bitmap":"비트맵 보기(&V)","&Image":"이미지(&I)","Image":"이미지(&I)","&Flip/Rotate...":"대칭 이동/회전(&F)...","Flip/Rotate...":"대칭 이동/회전(&F)...","&Flip/Rotate":"대칭 이동/회전(&F)","&Stretch/Skew...":"늘이기/기울이기(&S)...","Stretch/Skew...":"늘이기/기울이기(&S)...","&Stretch/Skew":"늘이기/기울이기(&S)","&Invert Colors":"색 반전(&I)","Invert Colors":"색 반전(&I)","&Attributes...":"속성(&A)...","Attributes...":"속성(&A)...","&Attributes":"속성(&A)","&Clear Image":"이미지 지우기(&C)","Clear Image":"이미지 지우기(&C)","&Draw Opaque":"불투명하게 그리기(&D)","Draw Opaque":"불투명하게 그리기(&D)","&Colors":"색(&C)","&Edit Colors...":"색 편집(&E)...","Edit Colors...":"색 편집(&E)...","&Edit Colors":"색 편집(&E)","&Help Topics":"도움말 항목(&H)","Help Topics":"도움말 항목(&H)","&About Paint":"그림판 정보(&A)","About Paint":"그림판 정보(&A)","Selection":"선택 영역","C&opy To...":"선택 영역 저장(&O)...","Copy To...":"선택 영역 저장(&O)...","C&opy To":"선택 영역 저장(&O)","Flip/&Rotate...":"대칭 이동/회전(&R)...","Flip/&Rotate":"대칭 이동/회전(&R)","Text":"텍스트","&File":"파일(&F)","File":"파일(&F)","&New":"새로 만들기(&N)","&Open...":"열기(&O)...","Open...":"열기(&O)...","&Open":"열기(&O)","&Save":"저장(&S)","Save":"저장(&S)","Save &As...":"다른 이름으로 저장(&A)...","Save As...":"다른 이름으로 저장(&A)...","Save &As":"다른 이름으로 저장(&A)","Print Pre&view":"미리 보기(&V)","Print Preview":"미리 보기(&V)","Page Se&tup...":"페이지 설정(&T)...","Page Setup...":"페이지 설정(&T)...","Page Se&tup":"페이지 설정(&T)","S&end...":"보내기(&E)...","Send...":"보내기(&E)...","S&end":"보내기(&E)","Set As &Wallpaper (Tiled)":"배경 무늬로 설정(바둑판식)(&W)","Set As Wallpaper (Tiled)":"배경 무늬로 설정(바둑판식)(&W)","Set As Wa&llpaper (Centered)":"배경 무늬로 설정(가운데)(&L)","Set As Wallpaper (Centered)":"배경 무늬로 설정(가운데)(&L)","Recent File":"최근에 사용한 파일","E&xit":"끝내기(&X)","Exit":"끝내기(&X)","&Update":"업데이트(&U)","Update":"업데이트(&U)","Save Copy &As...":"복사본 저장(&A)...","Save Copy As...":"복사본 저장(&A)...","Save Copy &As":"복사본 저장(&A)"};
}
</script>
<script src="lib/pep.js"></script>
<script src="lib/canvas.toBlob.js"></script>
<script src="lib/gif.js/gif.js"></script>
<script src="lib/palette.js"></script>
<script src="lib/FileSaver.js"></script>
<script src="lib/font-detective.js"></script>
<script src="lib/libtess.min.js"></script>
<script src="lib/os-gui/parse-theme.js"></script>
<script src="lib/os-gui/$Window.js"></script>
<script src="lib/os-gui/$MenuBar.js"></script>
<script src="lib/imagetracer_v1.2.5.js"></script>
<script src="src/helpers.js"></script>
<script src="src/storage.js"></script>
<script src="src/$Component.js"></script>
<script src="src/$ToolWindow.js"></script>
<script src="src/$ToolBox.js"></script>
<script src="src/$ColorBox.js"></script>
<script src="src/$FontBox.js"></script>
<script src="src/$Handles.js"></script>
<script src="src/OnCanvasObject.js"></script>
<script src="src/OnCanvasSelection.js"></script>
<script src="src/OnCanvasTextBox.js"></script>
<script src="src/OnCanvasHelperLayer.js"></script>
<script src="src/image-manipulation.js"></script>
<script src="src/tool-options.js"></script>
<script src="src/tools.js"></script>
<!--<script src="src/extra-tools.js"></script>-->
<script src="src/edit-colors.js"></script>
<script src="src/functions.js"></script>
<script src="src/manage-storage.js"></script>
<script src="src/imgur.js"></script>
<script src="src/help.js"></script>
<script src="src/simulate-random-gestures.js"></script>
<script src="src/menus.js"></script>
<script src="src/speech-recognition.js"></script>
<script src="src/app.js"></script>
<script src="src/sessions.js"></script>
<script src="lib/konami.js"></script>
<script src="src/vaporwave-fun.js"></script>
<script>
if(/MSIE \d|Trident.*rv:/.test(navigator.userAgent)){
document.write(
'<style>body { text-align: center; }</style>' +
'<div className="not-supported">' +
'<h1 className="not-supported-header">Internet Explorer is not supported!</h1>' +
'<p className="not-supported-details">Try Chrome, Firefox, or Edge.</p>' +
'</div>'
);
}
</script>
<noscript>
<h1><img src="images/icons/32x32.png" width="32" height="32" alt=""/> JS Paint</h1>
<p>This application requires JavaScript to run.</p>
<p>
Assuming this is the official instance of jspaint,
at <a href="https://jspaint.app">https://jspaint.app</a>,
you can safely enable JavaScript.
</p>
<p>You can also check out <a href="https://github.com/1j01/jspaint">the source code and project info</a>.</p>
</noscript>
<svg style="position: absolute; pointer-events: none; bottom: 100%;">
<defs>
<filter id="disabled-inset-filter" x="0" y="0" width="1px" height="1px">
<feColorMatrix
in="SourceGraphic"
type="matrix"
values="
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
-1000 -1000 -1000 1 0
"
result="black-parts-isolated"
/>
<feFlood result="shadow-color" flood-color="var(--ButtonShadow)"/>
<feFlood result="hilight-color" flood-color="var(--ButtonHilight)"/>
<feOffset in="black-parts-isolated" dx="1" dy="1" result="offset"/>
<feComposite in="hilight-color" in2="offset" operator="in" result="hilight-colored-offset"/>
<feComposite in="shadow-color" in2="black-parts-isolated" operator="in" result="shadow-colored"/>
<feMerge>
<feMergeNode in="hilight-colored-offset"/>
<feMergeNode in="shadow-colored"/>
</feMerge>
</filter>
</defs>
</svg>
</body>
</html>