diff --git a/app/assets/fonts/glyphicons-halflings-regular.eot b/app/assets/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 000000000..4a4ca865d Binary files /dev/null and b/app/assets/fonts/glyphicons-halflings-regular.eot differ diff --git a/app/assets/fonts/glyphicons-halflings-regular.svg b/app/assets/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..e3e2dc739 --- /dev/null +++ b/app/assets/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > +<font-face units-per-em="1200" ascent="960" descent="-240" /> +<missing-glyph horiz-adv-x="500" /> +<glyph /> +<glyph /> +<glyph unicode="
" /> +<glyph unicode=" " /> +<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> +<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> +<glyph unicode=" " /> +<glyph unicode=" " horiz-adv-x="652" /> +<glyph unicode=" " horiz-adv-x="1304" /> +<glyph unicode=" " horiz-adv-x="652" /> +<glyph unicode=" " horiz-adv-x="1304" /> +<glyph unicode=" " horiz-adv-x="434" /> +<glyph unicode=" " horiz-adv-x="326" /> +<glyph unicode=" " horiz-adv-x="217" /> +<glyph unicode=" " horiz-adv-x="217" /> +<glyph unicode=" " horiz-adv-x="163" /> +<glyph unicode=" " horiz-adv-x="260" /> +<glyph unicode=" " horiz-adv-x="72" /> +<glyph unicode=" " horiz-adv-x="260" /> +<glyph unicode=" " horiz-adv-x="326" /> +<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> +<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> +<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> +<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> +<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> +<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> +<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> +<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> +<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> +<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> +<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> +<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> +<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> +<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> +<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> +<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> +<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> +<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> +<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> +<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> +<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> +<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> +<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> +<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> +<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> +<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> +<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> +<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> +<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> +<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> +<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> +<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> +<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> +<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> +<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> +<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> +<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> +<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> +<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> +<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> +<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> +<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> +<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> +<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> +<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> +<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> +<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> +<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> +<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> +<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> +<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> +<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> +<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> +<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> +<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> +<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> +<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> +<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> +<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> +<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> +<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> +<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> +<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> +<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> +<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> +<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> +<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> +<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> +<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> +<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> +<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> +<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> +<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> +<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> +<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> +<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> +<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> +<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> +<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> +<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> +<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> +<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> +<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> +<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> +<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> +<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> +<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> +<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> +<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> +<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> +<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> +<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> +<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> +<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> +<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> +<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> +<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> +<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> +<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> +<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> +<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> +<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> +<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> +<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> +<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> +<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> +<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> +<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> +<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> +<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> +<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> +<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> +<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> +<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> +<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> +<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> +<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> +<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> +<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> +<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> +<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> +<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> +<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> +<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> +<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> +<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> +<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> +<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> +<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> +<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> +<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> +<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> +<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> +<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> +<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/assets/fonts/glyphicons-halflings-regular.ttf b/app/assets/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 000000000..67fa00bf8 Binary files /dev/null and b/app/assets/fonts/glyphicons-halflings-regular.ttf differ diff --git a/app/assets/fonts/glyphicons-halflings-regular.woff b/app/assets/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 000000000..8c54182aa Binary files /dev/null and b/app/assets/fonts/glyphicons-halflings-regular.woff differ diff --git a/app/assets/images/level/loading_left_wing.png b/app/assets/images/level/loading_left_wing.png index 5b7ba04a7..42ec0336d 100644 Binary files a/app/assets/images/level/loading_left_wing.png and b/app/assets/images/level/loading_left_wing.png differ diff --git a/app/assets/images/level/loading_right_wing.png b/app/assets/images/level/loading_right_wing.png index 7f7ff29da..e9ace047f 100644 Binary files a/app/assets/images/level/loading_right_wing.png and b/app/assets/images/level/loading_right_wing.png differ diff --git a/app/assets/images/pages/play/easy_button.png b/app/assets/images/pages/play/easy_button.png new file mode 100644 index 000000000..c75dc83f9 Binary files /dev/null and b/app/assets/images/pages/play/easy_button.png differ diff --git a/app/assets/images/pages/play/hard_button.png b/app/assets/images/pages/play/hard_button.png new file mode 100644 index 000000000..880b42442 Binary files /dev/null and b/app/assets/images/pages/play/hard_button.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_easy.png b/app/assets/images/pages/play/ladder/humans_ladder_easy.png index ea34dcc5b..095b57688 100644 Binary files a/app/assets/images/pages/play/ladder/humans_ladder_easy.png and b/app/assets/images/pages/play/ladder/humans_ladder_easy.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_hard.png b/app/assets/images/pages/play/ladder/humans_ladder_hard.png index 8cd03225d..90afbd048 100644 Binary files a/app/assets/images/pages/play/ladder/humans_ladder_hard.png and b/app/assets/images/pages/play/ladder/humans_ladder_hard.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_medium.png b/app/assets/images/pages/play/ladder/humans_ladder_medium.png index f4b5fdf94..4d5570ebf 100644 Binary files a/app/assets/images/pages/play/ladder/humans_ladder_medium.png and b/app/assets/images/pages/play/ladder/humans_ladder_medium.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png b/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png index 8e34fc924..d4f1ffffe 100644 Binary files a/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png and b/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_easy.png b/app/assets/images/pages/play/ladder/ogres_ladder_easy.png index d5e4695ff..ae82c36ca 100644 Binary files a/app/assets/images/pages/play/ladder/ogres_ladder_easy.png and b/app/assets/images/pages/play/ladder/ogres_ladder_easy.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_medium.png b/app/assets/images/pages/play/ladder/ogres_ladder_medium.png index 5e327d74b..a86ac9585 100644 Binary files a/app/assets/images/pages/play/ladder/ogres_ladder_medium.png and b/app/assets/images/pages/play/ladder/ogres_ladder_medium.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png b/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png index 16e952728..939a534c7 100644 Binary files a/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png and b/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png differ diff --git a/app/assets/images/pages/play/medium_button.png b/app/assets/images/pages/play/medium_button.png new file mode 100644 index 000000000..41f87572e Binary files /dev/null and b/app/assets/images/pages/play/medium_button.png differ diff --git a/app/assets/images/pages/play/warmup_button.png b/app/assets/images/pages/play/warmup_button.png new file mode 100644 index 000000000..ccc6503b2 Binary files /dev/null and b/app/assets/images/pages/play/warmup_button.png differ diff --git a/app/collections/PatchesCollection.coffee b/app/collections/PatchesCollection.coffee new file mode 100644 index 000000000..456db1e42 --- /dev/null +++ b/app/collections/PatchesCollection.coffee @@ -0,0 +1,10 @@ +PatchModel = require 'models/Patch' +CocoCollection = require 'models/CocoCollection' + +module.exports = class PatchesCollection extends CocoCollection + model: PatchModel + + initialize: (models, options, forModel, @status='pending') -> + super(arguments...) + @url = "#{forModel.urlRoot}/#{forModel.get('original')}/patches?status=#{@status}" + diff --git a/app/initialize.coffee b/app/initialize.coffee index 80c33c9b7..50f880e78 100644 --- a/app/initialize.coffee +++ b/app/initialize.coffee @@ -1,5 +1,21 @@ app = require 'application' +channelSchemas = + 'app': require './schemas/subscriptions/app' + 'bus': require './schemas/subscriptions/bus' + 'editor': require './schemas/subscriptions/editor' + 'errors': require './schemas/subscriptions/errors' + 'misc': require './schemas/subscriptions/misc' + 'play': require './schemas/subscriptions/play' + 'surface': require './schemas/subscriptions/surface' + 'tome': require './schemas/subscriptions/tome' + 'user': require './schemas/subscriptions/user' + 'world': require './schemas/subscriptions/world' + +definitionSchemas = + 'bus': require './schemas/definitions/bus' + 'misc': require './schemas/definitions/misc' + init = -> app.initialize() Backbone.history.start({ pushState: true }) @@ -9,6 +25,10 @@ init = -> treemaExt.setup() filepicker.setKey('AvlkNoldcTOU4PvKi2Xm7z') + # Set up Backbone.Mediator schemas + setUpDefinitions() + setUpChannels() + $ -> init() handleNormalUrls = -> @@ -32,3 +52,10 @@ handleNormalUrls = -> return false +setUpChannels = -> + for channel of channelSchemas + Backbone.Mediator.addChannelSchemas channelSchemas[channel] + +setUpDefinitions = -> + for definition of definitionSchemas + Backbone.Mediator.addDefSchemas definitionSchemas[definition] \ No newline at end of file diff --git a/app/lib/NameLoader.coffee b/app/lib/NameLoader.coffee new file mode 100644 index 000000000..0dd798d80 --- /dev/null +++ b/app/lib/NameLoader.coffee @@ -0,0 +1,17 @@ +CocoClass = require 'lib/CocoClass' + +namesCache = {} + +class NameLoader extends CocoClass + loadNames: (ids) -> + toLoad = (id for id in ids when not namesCache[id]) + return false unless toLoad.length + jqxhr = $.ajax('/db/user/x/names', {type:'POST', data:{ids:toLoad}}) + jqxhr.done @loadedNames + + loadedNames: (newNames) => + _.extend namesCache, newNames + + getName: (id) -> namesCache[id] + +module.exports = new NameLoader() diff --git a/app/lib/deltas.coffee b/app/lib/deltas.coffee new file mode 100644 index 000000000..0782231eb --- /dev/null +++ b/app/lib/deltas.coffee @@ -0,0 +1,158 @@ +### + Good-to-knows: + dataPath: an array of keys that walks you up a JSON object that's being patched + ex: ['scripts', 0, 'description'] + deltaPath: an array of keys that walks you up a JSON Diff Patch object. + ex: ['scripts', '_0', 'description'] +### + +module.exports.expandDelta = (delta, left, schema) -> + flattenedDeltas = flattenDelta(delta) + (expandFlattenedDelta(fd, left, schema) for fd in flattenedDeltas) + + +flattenDelta = (delta, dataPath=null, deltaPath=null) -> + # takes a single jsondiffpatch delta and returns an array of objects with + return [] unless delta + dataPath ?= [] + deltaPath ?= [] + return [{dataPath:dataPath, deltaPath: deltaPath, o:delta}] if _.isArray delta + + results = [] + affectingArray = delta._t is 'a' + for deltaIndex, childDelta of delta + continue if deltaIndex is '_t' + dataIndex = if affectingArray then parseInt(deltaIndex.replace('_', '')) else deltaIndex + results = results.concat flattenDelta( + childDelta, dataPath.concat([dataIndex]), deltaPath.concat([deltaIndex])) + results + + +expandFlattenedDelta = (delta, left, schema) -> + # takes a single flattened delta and converts into an object that can be + # easily formatted into something human readable. + + delta.action = '???' + o = delta.o # the raw jsondiffpatch delta + + if _.isArray(o) and o.length is 1 + delta.action = 'added' + delta.newValue = o[0] + + if _.isArray(o) and o.length is 2 + delta.action = 'modified' + delta.oldValue = o[0] + delta.newValue = o[1] + + if _.isArray(o) and o.length is 3 and o[1] is 0 and o[2] is 0 + delta.action = 'deleted' + delta.oldValue = o[0] + + if _.isPlainObject(o) and o._t is 'a' + delta.action = 'modified-array' + + if _.isPlainObject(o) and o._t isnt 'a' + delta.action = 'modified-object' + + if _.isArray(o) and o.length is 3 and o[1] is 0 and o[2] is 3 + delta.action = 'moved-index' + delta.destinationIndex = o[1] + delta.originalIndex = delta.dataPath[delta.dataPath.length-1] + + if _.isArray(o) and o.length is 3 and o[1] is 0 and o[2] is 2 + delta.action = 'text-diff' + delta.unidiff = o[0] + + humanPath = [] + parentLeft = left + parentSchema = schema + for key, i in delta.dataPath + # TODO: A more comprehensive way of getting child schemas + childSchema = parentSchema?.items or parentSchema?.properties?[key] or {} + childLeft = parentLeft?[key] + humanKey = null + childData = if i is delta.dataPath.length-1 and delta.action is 'added' then o[0] else childLeft + humanKey ?= childData.name or childData.id if childData + humanKey ?= "#{childSchema.title} ##{key+1}" if childSchema.title and _.isNumber(key) + humanKey ?= "#{childSchema.title}" if childSchema.title + humanKey ?= _.string.titleize key + humanPath.push humanKey + parentLeft = childLeft + parentSchema = childSchema + + delta.humanPath = humanPath.join(' :: ') + delta.schema = childSchema + delta.left = childLeft + delta.right = jsondiffpatch.patch childLeft, delta.o unless delta.action is 'moved-index' + + delta + +module.exports.makeJSONDiffer = -> + hasher = (obj) -> obj.name || obj.id || obj._id || JSON.stringify(_.keys(obj)) + jsondiffpatch.create({objectHash:hasher}) + +module.exports.getConflicts = (headDeltas, pendingDeltas) -> + # headDeltas and pendingDeltas should be lists of deltas returned by interpretDelta + # Returns a list of conflict objects with properties: + # headDelta + # pendingDelta + # The deltas that have conflicts also have conflict properties pointing to one another. + + headPathMap = groupDeltasByAffectingPaths(headDeltas) + pendingPathMap = groupDeltasByAffectingPaths(pendingDeltas) + paths = _.keys(headPathMap).concat(_.keys(pendingPathMap)) + + # Here's my thinking: + # A) Conflicts happen when one delta path is a substring of another delta path + # B) A delta from one self-consistent group cannot conflict with another + # So, sort the paths, which will naturally make conflicts adjacent, + # and if one is identified, one path is from the headDeltas, the other is from pendingDeltas + # This is all to avoid an O(nm) brute force search. + + conflicts = [] + paths.sort() + for path, i in paths + continue if i + 1 is paths.length + nextPath = paths[i+1] + if nextPath.startsWith path + headDelta = (headPathMap[path] or headPathMap[nextPath])[0].delta + pendingDelta = (pendingPathMap[path] or pendingPathMap[nextPath])[0].delta + conflicts.push({headDelta:headDelta, pendingDelta:pendingDelta}) + pendingDelta.conflict = headDelta + headDelta.conflict = pendingDelta + + return conflicts if conflicts.length + +groupDeltasByAffectingPaths = (deltas) -> + metaDeltas = [] + for delta in deltas + conflictPaths = [] + if delta.action is 'moved-index' + # every other action affects just the data path, but moved indexes affect a swath + indices = [delta.originalIndex, delta.destinationIndex] + indices.sort() + for index in _.range(indices[0], indices[1]+1) + conflictPaths.push delta.dataPath.slice(0, delta.dataPath.length-1).concat(index) + else + conflictPaths.push delta.dataPath + for path in conflictPaths + metaDeltas.push { + delta: delta + path: (item.toString() for item in path).join('/') + } + _.groupBy metaDeltas, 'path' + +module.exports.pruneConflictsFromDelta = (delta, conflicts) -> + # the jsondiffpatch delta mustn't include any dangling nodes, + # or else things will get removed which shouldn't be, or errors will occur + for conflict in conflicts + prunePath delta, conflict.pendingDelta.deltaPath + if _.isEmpty delta then undefined else delta + +prunePath = (delta, path) -> + if path.length is 1 + delete delta[path] + else + prunePath delta[path[0]], path.slice(1) + keys = (k for k in _.keys(delta[path[0]]) when k isnt '_t') + delete delta[path[0]] if keys.length is 0 \ No newline at end of file diff --git a/app/lib/scripts/defaultScripts.coffee b/app/lib/scripts/defaultScripts.coffee deleted file mode 100644 index 25c851e7b..000000000 --- a/app/lib/scripts/defaultScripts.coffee +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = [ - { - "id": "Add Default Goals", - "channel": "god:new-world-created", - "noteChain": [ - { - "goals": { - "add": [ - { - "name": "Humans Survive", - "id": "humans-survive", - "saveThangs": [ - "humans" - ], - "worldEndsAfter": 3, - "howMany": 1, - "hiddenGoal": true - }, - { - "name": "Ogres Die", - "id": "ogres-die", - "killThangs": [ - "ogres" - ], - "worldEndsAfter": 3, - "hiddenGoal": true - } - ] - } - } - ] - } -] - - -# Could add other default scripts, like not having to redo Victory Playback sequence from scratch every time. diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee index de1d3a030..96e730b78 100644 --- a/app/lib/simulator/Simulator.coffee +++ b/app/lib/simulator/Simulator.coffee @@ -102,6 +102,7 @@ module.exports = class Simulator extends CocoClass sendResultsBackToServer: (results) => @trigger 'statusUpdate', 'Simulation completed, sending results back to server!' console.log "Sending result back to server!" + $.ajax url: "/queue/scoring" data: results @@ -217,7 +218,11 @@ module.exports = class Simulator extends CocoClass createSpellThang: (thang, method, spellKey) -> @spells[spellKey].thangs ?= {} @spells[spellKey].thangs[thang.id] ?= {} - @spells[spellKey].thangs[thang.id].aether = @createAether @spells[spellKey].name, method + spellTeam = @task.getSpellKeyToTeamMap()[spellKey] + playerTeams = @task.getPlayerTeams() + useProtectAPI = true + if spellTeam not in playerTeams then useProtectAPI = false + @spells[spellKey].thangs[thang.id].aether = @createAether @spells[spellKey].name, method, useProtectAPI transpileSpell: (thang, spellKey, methodName) -> slugifiedThangID = _.string.slugify thang.id @@ -229,10 +234,10 @@ module.exports = class Simulator extends CocoClass console.log "Couldn't transpile #{spellKey}:\n#{source}\n", e aether.transpile '' - createAether: (methodName, method) -> + createAether: (methodName, method, useProtectAPI) -> aetherOptions = functionName: methodName - protectAPI: true + protectAPI: useProtectAPI includeFlow: false requiresThis: true yieldConditionally: false @@ -249,6 +254,7 @@ module.exports = class Simulator extends CocoClass class SimulationTask constructor: (@rawData) -> console.log 'Simulating sessions', (session for session in @getSessions()) + @spellKeyToTeamMap = {} getLevelName: -> levelName = @rawData.sessions?[0]?.levelID @@ -273,21 +279,31 @@ class SimulationTask getReceiptHandle: -> @rawData.receiptHandle getSessions: -> @rawData.sessions + + getSpellKeyToTeamMap: -> @spellKeyToTeamMap + + getPlayerTeams: -> _.pluck @rawData.sessions, 'team' generateSpellKeyToSourceMap: -> + playerTeams = _.pluck @rawData.sessions, 'team' spellKeyToSourceMap = {} for session in @rawData.sessions teamSpells = session.teamSpells[session.team] + allTeams = _.keys session.teamSpells + nonPlayerTeams = _.difference allTeams, playerTeams + for team in allTeams + for spell in session.teamSpells[team] + @spellKeyToTeamMap[spell] = team + for nonPlayerTeam in nonPlayerTeams + teamSpells = teamSpells.concat(session.teamSpells[nonPlayerTeam]) teamCode = {} + for thangName, thangSpells of session.code for spellName, spell of thangSpells fullSpellName = [thangName,spellName].join '/' if _.contains(teamSpells, fullSpellName) teamCode[fullSpellName]=spell - + _.merge spellKeyToSourceMap, teamCode - commonSpells = session.teamSpells["common"] - _.merge spellKeyToSourceMap, _.pick(session.code, commonSpells) if commonSpells? - spellKeyToSourceMap diff --git a/app/lib/world/thang.coffee b/app/lib/world/thang.coffee index 426e7541f..e7ed50f05 100644 --- a/app/lib/world/thang.coffee +++ b/app/lib/world/thang.coffee @@ -42,6 +42,9 @@ module.exports = class Thang setGoalState: (goalID, status) -> @world.setGoalState goalID, status + getThangByID: (id) -> + @world.getThangByID id + addComponents: (components...) -> # We don't need to keep the components around after attaching them, but we will keep their initial config for recreating Thangs @components ?= [] diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee index a805abc52..7cee431b0 100644 --- a/app/locale/ar.coffee +++ b/app/locale/ar.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi loading: "تحميل..." saving: "...جاري الحفض" sending: "ارسال..." +# send: "Send" cancel: "الغي" save: "احفض" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee index 44d26ca08..fead6beb4 100644 --- a/app/locale/bg.coffee +++ b/app/locale/bg.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "български език", englishDescri loading: "Зареждане..." saving: "Записване..." sending: "Изпращане..." +# send: "Send" cancel: "Отказ" save: "Запис" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "български език", englishDescri # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "български език", englishDescri # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "български език", englishDescri # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "български език", englishDescri # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "български език", englishDescri # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Промени настройките" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" - user_not_found: "Няма намерен потребител. Провери URL-а?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Нивото не може да бъде заредено: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "български език", englishDescri # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "български език", englishDescri # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "български език", englishDescri # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "български език", englishDescri # body: "Body" version: "Версия" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" results: "Резултати" description: "Описание" or: "или" +# subject: "Subject" email: "Email" # password: "Password" message: "Съобщение" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "български език", englishDescri # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee index 6e8a9811c..a7888b253 100644 --- a/app/locale/ca.coffee +++ b/app/locale/ca.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr loading: "Carregant..." saving: "Guardant..." sending: "Enviant..." +# send: "Send" cancel: "Cancel·lant" save: "Guardar" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr versions: save_version_title: "Guarda una nova versió" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Per guardar els canvis primer has d'acceptar" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr forum_page: "el nostre fòrum" forum_suffix: " sinó" send: "Enviar comentari" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee index a9ccc2b60..805e6d424 100644 --- a/app/locale/cs.coffee +++ b/app/locale/cs.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr loading: "Načítání..." saving: "Ukládání..." sending: "Odesílání..." +# send: "Send" cancel: "Zrušit" save: "Uložit" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr versions: save_version_title: "Uložit novou Verzi" new_major_version: "Nová hlavní Verze" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Před uložením musíte souhlasit s" cla_url: "licencí" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr forum_page: "naše fórum" forum_suffix: "." send: "Odeslat připomínku" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Pomozte přeložit CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr wizard_settings: title: "Nastavení Kouzelníka" customize_avatar: "Upravte vás Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr wizard_tab: "Kouzelník" password_tab: "Heslo" emails_tab: "Emaily" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Zvolte kterou Gravatar fotografii použít" - gravatar_add_photos: "Přidat náhledy a fotografie do Gravatar účtu pro zvolení obrázku" - gravatar_add_more_photos: "Přidat do vašeho Gravatar účtu další fotografie." wizard_color: "Barva Kouzelníkova oblečení" new_password: "Nové heslo" new_password_verify: "Potvrdit" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr error_saving: "Chyba při ukládání" saved: "Změny uloženy" password_mismatch: "Hesla nesouhlasí." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editovat Nastavení" profile_for_prefix: "Profil pro " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Uživatel nenalezen. Zkontrolujte adresu URL?" - gravatar_not_found_mine: "Nenalezli jsme profil asociovaný s:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Přihlásit se " - gravatar_signup_suffix: " k nastavení!" - gravatar_not_found_other: "Bohužel, neexistuje profil asociovaný s touto emailovou adresou." - gravatar_contact: "Kontakt" - gravatar_websites: "Weby" - gravatar_accounts: "Jak zobrazeno na" - gravatar_profile_link: "Účet Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Úroveň se nepodařilo otevřít: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr contact_us: "kontaktujte nás!" hipchat_prefix: "Můžete nás také najít v naší" hipchat_url: "HipChat diskusní místnosti." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Volby?" level_tab_thangs: "Thangy" level_tab_scripts: "Skripty" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr level_tab_components: "Komponenty" level_tab_systems: "Systémy" level_tab_thangs_title: "Současné Thangy" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Výchozí prostředí" level_tab_thangs_add: "Přidat Thangy" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Nastavení" level_component_tab_title: "Současné komponenty" level_component_btn_new: "Vytvořit novou komponentu" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr body: "Tělo" version: "Verze" commit_msg: "Popisek ukládání" -# history: "History" +# version_history: "Version History" version_history_for: "Verze historie pro: " # result: "Result" results: "Výsledky" description: "Popis" or: "nebo" +# subject: "Subject" email: "Email" # password: "Password" message: "Zpráva" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/da.coffee b/app/locale/da.coffee index 85092263e..6605605ba 100644 --- a/app/locale/da.coffee +++ b/app/locale/da.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans loading: "Henter..." saving: "Gemmer..." sending: "Sender..." +# send: "Send" cancel: "Annuller" save: "Gem" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans versions: save_version_title: "Gem ny version" new_major_version: "Ny hoved Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "For at gemme dine ændringer, må du acceptere brugerbetingelserne" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans forum_page: "vores forum" forum_suffix: " istedet." send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hjælp med at oversætte CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans wizard_settings: title: "Troldmandsinstillinger" customize_avatar: "Tilpas din avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Påklædning" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans wizard_tab: "Troldmand" password_tab: "Password" emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Vælg hvilket Gravatar-billede du vil bruge" - gravatar_add_photos: "Tilføj thumbnails og billeder til en Gravatar-konto for din email for at kunne vælge et billede." - gravatar_add_more_photos: "Tilføj flere billeder til din Gravatar-konto for at tilgå dem her." wizard_color: "Farve på Troldmandstøj" new_password: "Nyt Password" new_password_verify: "Bekræft" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans error_saving: "Fejl under Gemning" saved: "Ændringer Gemt" password_mismatch: "Password matcher ikke." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Redigér Indstillinger" profile_for_prefix: "Profil for " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Ingen bruger fundet. Tjek URL'en?" - gravatar_not_found_mine: "Vi kunne ikke finde din profil associeret med:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Opret dig hos " - gravatar_signup_suffix: " for at påbegynde" - gravatar_not_found_other: "Hov, der er ingen profil associeret med denne persons e-mail konto" - gravatar_contact: "Kontakt" - gravatar_websites: "Gravatar hjemmesider" - gravatar_accounts: "Som set på" - gravatar_profile_link: "Fuld Gravatar Profil" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Banen kunne ikke indlæses: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans contact_us: "kontact os!" hipchat_prefix: "Du kan også finde os på vores" hipchat_url: "HipChat kanal." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans level_tab_components: "Komponenter" level_tab_systems: "Systemer" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Startbetingelser" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Instillinger" level_component_tab_title: "Nuværende komponenter" level_component_btn_new: "Opret ny komponent" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans article_search_title: "Søg Artikler Her" # thang_search_title: "Search Thang Types Here" level_search_title: "Søg Baner Her" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans body: "krop" version: "version" commit_msg: "ændringsnotat" - history: "Historie" +# version_history: "Version History" version_history_for: "versionhistorie for: " result: "Resultat" results: "resultater" description: "beskrivelse" or: "eller" +# subject: "Subject" email: "e-mail" # password: "Password" message: "Besked" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/de.coffee b/app/locale/de.coffee index a81a0eb34..a6c4e5c32 100644 --- a/app/locale/de.coffee +++ b/app/locale/de.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra loading: "Lade..." saving: "Speichere..." sending: "Übertrage..." +# send: "Send" cancel: "Abbrechen" save: "Speichern" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra versions: save_version_title: "Neue Version speichern" new_major_version: "Neue Hauptversion" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Damit Änderungen gespeichert werden können, musst du unsere Lizenzbedingungen (" cla_url: "CLA" cla_suffix: ") akzeptieren." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra forum_page: "unser Forum" forum_suffix: "." send: "Sende Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hilf CodeCombat zu übersetzen!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra wizard_settings: title: "Zauberer Einstellungen" customize_avatar: "Individualisiere deinen Avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kleidung" trim: "Applikationen" cloud: "Wolke" +# team: "Team" spell: "Zauber" boots: "Stiefel" hue: "Farbton" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra wizard_tab: "Zauberer" password_tab: "Passwort" emails_tab: "Emails" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Wähle ein Gravatar Bild aus" - gravatar_add_photos: "Füge Vorschaubilder und Fotos zu Deinem Gravatar Account (für Deine Email) hinzu, um ein Bild auswählen zu können" - gravatar_add_more_photos: "Füge mehr Fotos bei deinem Gravatar Account hinzu, um hier mehr Bilder wählen zu können" wizard_color: "Die Farbe der Kleidung des Zauberers" new_password: "Neues Passwort" new_password_verify: "Passwort verifizieren" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra error_saving: "Fehler beim Speichern" saved: "Änderungen gespeichert" password_mismatch: "Passwörter stimmen nicht überein." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Einstellungen ändern" profile_for_prefix: "Profil von " profile_for_suffix: "" - profile: "Profil" - user_not_found: "Kein Nutzer gefunden. URL überprüft?" - gravatar_not_found_mine: "Wir konnten dein Profil nicht finden, das mit folgender Email Adresse verbunden ist:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Melde dich an unter " - gravatar_signup_suffix: " um los zu legen!" - gravatar_not_found_other: "Leider ist kein Profil mit der Email Adresse verknüpft." - gravatar_contact: "Kontakt" - gravatar_websites: "Websites" - gravatar_accounts: "Gesehen auf" - gravatar_profile_link: "Gravatar Profil" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Level konnte nicht geladen werden: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra contact_us: "setze dich mit uns in Verbindung!" hipchat_prefix: "Besuche uns auch in unserem" hipchat_url: "HipChat room." +# back: "Back" revert: "Zurücksetzen" revert_models: "Models zurücksetzen." +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Einige Einstellungsmöglichkeiten?" level_tab_thangs: "Thangs" level_tab_scripts: "Skripte" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra level_tab_components: "Komponenten" level_tab_systems: "Systeme" level_tab_thangs_title: "Aktuelle Thangs" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Startbedingungen" level_tab_thangs_add: "Thangs hinzufügen" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Einstellungen" level_component_tab_title: "Aktuelle Komponenten" level_component_btn_new: "neue Komponente erstellen" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra body: "Inhalt" version: "Version" commit_msg: "Commit Nachricht" - history: "Verlauf" +# version_history: "Version History" version_history_for: "Versionsgeschichte für: " result: "Ergebnis" results: "Ergebnisse" description: "Beschreibung" or: "oder" +# subject: "Subject" email: "Email" password: "Passwort" message: "Nachricht" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/el.coffee b/app/locale/el.coffee index 5fab0b324..036c419dd 100644 --- a/app/locale/el.coffee +++ b/app/locale/el.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre loading: "Φορτώνει..." saving: "Γίνεται αποθήκευση" sending: "Αποστολή ..." +# send: "Send" cancel: "Ακύρωση" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre forum_page: "το φόρουμ μας" # forum_suffix: " instead." send: "Αποστολή σχολίων" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Βοηθήστε στην μετάφραση CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre wizard_tab: "Μάγος" password_tab: "Κωδικός" emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Επέλεξε φωτογραφία \"Gravatar\" για να χρησιμοποιήσεις" - gravatar_add_photos: "Πρόσθεσε μικρογραφίες και φωτογραφίες σε έναν λογαριασμό \"Gravatar\" για το email σου διάλεξε μια φωτογραφία" - gravatar_add_more_photos: "Προσθέστε περισσότερες φωτογραφίες στο Gravatar λογαριασμό σας για να αποκτήσετε πρόσβαση σε αυτά από εδώ." wizard_color: "Χρώμα ρούχων του Μάγου" new_password: "Καινούργιος Κωδικός" new_password_verify: " Επαλήθευση Κωδικού" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre error_saving: "Σφάλμα αποθήκευσης" saved: "Οι αλλαγές αποθηκεύτηκαν" password_mismatch: "Οι κωδικοί δεν ταιριάζουν" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Επεξεργασία ρυθμίσεων" profile_for_prefix: "Προφίλ για " # profile_for_suffix: "" - profile: "Προφίλ" -# user_not_found: "No user found. Check the URL?" - gravatar_not_found_mine: " Δε μπορέσαμε να βρούμε το προφίλ σας που σχετίζετε με:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Εγγραφή στο " -# gravatar_signup_suffix: " to get set up!" - gravatar_not_found_other: "Αλίμονο, δεν υπάρχει προφίλ που σχετίζεται με αυτή τη διεύθυνση ηλεκτρονικού ταχυδρομείου του προσώπου αυτού." - gravatar_contact: "Επικοινωνία" - gravatar_websites: "Ιστοσελίδες" - gravatar_accounts: "Όπως φαίνεται στην" - gravatar_profile_link: "Πλήρη προφίλ \"Gravatar\"" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Το επίπεδο δεν μπόρεσε να φορτωθεί: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee index 6819b143d..1b0c18045 100644 --- a/app/locale/en-AU.coffee +++ b/app/locale/en-AU.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee index ec32cbc7a..04e01b564 100644 --- a/app/locale/en-GB.coffee +++ b/app/locale/en-GB.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index d3c8476ae..18673ed07 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 8c566cc5a..172ecf2cf 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -1,4 +1,4 @@ -module.exports = nativeDescription: "English", englishDescription: "English", translation: +module.exports = nativeDescription: "English", englishDescription: "English", translation: common: loading: "Loading..." saving: "Saving..." @@ -6,6 +6,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr send: "Send" cancel: "Cancel" save: "Save" + publish: "Publish" create: "Create" delay_1_sec: "1 second" delay_3_sec: "3 seconds" @@ -72,6 +73,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr creating: "Creating Account..." sign_up: "Sign Up" log_in: "log in with password" + social_signup: "Or, you can sign up through Facebook or G+:" home: slogan: "Learn to Code JavaScript by Playing a Game" @@ -113,7 +115,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr forum_suffix: " instead." send: "Send Feedback" contact_candidate: "Contact Candidate" - recruitment_reminder: "Use this form to get in touch with candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary for any full-time candidate you hire who stays 90 days, but that part-timers, remote employees, contractors, and interns are free." + recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Help translate CodeCombat!" @@ -126,9 +128,13 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr wizard_settings: title: "Wizard Settings" customize_avatar: "Customize Your Avatar" + active: "Active" + color: "Color" + group: "Group" clothes: "Clothes" trim: "Trim" cloud: "Cloud" + team: "Team" spell: "Spell" boots: "Boots" hue: "Hue" @@ -161,11 +167,37 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr error_saving: "Error Saving" saved: "Changes Saved" password_mismatch: "Password does not match." + job_profile: "Job Profile" + job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." + job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Edit Settings" profile_for_prefix: "Profile for " profile_for_suffix: "" + approved: "Approved" + not_approved: "Not Approved" + looking_for: "Looking for:" + last_updated: "Last updated:" + contact: "Contact" + work_experience: "Work Experience" + education: "Education" + our_notes: "Our Notes" + projects: "Projects" + + employers: + want_to_hire_our_players: "Want to hire expert CodeCombat players?" + contact_george: "Contact George to see our candidates" + candidates_count_prefix: "We currently have " + candidates_count_many: "many" + candidates_count_suffix: "highly skilled and vetted developers looking for work." + candidate_name: "Name" + candidate_location: "Location" + candidate_looking_for: "Looking For" + candidate_role: "Role" + candidate_top_skills: "Top Skills" + candidate_years_experience: "Yrs Exp" + candidate_last_updated: "Last Updated" play_level: level_load_error: "Level could not be loaded: " @@ -284,8 +316,14 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr contact_us: "contact us!" hipchat_prefix: "You can also find us in our" hipchat_url: "HipChat room." + back: "Back" revert: "Revert" revert_models: "Revert Models" + fork_title: "Fork New Version" + fork_creating: "Creating Fork..." + more: "More" + wiki: "Wiki" + live_chat: "Live Chat" level_some_options: "Some Options?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -293,8 +331,11 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr level_tab_components: "Components" level_tab_systems: "Systems" level_tab_thangs_title: "Current Thangs" + level_tab_thangs_all: "All" level_tab_thangs_conditions: "Starting Conditions" level_tab_thangs_add: "Add Thangs" + delete: "Delete" + duplicate: "Duplicate" level_settings_title: "Settings" level_component_tab_title: "Current Components" level_component_btn_new: "Create New Component" @@ -316,7 +357,8 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr article_search_title: "Search Articles Here" thang_search_title: "Search Thang Types Here" level_search_title: "Search Levels Here" - read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." + signup_to_create: "Sign Up to Create a New Content" + read_only_warning2: "Note: you can't save any edits here, because you're not logged in." article: edit_btn_preview: "Preview" @@ -328,7 +370,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr body: "Body" version: "Version" commit_msg: "Commit Message" - history: "History" + version_history: "Version History" version_history_for: "Version History for: " result: "Result" results: "Results" diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index 0e0c67a22..24e96e018 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip loading: "Cargando..." saving: "Guardando..." sending: "Enviando..." +# send: "Send" cancel: "Cancelar" save: "Guardar" create: "Crear" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip versions: save_version_title: "Guardar nueva versión" new_major_version: "Nueva Gran Versión" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip forum_page: "nuestro foro" forum_suffix: "en su lugar." send: "Enviar Comentario" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "¡Ayuda a traducir CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip wizard_settings: title: "Configuración del mago" customize_avatar: "Personaliza tu avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Ropa" # trim: "Trim" cloud: "Nube" +# team: "Team" # spell: "Spell" boots: "Botas" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip wizard_tab: "Hechicero" password_tab: "Contraseña" emails_tab: "Correos" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Seleccione que foto de Gravatar usar" - gravatar_add_photos: "Añadir imágenes en miniatura y fotos a una cuenta de Gravatar para su correo electrónico para elegir una imagen." - gravatar_add_more_photos: "Añada más fotos a su cuenta de Gravatar para accederlas aquí." wizard_color: "Color de Ropas del Hechicero" new_password: "Nueva Contraseña" new_password_verify: "Verificar" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip error_saving: "Error al Guardar" saved: "Cambios Guardados" password_mismatch: "La contraseña no coincide." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editar Configuración" profile_for_prefix: "Perfil para " profile_for_suffix: "" - profile: "Perfil" - user_not_found: "Usuario no encontrado. ¿URL correcta?" - gravatar_not_found_mine: "No hemos podido encontrar tu perfil asociado con " - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registratre en" - gravatar_signup_suffix: "¡Para ponerte en marcha!" - gravatar_not_found_other: "Por desgracia, no hay ningún perfil asociado con la dirección de correo electrónico de esta persona." - gravatar_contact: "Contacto" - gravatar_websites: "Sitios Web" - gravatar_accounts: "Como puede verse en" - gravatar_profile_link: "Perfil Gravatar Completo" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "El nivel no puede ser cargado: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index 0e6aacf92..267cd5d5e 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis loading: "Cargando..." saving: "Guardando..." sending: "Enviando..." +# send: "Send" cancel: "Cancelar" save: "Guardar" create: "Crear" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis versions: save_version_title: "Guardar nueva versión" new_major_version: "Nueva versión principal" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Para guardar los cambios, primero debes aceptar nuestro" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis forum_page: "nuestro foro" forum_suffix: " en su lugar." send: "Envía tu comentario" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "¡Ayuda a traducir CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis wizard_settings: title: "Ajustes del mago" customize_avatar: "Personaliza tu Avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Ropa" # trim: "Trim" - cloud: "Nube" +# cloud: "Cloud" +# team: "Team" spell: "Hechizo" boots: "Botas" hue: "Matiz" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis wizard_tab: "Mago" password_tab: "Contraseña" emails_tab: "Correos electrónicos" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Selecciona una foto de Gravatar para usar" - gravatar_add_photos: "Añade fotos a la cuenta de Gravatar asociada a tu correo electrónico para elegir la imagen." - gravatar_add_more_photos: "Añade más fotos a tu cuenta de Gravatar para tener acceso a ellas aquí." wizard_color: "Color de la ropa del Mago" new_password: "Nueva contraseña" new_password_verify: "Verificar" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis error_saving: "Error al guardar" saved: "Cambios guardados" password_mismatch: "La contraseña no coincide" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Ajustes" profile_for_prefix: "Perfil de " profile_for_suffix: "" - profile: "Perfil" - user_not_found: "No se encontró al usuario. ¿Comprueba la URL?" - gravatar_not_found_mine: "No podemos encontrar el perfil asociado con:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "¡Suscribete a " - gravatar_signup_suffix: " para ponerte en marcha!" - gravatar_not_found_other: "Vaya, no hay un perfil asociado a la dirección de correo electrónico de esta persona." - gravatar_contact: "Contacto" - gravatar_websites: "Paginas web" - gravatar_accounts: "Como se ve en" - gravatar_profile_link: "Perfil de Gravatar completo" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "No se pudo cargar el nivel: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis contact_us: "¡Contacta con nosotros!" hipchat_prefix: "También puedes encontrarnos en nuestra" hipchat_url: "sala de HipChat." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "¿Algunas opciones?" level_tab_thangs: "Objetos" level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis level_tab_components: "Componentes" level_tab_systems: "Sistemas" level_tab_thangs_title: "Objetos actuales" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Condiciones de inicio" level_tab_thangs_add: "Añadir Objetos" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Ajustes" level_component_tab_title: "Componentes Actuales" level_component_btn_new: "Crear Nuevo Componente" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis body: "Cuerpo" version: "Versión" commit_msg: "Mensaje de Asignación o Commit" -# history: "History" +# version_history: "Version History" version_history_for: "Historial de las versiones de: " # result: "Result" results: "Resultados" description: "Descripción" or: "o" +# subject: "Subject" email: "Correo electrónico" # password: "Password" message: "Mensaje" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/es.coffee b/app/locale/es.coffee index 714e0d260..141907ffd 100644 --- a/app/locale/es.coffee +++ b/app/locale/es.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t loading: "Cargando..." saving: "Guardando..." sending: "Enviando..." +# send: "Send" cancel: "Cancelar" save: "Guardar" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t versions: save_version_title: "Guardar Nueva Versión" new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Para poder guardar los cambios, primero debes aceptar nuestra" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t forum_page: "nuestro foro" forum_suffix: " en su lugar." send: "Enviar Comentario" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "¡Ayuda a traducir CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t wizard_settings: title: "Configuración del mago" customize_avatar: "Personaliza tu avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Ropa" trim: "Trim" - cloud: "Nube" +# cloud: "Cloud" +# team: "Team" spell: "Spell" boots: "Botas" hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t wizard_tab: "Hechicero" password_tab: "Contraseña" emails_tab: "Correos" +# job_profile_tab: "Job Profile" admin: "Administrador" - gravatar_select: "Seleccione que foto de Gravatar usar" - gravatar_add_photos: "Añadir imágenes en miniatura y fotos a una cuenta de Gravatar para su correo electrónico para elegir una imagen." - gravatar_add_more_photos: "Añada más fotos a su cuenta de Gravatar para accederlas aquí." wizard_color: "Color de Ropas del Hechicero" new_password: "Nueva Contraseña" new_password_verify: "Verificar" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t error_saving: "Error al guardar" saved: "Cambios guardados" password_mismatch: "La contraseña no coincide" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editar Ajustes" profile_for_prefix: "Perfil de " # profile_for_suffix: "" - profile: "Perfil" - user_not_found: "No se encontró al usuario. ¿Comprueba la URL?" - gravatar_not_found_mine: "No podemos encontrar el prefil asociado con:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Suscribete " - gravatar_signup_suffix: " para ponerte en marcha!" - gravatar_not_found_other: "Vaya, no hay un perfil asociado a la dirección de correo electrónico de esta persona." - gravatar_contact: "Contacto" - gravatar_websites: "Paginas web" - gravatar_accounts: "Como puedes ver" - gravatar_profile_link: "Prefil de Gravatar completo" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "No se pudo cargar el nivel: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Ajustes" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t body: "Cuerpo" version: "Versión" # commit_msg: "Commit Message" - history: "Historial" +# version_history: "Version History" # version_history_for: "Version History for: " result: "Resultado" results: "Resultados" description: "Descripción" or: "o" +# subject: "Subject" email: "Email" password: "Contraseña" message: "Mensaje" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee index 4534cb313..dd83f940b 100644 --- a/app/locale/fa.coffee +++ b/app/locale/fa.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", loading: "...در حال بارگذاری" saving: "...در حال ذخیره سازی" sending: "...در حال ارسال" +# send: "Send" cancel: "لغو" save: "ذخیره " # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", versions: save_version_title: "ذخیره کردن نسخه جدید" new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "To save changes, first you must agree to our" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", forum_page: "فاروم ما" forum_suffix: " به جای" send: "ارسال بازخورد" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "کمک به ترجمه کمبت کد!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", wizard_settings: title: "تنظیمات جادویی" customize_avatar: "آواتار خود را شکل دهید" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", wizard_tab: "جادو" password_tab: "کلمه عبور" emails_tab: "ایمیل ها" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: " استفاده شود Gravatar انتخاب کنید کدام تصویر" - gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "یا" +# subject: "Subject" email: "ایمیل" # password: "Password" message: "پیام" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee index 6e340312c..0c90e6fad 100644 --- a/app/locale/fi.coffee +++ b/app/locale/fi.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index d21af1b64..1c8bae6dd 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t loading: "Chargement..." saving: "Sauvegarde..." sending: "Envoi..." +# send: "Send" cancel: "Annuler" save: "Sauvegarder" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t versions: save_version_title: "Enregistrer une nouvelle version" new_major_version: "Nouvelle version majeure" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Pour enregistrer vos modifications vous devez d'abord accepter notre" cla_url: "Copyright" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t forum_page: "notre forum" forum_suffix: " à la place." send: "Envoyer un commentaire" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Aidez à traduire CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t wizard_settings: title: "Paramètres du Magicien" customize_avatar: "Personnaliser votre avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Vêtements" trim: "Tailleur" cloud: "Nuage" +# team: "Team" spell: "Sort" boots: "Bottes" hue: "Teinte" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t wizard_tab: "Magicien" password_tab: "Mot de passe" emails_tab: "Emails" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Sélectionnez la photo Gravatar à utiliser" - gravatar_add_photos: "Ajouter des vignettes et des photos sur un compte Gravatar pour votre e-mail pour choisir une image." - gravatar_add_more_photos: "Ajouter plus de photos à votre compte Gravatar pour y accéder ici." wizard_color: "Couleur des vêtements du Magicien" new_password: "Nouveau mot de passe" new_password_verify: "Vérifier" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "français", englishDescription: "French", t error_saving: "Problème d'enregistrement" saved: "Changements sauvegardés" password_mismatch: "Le mot de passe ne correspond pas." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Éditer les préférences" profile_for_prefix: "Profil pour " profile_for_suffix: "" - profile: "Profil" - user_not_found: "Aucun utilisateur trouvé. Vérifier l'URL?" - gravatar_not_found_mine: "Nous n'avons pas pu trouver votre profil associé à: " - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "S'incrire à " - gravatar_signup_suffix: " pour commencer !" - gravatar_not_found_other: "Hélas, il n'y a pas de profil associé à l'adresse électronique de cette personne." - gravatar_contact: "Contact" - gravatar_websites: "Sites" - gravatar_accounts: "As Seen On" - gravatar_profile_link: "Profil Gravatar complet" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Le niveau ne peut pas être chargé: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "français", englishDescription: "French", t contact_us: "contactez nous!" hipchat_prefix: "Vous pouvez aussi nous trouver dans notre " hipchat_url: "conversation HipChat." +# back: "Back" revert: "Annuler" revert_models: "Annuler les modèles" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Quelques options?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "français", englishDescription: "French", t level_tab_components: "Composants" level_tab_systems: "Systèmes" level_tab_thangs_title: "Thangs actuels" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Conditions de départ" level_tab_thangs_add: "ajouter des Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Paramètres" level_component_tab_title: "Composants actuels" level_component_btn_new: "Créer un nouveau composant" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t article_search_title: "Rechercher dans les articles" thang_search_title: "Rechercher dans les types Thang" level_search_title: "Rechercher dans les niveaux" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t body: "Corps" version: "Version" commit_msg: "Message de mise à jour" - history: "Historique" +# version_history: "Version History" version_history_for: "Historique des versions pour : " result: "Resultat" results: "Résultats" description: "Description" or: "ou" +# subject: "Subject" email: "Email" password: "Mot de passe" message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/he.coffee b/app/locale/he.coffee index 888c39dca..acef8bd72 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", loading: "...טוען" saving: "...שומר" sending: "...שולח" +# send: "Send" cancel: "ביטול" save: "שמור" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", versions: save_version_title: "שמור גרסה חדשה" new_major_version: "גרסה חשובה חדשה" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "כדי לשמור יש להירשם לאתר" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", forum_page: "פורום שלנו" forum_suffix: " במקום." send: "שלח אימייל" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "עזור לתרגם את CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", wizard_settings: title: "הגדרות קוסם" customize_avatar: "עצב את הדמות שלך" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "בגדים" trim: "קישוט" cloud: "ענן" +# team: "Team" spell: "כישוף" boots: "מגפיים" hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", wizard_tab: "קוסם" password_tab: "סיסמה" emails_tab: "אימיילים" +# job_profile_tab: "Job Profile" admin: "אדמין" - gravatar_select: "תבחר באיזו תמונת גרבטר אתה רוצה להישתמש" - gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." - gravatar_add_more_photos: "תוסיף עוד תמונות לחשבון הגרבטר שלך כדי להסיג אותם כאן." wizard_color: "צבע הקוסם" new_password: "סיסמה חדשה" new_password_verify: "חזור על הסיסמה שנית" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", error_saving: "בעיה בשמירה" saved: "השינויים נשמרו" password_mismatch: "סיסמאות לא זהות" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "ערוך הגדרות" profile_for_prefix: "פרופיל ל" profile_for_suffix: "" - profile: "פרופיל" - user_not_found: "משתמש לא נמצא. בדקת את הURL?" - gravatar_not_found_mine: "לא הצלחנו למצא חשבון גרבטר המותאם עם: " - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "הירשם ב" - gravatar_signup_suffix: "כדי לקבל תמונת חשבון" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee index efd9c22bc..5888b5b7d 100644 --- a/app/locale/hi.coffee +++ b/app/locale/hi.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee index e48c305af..3a10608b9 100644 --- a/app/locale/hu.coffee +++ b/app/locale/hu.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t loading: "Töltés..." saving: "Mentés..." sending: "Küldés..." +# send: "Send" cancel: "Mégse" save: "Mentés" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t versions: save_version_title: "Új verzió mentése" new_major_version: "Új főverzió" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "A módosítások elmentéséhez el kell fogadnod a " cla_url: "CLA" cla_suffix: "tartalmát." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t forum_page: "fórumban" forum_suffix: " is." send: "Visszajelzés küldése" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Segítsd lefordítani a CodeCombat-ot!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t wizard_settings: title: "Varázsló beállításai" customize_avatar: "Állítsd be az Avatarod!" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Öltözetek" # trim: "Trim" cloud: "Felhő" +# team: "Team" spell: "Varázslat" boots: "Lábbelik" hue: "Árnyalat" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t wizard_tab: "Varázsló" password_tab: "Jelszó" emails_tab: "Levelek" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Válassz egy Gravatar képet!" - gravatar_add_photos: "Adj képeket a Gravatar fiókodhoz" - gravatar_add_more_photos: "Adj több képet a Gravatar fiókodhoz, hogy itt is elérd őket" wizard_color: "Varázslód színe" new_password: "Új jelszó" new_password_verify: "Új jelszó megismétlése" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t error_saving: "Hiba a mentés során" saved: "Változtatások elmentve" password_mismatch: "A jelszavak nem egyeznek." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Beállítások szerkesztése" # profile_for_prefix: "Profile for " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Nincs ilyen felhasználó! Jó az URL?" - gravatar_not_found_mine: "Nem találtunk profilt ezzel a címmel:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Regisztrálj az " - gravatar_signup_suffix: " oldalon!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." - gravatar_contact: "Kapcsolat" - gravatar_websites: "Weboldalak" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "A pályát nem sikerült betölteni: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/id.coffee b/app/locale/id.coffee index f409da297..949de21a9 100644 --- a/app/locale/id.coffee +++ b/app/locale/id.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/it.coffee b/app/locale/it.coffee index bdbf39a48..c7598577e 100644 --- a/app/locale/it.coffee +++ b/app/locale/it.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t loading: "Caricamento in corso..." saving: "Salvataggio in corso..." sending: "Invio in corso..." +# send: "Send" cancel: "Annulla" save: "Salva" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t versions: save_version_title: "Salva nuova versione" new_major_version: "Nuova versione" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Per salvare le modifiche, prima devi accettare la nostra " cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t forum_page: "il nostro forum" forum_suffix: " invece." send: "Invia feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Aiutaci a tradurre CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t wizard_settings: # title: "Wizard Settings" customize_avatar: "Personalizza il tuo personaggio" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Abbigliamento" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t wizard_tab: "Stregone" password_tab: "Password" emails_tab: "Email" +# job_profile_tab: "Job Profile" admin: "Amministratore" - gravatar_select: "Seleziona quale foto di Gravatar usare" - gravatar_add_photos: "Aggiungi delle miniature e delle immagini all'account di Gravatar per la tua email per scegliere un'immagine." - gravatar_add_more_photos: "Aggiungi più foto al tuo account di Gravatar per vederle qui." wizard_color: "Colore dei vestiti da Stregone" new_password: "Nuova password" new_password_verify: "Verifica" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t error_saving: "Errore durante il salvataggio" saved: "Modifiche salvate" password_mismatch: "La password non corrisponde." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Modifica impostazioni" profile_for_prefix: "Profilo di " profile_for_suffix: "" - profile: "Profilo" - user_not_found: "Utente non trovato. Controlla l'URL" - gravatar_not_found_mine: "Non abbiamo trovato un profilo associato a:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Iscriviti su " - gravatar_signup_suffix: " per impostare tutto!" - gravatar_not_found_other: "A quanto pare non c'è un profilo associato con l'indirizzo email di questa persona." - gravatar_contact: "Contatto" - gravatar_websites: "Siti web" - gravatar_accounts: "Come su" - gravatar_profile_link: "Profilo Gravatar completo" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Il livello non può essere caricato: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t contact_us: "scrivici!" hipchat_prefix: "Ci puoi anche trovare nella nostra" hipchat_url: "stanza HipChat." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Opzioni??" level_tab_thangs: "Thangs" level_tab_scripts: "Script" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t level_tab_components: "Componenti" level_tab_systems: "Sistemi" level_tab_thangs_title: "Thangs esistenti" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Condizioni iniziali" level_tab_thangs_add: "Aggiungi thang" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Impostazioni" level_component_tab_title: "Componenti esistenti" level_component_btn_new: "Crea nuovo componente" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t body: "Testo" version: "Versione" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" results: "Risultati" description: "Descrizione" or: "o" +# subject: "Subject" email: "Email" password: "Password" message: "Messaggio" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index 0c935344d..31da04d92 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", loading: "ロード中" saving: "保存中..." sending: "送信中..." +# send: "Send" cancel: "キャンセル" save: "保存" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", versions: save_version_title: "新しいバージョンを保存" new_major_version: "メジャーバージョンを新しくする" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "変更を適用するには, 私達のCLAに同意する必要があります。" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", forum_page: "こちらのフォーラム" forum_suffix: " でお願いします。" send: "フィードバックを送信" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "CodeCombatを翻訳しましょう!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", wizard_settings: title: "ウィザードの設定" customize_avatar: "アバターのカスタマイズ" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", wizard_tab: "魔法使い" password_tab: "パスワード" emails_tab: "メール" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Gravatar" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." wizard_color: "ウィザードの色" new_password: "新パスワード" new_password_verify: "新パスワードを再入力" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", error_saving: "セーブ中にエラーが発生しました" saved: "変更しました" password_mismatch: "パスワードが違います" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "設定" # profile_for_prefix: "Profile for " profile_for_suffix: "のプロフィール" - profile: "プロフィール" - user_not_found: "ユーザーが見つかりません。URLを間違って入力していないか確認してください。" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" - gravatar_not_found_email_suffix: " のメールアドレスは Gravatar で見つけることができませんでした。" -# gravatar_signup_prefix: "Sign up at " - gravatar_signup_suffix: " を登録" - gravatar_not_found_other: "このメールアドレスには プロフィールが関連付けられていません。" -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "レベルがロード出来ませんでした: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index 6ae889621..cc318f9f5 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t loading: "로딩중입니다..." saving: "저장중입니다..." sending: "보내는 중입니다..." +# send: "Send" cancel: "취소" save: "저장" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t versions: save_version_title: "새로운 버전을 저장합니다" new_major_version: "신규 버전" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "변경사항을 저장하기 위해서는, 먼저 계약사항에 동의 하셔야 합니다." cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t forum_page: "포럼" forum_suffix: " 대신에." send: "의견 보내기" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "코드 컴뱃 번역을 도와주세요!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t wizard_settings: title: "마법사 설장" customize_avatar: "당신의 분신을 직접 꾸미세요" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "옷" trim: "장식" cloud: "구름" +# team: "Team" spell: "마법" boots: "장화" hue: "색조" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t wizard_tab: "마법사" password_tab: "비밀번호" emails_tab: "이메일" +# job_profile_tab: "Job Profile" admin: "관리자" - gravatar_select: "사용하기 위한 Gravatar를 선택해 주세요" - gravatar_add_photos: "이미지를 선택하기 위해서는 우선 Gravatar 계정에 썸네일이나 이미지를 추가하여 주세요" - gravatar_add_more_photos: "코드컴뱃에서 더 많은 이미지를 추가하려면 우선 당신의 Gravatar 계정에 좀 더 많은 이미지를 추가해 주세요" wizard_color: "마법사 옷 색깔" new_password: "새 비밀번호" new_password_verify: "확인(다시한번 입력해주세요)" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t error_saving: "오류 저장" saved: "변경사항 저장 완료" password_mismatch: "비밀번호가 일치하지 않습니다." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "설정사항 변경" profile_for_prefix: "프로필 " profile_for_suffix: "" - profile: "프로필" - user_not_found: "유저를 찾을 수 없습니다 URL은 체크 하셨죠?" - gravatar_not_found_mine: "죄송하지만 귀하의 이메일 주소를 찾을 수 없습니다 :" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "등록" - gravatar_signup_suffix: " 등록하세요" - gravatar_not_found_other: "이 사람의 이메일 주소와 관련된 어떤것도 찾을 수 없습니다." - gravatar_contact: "연락처" - gravatar_websites: "웹사이트" - gravatar_accounts: "보이는대로" - gravatar_profile_link: "전체 Gravatar 프로필" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "레벨 로딩 실패 : " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t contact_us: "연락하기!" hipchat_prefix: "당신은 또한 우리를 여기에서 찾을 수 있습니다 : " hipchat_url: "힙챗 룸" +# back: "Back" revert: "되돌리기" revert_models: "모델 되돌리기" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "다른 옵션들?" level_tab_thangs: "Thangs" level_tab_scripts: "스크립트들" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t level_tab_components: "요소들" level_tab_systems: "시스템" level_tab_thangs_title: "현재 Thangs" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "컨디션 시작" level_tab_thangs_add: "Thangs 추가" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "설정" level_component_tab_title: "현재 요소들" level_component_btn_new: "새로운 요소들 생성" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t article_search_title: "기사들은 여기에서 찾으세요" thang_search_title: "Thang 타입들은 여기에서 찾으세요" level_search_title: "레벨들은 여기에서 찾으세요" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t body: "구성" version: "버전" commit_msg: "커밋 메세지" - history: "히스토리" +# version_history: "Version History" version_history_for: "버전 히스토리 : " result: "결과" results: "결과들" description: "설명" or: "또한" +# subject: "Subject" email: "이메일" password: "비밀번호" message: "메시지" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee index 35fa4717d..2e685fa50 100644 --- a/app/locale/lt.coffee +++ b/app/locale/lt.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee index 62f2181e9..ecb324a61 100644 --- a/app/locale/ms.coffee +++ b/app/locale/ms.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa loading: "Pemuatan..." saving: "Menyimpan data..." sending: "Menghantar maklumat.." +# send: "Send" cancel: "Batal" save: "Simpan data" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa versions: save_version_title: "Simpan versi baru" new_major_version: "Versi utama yang baru" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Untuk menyimpan pengubahsuaian, anda perlu setuju dengan" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa forum_page: "forum kami" # forum_suffix: " instead." send: "Hantar Maklumbalas" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Kami perlu menterjemahkan CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # wizard_tab: "Wizard" password_tab: "Kata-laluan" emails_tab: "Kesemua E-mel" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Pilih mana gambar Gravatar photo digunakan" - gravatar_add_photos: "Tambah thumbnail and gambar-gambar kepada akaun Gravatar untuk emel anda untuk pilih imej." - gravatar_add_more_photos: "Tambah lebih gambar kepada akaun Gravatar dan aksess dari sana." # wizard_color: "Wizard Clothes Color" new_password: "Kata-laluan baru" new_password_verify: "Verifikasi" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa error_saving: "Masalah menyimpan" saved: "Pengubahsuian disimpan" password_mismatch: "Kata-laluan tidak sama." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: # edit_settings: "Edit Settings" profile_for_prefix: "Profil untuk " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Pengguna tiada. Semak kembali URL?" - gravatar_not_found_mine: "Kami tidak dapat mencari profil anda yang mengenai dengan:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Daftar di " - gravatar_signup_suffix: " untuk mula!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." - gravatar_contact: "Hubungi" - gravatar_websites: "Lelaman" - gravatar_accounts: "Juga didapati di" - gravatar_profile_link: "Profil Penuh Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # body: "Body" version: "Versi" commit_msg: "Mesej Commit" -# history: "History" +# version_history: "Version History" version_history_for: "Versi History untuk: " result: "Keputusan" results: "Keputusan-keputusan" description: "Deskripsi" or: "atau" +# subject: "Subject" email: "Emel" password: "Kata Laluan" message: "Mesej" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee index 12ece95a3..22a81f4e4 100644 --- a/app/locale/nb.coffee +++ b/app/locale/nb.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg loading: "Laster..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" cancel: "Avbryt" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg forum_page: "forumet vårt" forum_suffix: " i steden." send: "Send Tilbakemelding" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hjelp med oversettelse av CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg wizard_tab: "Trollmann" password_tab: "Passord" emails_tab: "Epost" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Velg hvilket Gravatar bilde du ønsker å bruke" - gravatar_add_photos: "Legg til miniatyrbilder og bildertil en Gravatar konto for at du skal kunne velge et bilde for din epost." - gravatar_add_more_photos: "Legg til flere bilder til din Gravatar konto for å kunne aksessere dem her." wizard_color: "Farge på Trollmannens Klær" new_password: "Nytt Passord" new_password_verify: "Verifiser" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg error_saving: "Lagring Feilet" saved: "Endringer Lagret" password_mismatch: "Passordene er ikke like." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Rediger Innstillinger" profile_for_prefix: "Profil for " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Ingen bruker funnet. Sjekk URL'en?" - gravatar_not_found_mine: "Vi kunne ikke finne din profil assosiert med:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registre det på " - gravatar_signup_suffix: " for å sette opp!" - gravatar_not_found_other: "Akk, det er ingen profil assosiert med denne personens epost adresse." - gravatar_contact: "Kontakt" - gravatar_websites: "Websider" - gravatar_accounts: "Som Sett På" - gravatar_profile_link: "Full Gravatar Profil" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Nivået kunne ikke bli lastet: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "eller" +# subject: "Subject" email: "Epost" # password: "Password" message: "Melding" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee index abcd96599..62d86f07f 100644 --- a/app/locale/nl-BE.coffee +++ b/app/locale/nl-BE.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: loading: "Aan het laden..." saving: "Opslaan..." sending: "Verzenden..." +# send: "Send" cancel: "Annuleren" save: "Opslagen" create: "Creëer" @@ -12,7 +13,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: manual: "Handleiding" fork: "Fork" play: "Spelen" -# retry: "Retry" + retry: "Probeer opnieuw" units: second: "seconde" @@ -30,7 +31,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: page_not_found: "Pagina niet gevonden" nav: - play: "Spelen" + play: "Levels" editor: "Editor" blog: "Blog" forum: "Forum" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: versions: save_version_title: "Nieuwe versie opslagen" new_major_version: "Nieuwe hoofd versie" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Om bewerkingen op te slaan, moet je eerst akkoord gaan met onze" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: forum_page: "ons forum" forum_suffix: "." send: "Feedback Verzonden" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Help CodeCombat vertalen!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: wizard_settings: title: "Tovenaar instellingen" customize_avatar: "Bewerk je avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kleren" trim: "Trim" cloud: "Wolk" +# team: "Team" spell: "Spreuk" boots: "Laarzen" hue: "Hue" @@ -142,9 +152,6 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: password_tab: "Wachtwoord" emails_tab: "Emails" admin: "Administrator" - gravatar_select: "Selecteer welke Gravatar foto je wilt gebruiken" - gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen." - gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." wizard_color: "Tovenaar Kleding Kleur" new_password: "Nieuw Wachtwoord" new_password_verify: "Verifieer" @@ -161,22 +168,37 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: error_saving: "Fout Tijdens Het Opslaan" saved: "Aanpassingen Opgeslagen" password_mismatch: "Het wachtwoord komt niet overeen." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Instellingen Aanpassen" profile_for_prefix: "Profiel voor " profile_for_suffix: "" - profile: "Profiel" - user_not_found: "Geen gebruiker gevonden. Controleer de URL?" - gravatar_not_found_mine: "We konden geen account vinden gekoppeld met:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registreer op " - gravatar_signup_suffix: " om alles in orde te maken!" - gravatar_not_found_other: "Helaas, er is geen profiel geassocieerd met dit e-mail adres." - gravatar_contact: "Contact" - gravatar_websites: "Websites" - gravatar_accounts: "Zoals Gezien Op" - gravatar_profile_link: "Volledig Gravatar Profiel" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Level kon niet geladen worden: " @@ -265,8 +287,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: tip_patience: "Geduld moet je hebben, jonge Padawan. - Yoda" tip_documented_bug: "Een gedocumenteerde fout is geen fout; het is deel van het programma." tip_impossible: "Het lijkt altijd onmogelijk tot het gedaan wordt. - Nelson Mandela" -# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" -# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" + tip_talk_is_cheap: "Je kunt het goed uitleggen, maar toon me de code. - Linus Torvalds" + tip_first_language: "Het ergste dat je kan leren is je eerste programmeertaal. - Alan Kay" time_current: "Nu:" time_total: "Maximum:" time_goto: "Ga naar:" @@ -295,8 +317,15 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: contact_us: "contacteer ons!" hipchat_prefix: "Je kan ons ook vinden in ons" hipchat_url: "(Engelstalig) HipChat kanaal." +# back: "Back" revert: "Keer wijziging terug" revert_models: "keer wijziging model terug" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Enkele opties?" level_tab_thangs: "Elementen" level_tab_scripts: "Scripts" @@ -304,8 +333,11 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: level_tab_components: "Componenten" level_tab_systems: "Systemen" level_tab_thangs_title: "Huidige Elementen" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Start Condities" level_tab_thangs_add: "Voeg element toe" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Instellingen" level_component_tab_title: "Huidige Componenten" level_component_btn_new: "Maak een nieuwe component aan" @@ -327,7 +359,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: article_search_title: "Zoek Artikels Hier" thang_search_title: "Zoek Thang Types Hier" level_search_title: "Zoek Levels Hier" -# read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." +# signup_to_create: "Sign Up to Create a New Content" + read_only_warning: "Herinnering: Je kunt hier geen aanpassingen opslaan, want je bent niet ingelogd als administrator." article: edit_btn_preview: "Voorbeeld" @@ -339,12 +372,13 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: body: "Inhoud" version: "Versie" commit_msg: "Commit Bericht" - history: "Geschiedenis" +# version_history: "Version History" version_history_for: "Versie geschiedenis voor: " result: "Resultaat" results: "Resultaten" description: "Beschrijving" or: "of" +# subject: "Subject" email: "Email" password: "Wachtwoord" message: "Bericht" @@ -593,7 +627,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: introducing_dungeon_arena: "Introductie van Dungeon Arena" new_way: "17 maart, 2014: De nieuwe manier om te concurreren met code." to_battle: "Naar het slagveld, ontwikkelaars!" - modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een modere tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." + modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een moderne tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." arenas_are_here: "CodeCombat's kop aan kop multiplayer arena's zijn er." ladder_explanation: "Kies jouw helden, betover jouw mensen of ogre legers, en beklim jouw weg naar de top in de ladder, door het verslagen van vriend en vijand. Daag nu je vrienden uit in de multiplayer programmeer arena's en verdien eeuwige roem. Indien je creatief bent, kan je zelfs" fork_our_arenas: "onze arenas forken" @@ -603,26 +637,28 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: new_to_programming: ". Ben je net begonnen met programmeren? Speel dan eerst onze beginners campagne." so_ready: "Ik ben hier zo klaar voor" -# loading_error: -# could_not_load: "Error loading from server" -# connection_failure: "Connection failed." -# unauthorized: "You need to be signed in. Do you have cookies disabled?" -# forbidden: "You do not have the permissions." -# not_found: "Not found." -# not_allowed: "Method not allowed." -# timeout: "Server timeout." -# conflict: "Resource conflict." -# bad_input: "Bad input." -# server_error: "Server error." -# unknown: "Unknown error." + loading_error: + could_not_load: "Fout bij het laden van de server" + connection_failure: "Verbinding mislukt." + unauthorized: "Je moet ingelogd zijn. Heb je de cookies uitgeschakeld?" + forbidden: "Je hebt hier geen toestemming voor." + not_found: "Niet gevonden." + not_allowed: "Methode niet toegestaan." + timeout: "Server timeout." + conflict: "Conflict van resources" + bad_input: "Slechte input." + server_error: "Fout van de server." + unknown: "Onbekende fout." -# resources: -# your_sessions: "Your Sessions" -# level: "Level" -# social_network_apis: "Social Network APIs" -# facebook_status: "Facebook Status" -# facebook_friends: "Facebook Friends" -# facebook_friend_sessions: "Facebook Friend Sessions" -# gplus_friends: "G+ Friends" -# gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" + resources: + your_sessions: "Jouw sessies." + level: "Level" + social_network_apis: "Sociale netwerk APIs" + facebook_status: "Facebook Status" + facebook_friends: "Facebook vrienden" + facebook_friend_sessions: "Sessies van Facebook vrienden" + gplus_friends: "G+ vrienden" + gplus_friend_sessions: "Sessies van G+ vrienden" + leaderboard: "Scorebord" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee index bafb7d160..2182cc359 100644 --- a/app/locale/nl-NL.coffee +++ b/app/locale/nl-NL.coffee @@ -1,8 +1,9 @@ -module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription: "Dutch (Netherlands)", translation: +module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription: "Dutch (Netherlands)", translation: common: loading: "Aan het laden..." saving: "Opslaan..." sending: "Verzenden..." +# send: "Send" cancel: "Annuleren" save: "Opslagen" create: "Creëer" @@ -12,7 +13,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription manual: "Handleiding" fork: "Fork" play: "Spelen" -# retry: "Retry" + retry: "Probeer opnieuw" units: second: "seconde" @@ -30,7 +31,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription page_not_found: "Pagina niet gevonden" nav: - play: "Spelen" + play: "Levels" editor: "Editor" blog: "Blog" forum: "Forum" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription versions: save_version_title: "Nieuwe versie opslagen" new_major_version: "Nieuwe hoofd versie" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Om bewerkingen op te slaan, moet je eerst akkoord gaan met onze" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription forum_page: "ons forum" forum_suffix: "." send: "Feedback Verzonden" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Help CodeCombat vertalen!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription wizard_settings: title: "Tovenaar instellingen" customize_avatar: "Bewerk je avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kleren" trim: "Trim" cloud: "Wolk" +# team: "Team" spell: "Spreuk" boots: "Laarzen" hue: "Hue" @@ -142,9 +152,6 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription password_tab: "Wachtwoord" emails_tab: "Emails" admin: "Administrator" - gravatar_select: "Selecteer welke Gravatar foto je wilt gebruiken" - gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen." - gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." wizard_color: "Tovenaar Kleding Kleur" new_password: "Nieuw Wachtwoord" new_password_verify: "Verifieer" @@ -161,22 +168,37 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription error_saving: "Fout Tijdens Het Opslaan" saved: "Aanpassingen Opgeslagen" password_mismatch: "Het wachtwoord komt niet overeen." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Instellingen Aanpassen" profile_for_prefix: "Profiel voor " profile_for_suffix: "" - profile: "Profiel" - user_not_found: "Geen gebruiker gevonden. Controleer de URL?" - gravatar_not_found_mine: "We konden geen account vinden gekoppeld met:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registreer op " - gravatar_signup_suffix: " om alles in orde te maken!" - gravatar_not_found_other: "Helaas, er is geen profiel geassocieerd met dit e-mail adres." - gravatar_contact: "Contact" - gravatar_websites: "Websites" - gravatar_accounts: "Zoals Gezien Op" - gravatar_profile_link: "Volledig Gravatar Profiel" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Level kon niet geladen worden: " @@ -265,8 +287,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription tip_patience: "Geduld moet je hebben, jonge Padawan. - Yoda" tip_documented_bug: "Een gedocumenteerde fout is geen fout; het is deel van het programma." tip_impossible: "Het lijkt altijd onmogelijk tot het gedaan wordt. - Nelson Mandela" -# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" -# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" + tip_talk_is_cheap: "Je kunt het goed uitleggen, maar toon me de code. - Linus Torvalds" + tip_first_language: "Het ergste dat je kan leren is je eerste programmeertaal. - Alan Kay" time_current: "Nu:" time_total: "Maximum:" time_goto: "Ga naar:" @@ -295,8 +317,15 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription contact_us: "contacteer ons!" hipchat_prefix: "Je kan ons ook vinden in ons" hipchat_url: "(Engelstalig) HipChat kanaal." +# back: "Back" revert: "Keer wijziging terug" revert_models: "keer wijziging model terug" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Enkele opties?" level_tab_thangs: "Elementen" level_tab_scripts: "Scripts" @@ -304,8 +333,11 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription level_tab_components: "Componenten" level_tab_systems: "Systemen" level_tab_thangs_title: "Huidige Elementen" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Start Condities" level_tab_thangs_add: "Voeg element toe" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Instellingen" level_component_tab_title: "Huidige Componenten" level_component_btn_new: "Maak een nieuwe component aan" @@ -327,7 +359,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription article_search_title: "Zoek Artikels Hier" thang_search_title: "Zoek Thang Types Hier" level_search_title: "Zoek Levels Hier" -# read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." +# signup_to_create: "Sign Up to Create a New Content" +# read_only_warning: "Herinnering: Je kunt hier geen aanpassingen opslaan, want je bent niet ingelogd als administrator." article: edit_btn_preview: "Voorbeeld" @@ -339,12 +372,13 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription body: "Inhoud" version: "Versie" commit_msg: "Commit Bericht" - history: "Geschiedenis" +# version_history: "Version History" version_history_for: "Versie geschiedenis voor: " result: "Resultaat" results: "Resultaten" description: "Beschrijving" or: "of" +# subject: "Subject" email: "Email" password: "Wachtwoord" message: "Bericht" @@ -593,7 +627,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription introducing_dungeon_arena: "Introductie van Dungeon Arena" new_way: "17 maart, 2014: De nieuwe manier om te concurreren met code." to_battle: "Naar het slagveld, ontwikkelaars!" - modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een modere tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." + modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een moderne tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." arenas_are_here: "CodeCombat's kop aan kop multiplayer arena's zijn er." ladder_explanation: "Kies jouw helden, betover jouw mensen of ogre legers, en beklim jouw weg naar de top in de ladder, door het verslagen van vriend en vijand. Daag nu je vrienden uit in de multiplayer programmeer arena's en verdien eeuwige roem. Indien je creatief bent, kan je zelfs" fork_our_arenas: "onze arenas forken" @@ -603,26 +637,28 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription new_to_programming: ". Ben je net begonnen met programmeren? Speel dan eerst onze beginners campagne." so_ready: "Ik ben hier zo klaar voor" -# loading_error: -# could_not_load: "Error loading from server" -# connection_failure: "Connection failed." -# unauthorized: "You need to be signed in. Do you have cookies disabled?" -# forbidden: "You do not have the permissions." -# not_found: "Not found." -# not_allowed: "Method not allowed." -# timeout: "Server timeout." -# conflict: "Resource conflict." -# bad_input: "Bad input." -# server_error: "Server error." -# unknown: "Unknown error." + loading_error: + could_not_load: "Fout bij het laden van de server" + connection_failure: "Verbinding mislukt." + unauthorized: "Je moet ingelogd zijn. Heb je de cookies uitgeschakeld?" + forbidden: "Je hebt hier geen toestemming voor." + not_found: "Niet gevonden." + not_allowed: "Methode niet toegestaan." + timeout: "Server timeout." + conflict: "Conflict van resources" + bad_input: "Slechte input." + server_error: "Fout van de server." + unknown: "Onbekende fout." -# resources: -# your_sessions: "Your Sessions" -# level: "Level" -# social_network_apis: "Social Network APIs" -# facebook_status: "Facebook Status" -# facebook_friends: "Facebook Friends" -# facebook_friend_sessions: "Facebook Friend Sessions" -# gplus_friends: "G+ Friends" -# gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" + resources: + your_sessions: "Jouw sessies." + level: "Level" + social_network_apis: "Sociale netwerk APIs" + facebook_status: "Facebook Status" + facebook_friends: "Facebook vrienden" + facebook_friend_sessions: "Sessies van Facebook vrienden" + gplus_friends: "G+ vrienden" + gplus_friend_sessions: "Sessies van G+ vrienden" + leaderboard: "Scorebord" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index ad5127239..5f890ed8d 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t loading: "Aan het laden..." saving: "Opslaan..." sending: "Verzenden..." +# send: "Send" cancel: "Annuleren" save: "Opslagen" create: "Creëer" @@ -12,7 +13,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t manual: "Handleiding" fork: "Fork" play: "Spelen" -# retry: "Retry" + retry: "Probeer opnieuw" units: second: "seconde" @@ -30,7 +31,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t page_not_found: "Pagina niet gevonden" nav: - play: "Spelen" + play: "Levels" editor: "Editor" blog: "Blog" forum: "Forum" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t versions: save_version_title: "Nieuwe versie opslagen" new_major_version: "Nieuwe hoofd versie" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Om bewerkingen op te slaan, moet je eerst akkoord gaan met onze" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t forum_page: "ons forum" forum_suffix: "." send: "Feedback Verzonden" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Help CodeCombat vertalen!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t wizard_settings: title: "Tovenaar instellingen" customize_avatar: "Bewerk je avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kleren" trim: "Trim" cloud: "Wolk" +# team: "Team" spell: "Spreuk" boots: "Laarzen" hue: "Hue" @@ -142,9 +152,6 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t password_tab: "Wachtwoord" emails_tab: "Emails" admin: "Administrator" - gravatar_select: "Selecteer welke Gravatar foto je wilt gebruiken" - gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen." - gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." wizard_color: "Tovenaar Kleding Kleur" new_password: "Nieuw Wachtwoord" new_password_verify: "Verifieer" @@ -161,22 +168,37 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t error_saving: "Fout Tijdens Het Opslaan" saved: "Aanpassingen Opgeslagen" password_mismatch: "Het wachtwoord komt niet overeen." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Instellingen Aanpassen" profile_for_prefix: "Profiel voor " profile_for_suffix: "" - profile: "Profiel" - user_not_found: "Geen gebruiker gevonden. Controleer de URL?" - gravatar_not_found_mine: "We konden geen account vinden gekoppeld met:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registreer op " - gravatar_signup_suffix: " om alles in orde te maken!" - gravatar_not_found_other: "Helaas, er is geen profiel geassocieerd met dit e-mail adres." - gravatar_contact: "Contact" - gravatar_websites: "Websites" - gravatar_accounts: "Zoals Gezien Op" - gravatar_profile_link: "Volledig Gravatar Profiel" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Level kon niet geladen worden: " @@ -265,8 +287,8 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t tip_patience: "Geduld moet je hebben, jonge Padawan. - Yoda" tip_documented_bug: "Een gedocumenteerde fout is geen fout; het is deel van het programma." tip_impossible: "Het lijkt altijd onmogelijk tot het gedaan wordt. - Nelson Mandela" -# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" -# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" + tip_talk_is_cheap: "Je kunt het goed uitleggen, maar toon me de code. - Linus Torvalds" + tip_first_language: "Het ergste dat je kan leren is je eerste programmeertaal. - Alan Kay" time_current: "Nu:" time_total: "Maximum:" time_goto: "Ga naar:" @@ -295,8 +317,15 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t contact_us: "contacteer ons!" hipchat_prefix: "Je kan ons ook vinden in ons" hipchat_url: "(Engelstalig) HipChat kanaal." +# back: "Back" revert: "Keer wijziging terug" revert_models: "keer wijziging model terug" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Enkele opties?" level_tab_thangs: "Elementen" level_tab_scripts: "Scripts" @@ -304,8 +333,11 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t level_tab_components: "Componenten" level_tab_systems: "Systemen" level_tab_thangs_title: "Huidige Elementen" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Start Condities" level_tab_thangs_add: "Voeg element toe" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Instellingen" level_component_tab_title: "Huidige Componenten" level_component_btn_new: "Maak een nieuwe component aan" @@ -327,7 +359,8 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t article_search_title: "Zoek Artikels Hier" thang_search_title: "Zoek Thang Types Hier" level_search_title: "Zoek Levels Hier" -# read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." +# signup_to_create: "Sign Up to Create a New Content" + read_only_warning: "Herinnering: Je kunt hier geen aanpassingen opslaan, want je bent niet ingelogd als administrator." article: edit_btn_preview: "Voorbeeld" @@ -339,12 +372,13 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t body: "Inhoud" version: "Versie" commit_msg: "Commit Bericht" - history: "Geschiedenis" +# version_history: "Version History" version_history_for: "Versie geschiedenis voor: " result: "Resultaat" results: "Resultaten" description: "Beschrijving" or: "of" +# subject: "Subject" email: "Email" password: "Wachtwoord" message: "Bericht" @@ -593,7 +627,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t introducing_dungeon_arena: "Introductie van Dungeon Arena" new_way: "17 maart, 2014: De nieuwe manier om te concurreren met code." to_battle: "Naar het slagveld, ontwikkelaars!" - modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een modere tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." + modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een moderne tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots." arenas_are_here: "CodeCombat's kop aan kop multiplayer arena's zijn er." ladder_explanation: "Kies jouw helden, betover jouw mensen of ogre legers, en beklim jouw weg naar de top in de ladder, door het verslagen van vriend en vijand. Daag nu je vrienden uit in de multiplayer programmeer arena's en verdien eeuwige roem. Indien je creatief bent, kan je zelfs" fork_our_arenas: "onze arenas forken" @@ -603,26 +637,28 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t new_to_programming: ". Ben je net begonnen met programmeren? Speel dan eerst onze beginners campagne." so_ready: "Ik ben hier zo klaar voor" -# loading_error: -# could_not_load: "Error loading from server" -# connection_failure: "Connection failed." -# unauthorized: "You need to be signed in. Do you have cookies disabled?" -# forbidden: "You do not have the permissions." -# not_found: "Not found." -# not_allowed: "Method not allowed." -# timeout: "Server timeout." -# conflict: "Resource conflict." -# bad_input: "Bad input." -# server_error: "Server error." -# unknown: "Unknown error." + loading_error: + could_not_load: "Fout bij het laden van de server" + connection_failure: "Verbinding mislukt." + unauthorized: "Je moet ingelogd zijn. Heb je de cookies uitgeschakeld?" + forbidden: "Je hebt hier geen toestemming voor." + not_found: "Niet gevonden." + not_allowed: "Methode niet toegestaan." + timeout: "Server timeout." + conflict: "Conflict van resources" + bad_input: "Slechte input." + server_error: "Fout van de server." + unknown: "Onbekende fout." -# resources: -# your_sessions: "Your Sessions" -# level: "Level" -# social_network_apis: "Social Network APIs" -# facebook_status: "Facebook Status" -# facebook_friends: "Facebook Friends" -# facebook_friend_sessions: "Facebook Friend Sessions" -# gplus_friends: "G+ Friends" -# gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" + resources: + your_sessions: "Jouw sessies." + level: "Level" + social_network_apis: "Sociale netwerk APIs" + facebook_status: "Facebook Status" + facebook_friends: "Facebook vrienden" + facebook_friend_sessions: "Sessies van Facebook vrienden" + gplus_friends: "G+ vrienden" + gplus_friend_sessions: "Sessies van G+ vrienden" + leaderboard: "Scorebord" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee index 653faf141..e5d1f651b 100644 --- a/app/locale/nn.coffee +++ b/app/locale/nn.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/no.coffee b/app/locale/no.coffee index c0e2d3842..37606b74a 100644 --- a/app/locale/no.coffee +++ b/app/locale/no.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr loading: "Laster..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" cancel: "Avbryt" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr forum_page: "forumet vårt" forum_suffix: " i steden." send: "Send Tilbakemelding" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hjelp med oversettelse av CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr wizard_tab: "Trollmann" password_tab: "Passord" emails_tab: "Epost" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Velg hvilket Gravatar bilde du ønsker å bruke" - gravatar_add_photos: "Legg til miniatyrbilder og bildertil en Gravatar konto for at du skal kunne velge et bilde for din epost." - gravatar_add_more_photos: "Legg til flere bilder til din Gravatar konto for å kunne aksessere dem her." wizard_color: "Farge på Trollmannens Klær" new_password: "Nytt Passord" new_password_verify: "Verifiser" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr error_saving: "Lagring Feilet" saved: "Endringer Lagret" password_mismatch: "Passordene er ikke like." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Rediger Innstillinger" profile_for_prefix: "Profil for " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Ingen bruker funnet. Sjekk URL'en?" - gravatar_not_found_mine: "Vi kunne ikke finne din profil assosiert med:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registre det på " - gravatar_signup_suffix: " for å sette opp!" - gravatar_not_found_other: "Akk, det er ingen profil assosiert med denne personens epost adresse." - gravatar_contact: "Kontakt" - gravatar_websites: "Websider" - gravatar_accounts: "Som Sett På" - gravatar_profile_link: "Full Gravatar Profil" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Nivået kunne ikke bli lastet: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "eller" +# subject: "Subject" email: "Epost" # password: "Password" message: "Melding" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee index fd5ff6c98..ca2cce66d 100644 --- a/app/locale/pl.coffee +++ b/app/locale/pl.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish loading: "Ładowanie..." saving: "Zapisywanie..." sending: "Wysyłanie…" +# send: "Send" cancel: "Anuluj" save: "Zapisz" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish versions: save_version_title: "Zapisz nową wersję" new_major_version: "Nowa wersja główna" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Aby zapisać zmiany, musisz najpierw zaakceptować naszą" cla_url: "umowę licencyjną dla współtwórców (CLA)" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish forum_page: "naszego forum" forum_suffix: "." send: "Wyślij wiadomość" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Pomóż w tłumaczeniu CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish wizard_settings: title: "Ustawienia czarodzieja" customize_avatar: "Personalizuj swój awatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Ubrania" trim: "Dodatki" cloud: "Chmura" +# team: "Team" spell: "Zaklęcie" boots: "Buty" hue: "Odcień" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish wizard_tab: "Czarodziej" password_tab: "Hasło" emails_tab: "Powiadomienia" +# job_profile_tab: "Job Profile" admin: "Administrator" - gravatar_select: "Wybierz fotografię z Gravatar" - gravatar_add_photos: "Dodaj zdjęcia i miniatury do swojego konta Gravatar, by móc wybrać zdjęcie." - gravatar_add_more_photos: "Dodaj więcej zdjęć do swojego konta Gravatar, by móc ich użyć." wizard_color: "Kolor ubrań czarodzieja" new_password: "Nowe hasło" new_password_verify: "Zweryfikuj" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish error_saving: "Błąd zapisywania" saved: "Zmiany zapisane" password_mismatch: "Hasła róznią się od siebie" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Edytuj ustawienia" profile_for_prefix: "Profil" profile_for_suffix: "" - profile: "Profil" - user_not_found: "Nie znaleziono użytkownika. Sprawdź odnośnik URL." - gravatar_not_found_mine: "Nie udało nam się znaleźć profilu powiązanego z:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Utwórz konto w " - gravatar_signup_suffix: ", aby rozpocząć!" - gravatar_not_found_other: "Niestety, nie ma profilu powiązanego z tym adresem email." - gravatar_contact: "Kontakt" - gravatar_websites: "Strony WWW" -# gravatar_accounts: "As Seen On" - gravatar_profile_link: "Profil Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Nie udało się wczytać poziomu: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish contact_us: "skontaktuj się z nami!" hipchat_prefix: "Możesz nas też spotkać w naszym" hipchat_url: "pokoju HipChat." +# back: "Back" revert: "Przywróć" revert_models: "Przywróć wersję" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Trochę opcji?" level_tab_thangs: "Obiekty" level_tab_scripts: "Skrypty" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish level_tab_components: "Komponenty" level_tab_systems: "Systemy" level_tab_thangs_title: "Aktualne obiekty" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Warunki początkowe" level_tab_thangs_add: "Dodaj obiekty" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Ustawienia" level_component_tab_title: "Aktualne komponenty" level_component_btn_new: "Stwórz nowy komponent" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish article_search_title: "Przeszukaj artykuły" thang_search_title: "Przeszukaj typy obiektów" level_search_title: "Przeszukaj poziomy" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish body: "Zawartość" version: "Wersja" commit_msg: "Wiadomość do commitu" - history: "Historia" +# version_history: "Version History" version_history_for: "Historia wersji dla: " result: "Wynik" results: "Wyniki" description: "Opis" or: "lub" +# subject: "Subject" email: "Email" password: "Hasło" message: "Wiadomość" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 74c1a4e6b..6994e239a 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: loading: "Carregando..." saving: "Salvando..." sending: "Enviando..." +# send: "Send" cancel: "Cancelar" save: "Salvar" create: "Criar" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: versions: save_version_title: "Salvar nova versão" new_major_version: "Nova versão principal" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Para salvar as modificações, primeiro você deve concordar com nosso" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: forum_page: "nosso fórum" forum_suffix: " ao invés disso." send: "Enviar opinião" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Ajude a traduzir o CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: wizard_settings: title: "Configurações do Feiticeiro" customize_avatar: "Personalize o seu Avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Roupas" trim: "Aparar" cloud: "Nuvem" +# team: "Team" spell: "Feitiço" boots: "Boots" hue: "Matiz" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: wizard_tab: "Feiticeiro" password_tab: "Senha" emails_tab: "Emails" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Selecione qual foto do Gravatar usar" - gravatar_add_photos: "Adicione miniaturas e fotos a uma conta do Gravatar ligada ao seu email para poder escolher uma imagem." - gravatar_add_more_photos: "Adicione mais fotos à sua conta do Gravatar para acessá-las aqui." wizard_color: "Cor das Roupas do Feiticeiro" new_password: "Nova Senha" new_password_verify: "Confirmação" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: error_saving: "Erro no salvamento" saved: "Alterações Salvas" password_mismatch: "As senhas não estão iguais" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editar as configurações" profile_for_prefix: "Perfil de " profile_for_suffix: "" - profile: "Perfil" - user_not_found: "Nenhum usuário encontrado. Checou o endereço de internet?" - gravatar_not_found_mine: "Não conseguimos encontrar o perfil que está associado a:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Crie uma conta no " - gravatar_signup_suffix: " para poder configurar!" - gravatar_not_found_other: "Infelizmente, não há perfil associado ao endereço de e-mail dessa pessoa." - gravatar_contact: "Contate-nos" - gravatar_websites: "Websites" - gravatar_accounts: "Como visto no" - gravatar_profile_link: "Perfil Completo do Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "O estágio não pôde ser carregado: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: contact_us: "entre em contato!" hipchat_prefix: "Você também pode nos encontrar na nossa" hipchat_url: "Sala do HipChat." +# back: "Back" revert: "Reverter" revert_models: "Reverter Modelos" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Algumas Opções?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: level_tab_components: "Componentes" level_tab_systems: "Sistemas" level_tab_thangs_title: "Thangs Atuais" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Condições de Início" level_tab_thangs_add: "Adicionar Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Configurações" level_component_tab_title: "Componentess Atuais" level_component_btn_new: "Criar Novo Componente" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: article_search_title: "Procurar Artigos Aqui" thang_search_title: "Procurar Tipos de Thang Aqui" level_search_title: "Procurar Níveis Aqui" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: body: "Principal" version: "Versão" commit_msg: "Mensagem do Commit" - history: "Histórico" +# version_history: "Version History" version_history_for: "Histórico de Versão para: " result: "Resultado" results: "Resultados" description: "Descrição" or: "ou" +# subject: "Subject" email: "Email" password: "Senha" message: "Mensagem" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 91e697490..f8af8dc83 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P loading: "A carregar..." saving: "A guardar..." sending: "A enviar..." +# send: "Send" cancel: "Cancelar" save: "Guardar" create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P versions: save_version_title: "Guardar Nova Versão" new_major_version: "Nova Versão Principal" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Para guardar as alterações, precisas concordar com o nosso" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P forum_page: "nosso fórum" forum_suffix: " como alternativa." send: "Enviar Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Ajuda a traduzir o CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P wizard_settings: title: "Definições do Wizard" customize_avatar: "Altera o teu Avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Roupas" trim: "Pormenores" cloud: "Nuvem" +# team: "Team" spell: "Feitiço" boots: "Botas" hue: "Matiz" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P wizard_tab: "Feiticeiro" password_tab: "Palavra-passe" emails_tab: "E-mails" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Seleciona qual fotografia Gravatar a usar" - gravatar_add_photos: "Adiciona miniaturas e fotografias a uma conta Gravatar com o teu email para escolheres uma imagem." - gravatar_add_more_photos: "Adiciona mais fotografias à tua conta Gravatar para as acederes aqui." wizard_color: "Cor das roupas do feiticeiro" new_password: "Nova palavra-passe" new_password_verify: "Verificar" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P error_saving: "Erro ao guardar" saved: "Alterações guardadas" password_mismatch: "As palavras-passe não coincidem." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editar Definições" profile_for_prefix: "Perfil de " profile_for_suffix: "" - profile: "Perfil" - user_not_found: "Nenhum utilizador encontrado. Verifica o URL?" - gravatar_not_found_mine: "Não conseguimos encontrar o teu perfil associado com:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Regista-te no " - gravatar_signup_suffix: " para começares!" - gravatar_not_found_other: "Infelizmente, não existe nenhum perfil associado ao endereço de e-mail desta pessoa." - gravatar_contact: "Contacto" - gravatar_websites: "Websites" - gravatar_accounts: "Como visto no" - gravatar_profile_link: "Perfil Gravatar completo" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "O nível não pôde ser carregado: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P contact_us: "contacta-nos!" hipchat_prefix: "Podes encontrar-nos no nosso" hipchat_url: "canal HipChat." +# back: "Back" revert: "Reverter" revert_models: "Reverter Modelos" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Algumas opções?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P level_tab_components: "Componentes" level_tab_systems: "Sistemas" level_tab_thangs_title: "Thangs atuais" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Condições iniciais" level_tab_thangs_add: "Adiciona Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Configurações" level_component_tab_title: "Componentes atuais" level_component_btn_new: "Cria um novo Componente" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P article_search_title: "Procurar Artigos Aqui" thang_search_title: "Procurar Tipos de Thang Aqui" level_search_title: "Procurar Níveis Aqui" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P body: "Corpo" version: "Versão" commit_msg: "Mensagem de Commit" - history: "Histórico" +# version_history: "Version History" version_history_for: "Histórico de versões por: " result: "Resultado" results: "Resultados" description: "Descrição" or: "ou" +# subject: "Subject" email: "E-mail" password: "Palavra-passe" message: "Mensagem" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/pt.coffee b/app/locale/pt.coffee index eddcdd149..92863b48e 100644 --- a/app/locale/pt.coffee +++ b/app/locale/pt.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues loading: "Carregando..." # saving: "Saving..." sending: "Enviando..." +# send: "Send" cancel: "Cancelar" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues forum_page: "nosso fórum" forum_suffix: " ao invés disso." send: "Enviar opinião" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Ajude a traduzir o CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues wizard_tab: "Feiticeiro" password_tab: "Senha" emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Selecione qual foto do Gravatar usar" - gravatar_add_photos: "Adicione miniaturas e fotos a uma conta do Gravatar ligada ao seu email para poder escolher uma imagem." - gravatar_add_more_photos: "Adicione mais fotos à sua conta do Gravatar para acessá-las aqui." wizard_color: "Cor das Roupas do Feiticeiro" new_password: "Nova Senha" new_password_verify: "Confirmação" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues error_saving: "Erro no salvamento" saved: "Alterações Salvas" password_mismatch: "As senhas não estão iguais" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Editar as configurações" profile_for_prefix: "Perfil de " # profile_for_suffix: "" - profile: "Perfil" - user_not_found: "Nenhum usuário encontrado. Checou o endereço de internet?" - gravatar_not_found_mine: "Não conseguimos encontrar o perfil que está associado a:" -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Crie uma conta no " - gravatar_signup_suffix: " para poder configurar!" - gravatar_not_found_other: "Infelizmente, não há perfil associado ao endereço de e-mail dessa pessoa." - gravatar_contact: "Contate-nos" - gravatar_websites: "Websites" - gravatar_accounts: "Como visto no" - gravatar_profile_link: "Perfil Completo do Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "O estágio não pôde ser carregado: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "ou" +# subject: "Subject" email: "Email" # password: "Password" message: "Mensagem" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee index 39a84b357..3e1d70a11 100644 --- a/app/locale/ro.coffee +++ b/app/locale/ro.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman loading: "Se incarcă..." saving: "Se salvează..." sending: "Se trimite..." +# send: "Send" cancel: "Anulează" save: "Salvează" create: "Crează" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman versions: save_version_title: "Salvează noua versiune" new_major_version: "Versiune nouă majoră" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Pentru a salva modificările mai intâi trebuie sa fiți de acord cu" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman forum_page: "forumul nostru" forum_suffix: " în schimb." send: "Trimite Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Ajută-ne să traducem CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman wizard_settings: title: "Setări Wizard" customize_avatar: "Personalizează-ți Avatarul" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Haine" trim: "Margine" cloud: "Nor" +# team: "Team" spell: "Vrajă" boots: "Încălțăminte" hue: "Culoare" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman wizard_tab: "Wizard" password_tab: "Parolă" emails_tab: "Email-uri" +# job_profile_tab: "Job Profile" admin: "Admin" - gravatar_select: "Selectează ce poză Gravatar vrei să foloșesti" - gravatar_add_photos: "Adaugă thumbnails și poze la un cont Gravatar pentru email-ul tău pentru a alege o imagine." - gravatar_add_more_photos: "Adaugă mai multe poze la contul tău Gravatar pentru a le accesa aici." wizard_color: "Culoare haine pentru Wizard" new_password: "Parolă nouă" new_password_verify: "Verifică" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman error_saving: "Salvare erori" saved: "Modificări salvate" password_mismatch: "Parola nu se potrivește." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Modifică setările" profile_for_prefix: "Profil pentru " profile_for_suffix: "" - profile: "Profil" - user_not_found: "Utilizator negăsit. Verifică URL-ul??" - gravatar_not_found_mine: "N-am putut găsi profilul asociat cu:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Înscrie-te la " - gravatar_signup_suffix: " pentru a fi gata!" - gravatar_not_found_other: "Din păcate nu este asociat nici un profil cu această adresă de email." - gravatar_contact: "Contact" - gravatar_websites: "Website-uri" - gravatar_accounts: "Așa cum apare la" - gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Nivelul nu a putut fi încărcat: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman contact_us: "contactați-ne!" hipchat_prefix: "Ne puteți de asemenea găsi la" hipchat_url: "HipChat." +# back: "Back" revert: "Revino la versiunea anterioară" revert_models: "Resetează Modelele" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Opțiuni?" level_tab_thangs: "Thangs" level_tab_scripts: "Script-uri" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman level_tab_components: "Componente" level_tab_systems: "Sisteme" level_tab_thangs_title: "Thangs actuali" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Condiți inițiale" level_tab_thangs_add: "Adaugă Thangs" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Setări" level_component_tab_title: "Componente actuale" level_component_btn_new: "Crează componentă nouă" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman article_search_title: "Caută articole aici" thang_search_title: "Caută tipuri de Thang aici" level_search_title: "Caută nivele aici" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman body: "Corp" version: "Versiune" commit_msg: "Înregistrează Mesajul" - history: "Istoric" +# version_history: "Version History" version_history_for: "Versiune istorie pentru: " result: "Rezultat" results: "Resultate" description: "Descriere" or: "sau" +# subject: "Subject" email: "Email" password: "Parolă" message: "Mesaj" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index 5e51f04be..8b7a05e89 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi loading: "Загрузка..." saving: "Сохранение..." sending: "Отправка..." +# send: "Send" cancel: "Отмена" save: "Сохранить" create: "Создать" @@ -12,7 +13,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi manual: "Вручную" fork: "Форк" play: "Играть" -# retry: "Retry" + retry: "Повторить" units: second: "секунда" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi versions: save_version_title: "Сохранить новую версию" new_major_version: "Новая основная версия" + update_break_level: "(Может ли это обновление нарушить старые решения уровня?)" + update_break_component: "(Может ли это обновление нарушить что-нибудь, зависящее от данного Компонента?)" + update_break_system: "(Может ли это обновление нарушить что-нибудь, зависящее от данной Системы?)" cla_prefix: "Чтобы сохранить изменения, сначала вы должны согласиться с нашим" cla_url: "лицензионным соглашением соавторов" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi forum_page: "наш форум" forum_suffix: "." send: "Отправить отзыв" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Помогите перевести CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi wizard_settings: title: "Настройки волшебника" customize_avatar: "Изменить свой аватар" + active: "Активно" + color: "Цвет" + group: "Группа" clothes: "Одежда" trim: "Отделка" - cloud: "Облако" +# cloud: "Cloud" + team: "Облако" spell: "Заклинание" boots: "Обувь" hue: "Оттенок" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi wizard_tab: "Волшебник" password_tab: "Пароль" emails_tab: "Email-адреса" +# job_profile_tab: "Job Profile" admin: "Админ" - gravatar_select: "Выберите, какое фото с Gravatar использовать" - gravatar_add_photos: "Чтобы выбрать изображение, добавьте фото и уменьшенные изображения в ваш Gravatar-аккаунт." - gravatar_add_more_photos: "Добавьте больше фото к вашему аккаунту в Gravatar, чтобы использовать их здесь." wizard_color: "Цвет одежды волшебника" new_password: "Новый пароль" new_password_verify: "Подтверждение пароля" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi error_saving: "Ошибка сохранения" saved: "Изменения сохранены" password_mismatch: "Пароли не совпадают." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Изменить настройки" profile_for_prefix: "Профиль для " profile_for_suffix: "" - profile: "Профиль" - user_not_found: "Пользователь не найден. Пожалуйста, проверьте URL." - gravatar_not_found_mine: "Мы не можем найти профиль, связанный с" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Зарегистрируйтесь на " - gravatar_signup_suffix: ", чтобы настроить профиль." - gravatar_not_found_other: "Нет профиля, связанного с почтой данного пользователя." - gravatar_contact: "Контакты" - gravatar_websites: "Сайты" - gravatar_accounts: "Как показано на" - gravatar_profile_link: "Полный профиль на Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Уровень не может быть загружен: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi contact_us: "свяжитесь с нами!" hipchat_prefix: "Также вы можете найти нас в нашей" hipchat_url: "комнате HipChat." + back: "Назад" revert: "Откатить" revert_models: "Откатить Модели" + fork_title: "Форк новой версии" + fork_creating: "Создание форка..." + more: "Ещё" + wiki: "Вики" + live_chat: "Онлайн-чат" + level_publish: "Опубликовать уровень (необратимо)?" level_some_options: "Ещё опции" level_tab_thangs: "Объекты" level_tab_scripts: "Скрипты" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi level_tab_components: "Компоненты" level_tab_systems: "Системы" level_tab_thangs_title: "Текущие объекты" + level_tab_thangs_all: "Все" level_tab_thangs_conditions: "Начальные условия" level_tab_thangs_add: "Добавить объект" + delete: "Удалить" + duplicate: "Дублировать" level_settings_title: "Настройки" level_component_tab_title: "Текущие компоненты" level_component_btn_new: "Создать новый компонент" @@ -327,7 +360,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi article_search_title: "Искать статьи" thang_search_title: "Искать типы объектов" level_search_title: "Искать уровни" -# read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." + signup_to_create: "Авторизуйтесь для создания нового контента" + read_only_warning: "Примечание: вы не можете сохранять здесь любые правки, потому что вы не вошли как администратор." article: edit_btn_preview: "Предпросмотр" @@ -339,12 +373,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi body: "Содержание" version: "Версия" commit_msg: "Сопроводительное сообщение" - history: "История" + version_history: "История версий" version_history_for: "История версий для: " result: "Результат" results: "Результаты" description: "Описание" or: "или" +# subject: "Subject" email: "Email" password: "Пароль" message: "Сообщение" @@ -564,7 +599,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi simulate_all: "СБРОСИТЬ И СИМУЛИРОВАТЬ ИГРЫ" games_simulated_by: "Игры, симулированные вами:" games_simulated_for: "Игры, симулированные за вас:" - leaderboard: "Таблица лидеров" + leaderboard: "таблица лидеров" battle_as: "Сразиться за " summary_your: "Ваши " summary_matches: "матчи - " @@ -603,26 +638,28 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi new_to_programming: ". Новичок в программировании? Пройдите нашу кампанию для новичков, чтобы повысить навык." so_ready: "Я полностью готов(а) для этого" -# loading_error: -# could_not_load: "Ошибка соединения с сервером" -# connection_failure: "Соединение потеряно." -# unauthorized: "You need to be signed in. Do you have cookies disabled?" -# forbidden: "You do not have the permissions." -# not_found: "Не наидено." -# not_allowed: "Method not allowed." -# timeout: "Server timeout." -# conflict: "Resource conflict." -# bad_input: "Bad input." -# server_error: "Ошибка сервера." -# unknown: "Неизвестная ошибка." + loading_error: + could_not_load: "Ошибка загрузки с сервера" + connection_failure: "Соединение прервано." + unauthorized: "Вам необходимо авторизоваться. У вас отключены cookie?" + forbidden: "У вас нет прав доступа." + not_found: "Не найдено." + not_allowed: "Метод не поддерживается." + timeout: "Тайм-аут сервера." + conflict: "Конфликт ресурсов." + bad_input: "Неверные входные данные." + server_error: "Ошибка сервера." + unknown: "Неизвестная ошибка." -# resources: -# your_sessions: "Your Sessions" -# level: "Уровень" -# social_network_apis: "Social Network APIs" -# facebook_status: "Facebook Status" -# facebook_friends: "Facebook Friends" -# facebook_friend_sessions: "Facebook Friend Sessions" -# gplus_friends: "G+ Friends" -# gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" + resources: + your_sessions: "Ваши сессии" + level: "Уровень" + social_network_apis: "API социальных сетей" + facebook_status: "Статус Facebook" + facebook_friends: "Друзья Facebook" + facebook_friend_sessions: "Сессии друзей Facebook" + gplus_friends: "Друзья G+" + gplus_friend_sessions: "Сессии друзей G+" + leaderboard: "таблица лидеров" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee index 1591817b7..311450353 100644 --- a/app/locale/sk.coffee +++ b/app/locale/sk.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", loading: "Načítava sa..." saving: "Ukladá sa..." sending: "Odosiela sa..." +# send: "Send" cancel: "Zruš" save: "Ulož" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", versions: save_version_title: "Ulož novú verziu" new_major_version: "Nová primárna verzia" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Ak chcete uložiť svoje zmeny, musíte najprv súhlasiť s našou" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", forum_page: "naše fórum" forum_suffix: "." send: "Poslať odozvu" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", wizard_settings: title: "Nastavenia kúzelníka" customize_avatar: "Uprav svojho avatara" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Róba" trim: "Lem" cloud: "Obláčik" +# team: "Team" spell: "Kúzlo" boots: "Čižmy" hue: "Odtieň" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", wizard_tab: "Kúzelník" password_tab: "Heslo" emails_tab: "E-maily" +# job_profile_tab: "Job Profile" admin: "Spravovať" - gravatar_select: " Vyber ktorú fotografiu z Gravataru použit" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." wizard_color: "Farba kúzelníckej róby" new_password: "Nové heslo" new_password_verify: "Overenie" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", error_saving: "Chyba pri ukladaní" saved: "Zmeny uložené" password_mismatch: "Heslá nesedia." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "alebo" +# subject: "Subject" email: "Email" # password: "Password" message: "Správa" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee index fcc48d5dd..f5117a52a 100644 --- a/app/locale/sl.coffee +++ b/app/locale/sl.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee index a45e507ae..834ed73c8 100644 --- a/app/locale/sr.coffee +++ b/app/locale/sr.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian loading: "Учитавање" saving: "Чување..." sending: "Шаље се..." +# send: "Send" cancel: "Откажи" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian forum_page: "наш форум." # forum_suffix: " instead." send: "Пошаљи повратну информацију" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Помози нам у превођењу CodeCombat-а!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian wizard_tab: "Чаробњак" password_tab: "Шифра" emails_tab: "Мејлови" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Изабери Граватар фотографију " - gravatar_add_photos: "Додај сличице и фотографије за Граватар налог за свој мејл да изабереш слику." - gravatar_add_more_photos: "Додај још слика на свој Граватар налог да би им приступио овде." wizard_color: "Боја Одеће Чаробњака" new_password: "Нова Шифра" new_password_verify: "Потврди" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian error_saving: "Чување грешке..." saved: "Измене су сачуване" password_mismatch: "Шифре се не слажу." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Измени подешавања" profile_for_prefix: "Налог за " # profile_for_suffix: "" - profile: "Налог" - user_not_found: "Корисник није пронађен. Проверите УРЛ?" - gravatar_not_found_mine: "Нисмо могли да пронађемо твој налог који је повезан са:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Упиши се на " - gravatar_signup_suffix: " да би се припремио!" - gravatar_not_found_other: "Нажалост, не постоји налог повезан са дотичном мејл адресом." - gravatar_contact: "Контакт" - gravatar_websites: "Веб сајтови" - gravatar_accounts: "Као што је виђено на" - gravatar_profile_link: "Цео Граватар налог" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Ниво није могао бити учитан: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "или" +# subject: "Subject" email: "Мејл" # password: "Password" message: "Порука" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee index de9c1fa4b..7af1c1915 100644 --- a/app/locale/sv.coffee +++ b/app/locale/sv.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr loading: "Laddar..." saving: "Sparar..." sending: "Skickar..." +# send: "Send" cancel: "Avbryt" save: "Spara" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr versions: save_version_title: "Spara ny version" new_major_version: "Ny betydande version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "För att spara ändringar måste du först godkänna vår" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr forum_page: "vårt forum" forum_suffix: " istället." send: "Skicka Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hjälp till att översätta CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr wizard_settings: title: "Trollkarlsinställningar" customize_avatar: "Skräddarsy din avatar" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kläder" trim: "Dekorationer" cloud: "Moln" +# team: "Team" spell: "Trollformel" boots: "Stövlar" hue: "Nyans" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr wizard_tab: "Trollkarl" password_tab: "Lösenord" emails_tab: "E-postadresser" +# job_profile_tab: "Job Profile" admin: "Administratör" - gravatar_select: "Välj ett Gravatar-foto att använda" - gravatar_add_photos: "Lägg till miniatyrbilder och fotografier i ett Gravatar-konto kopplat till din e-postadress för att välja profilbild." - gravatar_add_more_photos: "Lägg till mer fotografier till i ditt Gravatar-konto för att använda dem här." wizard_color: "Trollkarlens klädfärg" new_password: "Nytt lösenord" new_password_verify: "Verifiera" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr error_saving: "Ett fel uppstod när ändringarna skulle sparas" saved: "Ändringar sparade" password_mismatch: "De angivna lösenorden stämmer inte överens." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Ändra inställningar" profile_for_prefix: "Profil för " # profile_for_suffix: "" - profile: "Profil" - user_not_found: "Användaren du söker verkar inte finnas. Stämmer adressen?" - gravatar_not_found_mine: "Vi kunde inte hitta en profil associerad med: " -# gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Registrera dig på " - gravatar_signup_suffix: " för att komma igång!" - gravatar_not_found_other: "Tyvärr, det finns ingen profil associerad med den här personens e-postadress." - gravatar_contact: "Kontakt" - gravatar_websites: "Hemsidor" -# gravatar_accounts: "As Seen On" - gravatar_profile_link: "Hela Gravatar-profilen" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Nivån kunde inte laddas: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr contact_us: "kontakta oss!" hipchat_prefix: "Du kan också hitta oss i vårt" hipchat_url: "HipChat-rum." +# back: "Back" revert: "Återställ" revert_models: "Återställ modeller" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Några inställningar?" level_tab_thangs: "Enheter" level_tab_scripts: "Skript" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr level_tab_components: "Komponenter" level_tab_systems: "System" level_tab_thangs_title: "Nuvarande enheter" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Startvillkor" level_tab_thangs_add: "Lägg till enheter" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Inställningar" level_component_tab_title: "Nuvarande komponenter" level_component_btn_new: "Skapa ny komponent" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr article_search_title: "Sök artiklar här" thang_search_title: "Sök enhetstyper här" level_search_title: "Sök nivåer här" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr body: "Kropp" version: "Version" commit_msg: "Förbindelsemeddelande" - history: "Historik" +# version_history: "Version History" version_history_for: "Versionshistorik för: " result: "Resultat" results: "Resultat" description: "Beskrivning" or: "eller" +# subject: "Subject" email: "E-post" password: "Lösenord" message: "Meddelande" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/th.coffee b/app/locale/th.coffee index 6d20c4a43..fda48a549 100644 --- a/app/locale/th.coffee +++ b/app/locale/th.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra loading: "รอสักครู่..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" cancel: "ยกเลิก" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # wizard_tab: "Wizard" password_tab: "รหัสผ่าน" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" new_password: "รหัสผ่านใหม่" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra error_saving: "บันทึกผิดพลาด" saved: "เปลี่ยนรหัสผ่าน" password_mismatch: "รหัสผ่านไม่ถูกต้อง" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "แก้ไขการตั้งค่า" # profile_for_prefix: "Profile for " # profile_for_suffix: "" - profile: "ประวัติส่วนตัว" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." - gravatar_contact: "ติดต่อ" - gravatar_websites: "เว็บไซต์" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee index 6c0e9dcaa..6725086d5 100644 --- a/app/locale/tr.coffee +++ b/app/locale/tr.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t loading: "Yükleniyor..." saving: "Kaydediliyor..." sending: "Gönderiliyor..." +# send: "Send" cancel: "İptal" save: "Kaydet" create: "Oluştur" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t versions: save_version_title: "Yeni Sürümü Kaydet" new_major_version: "Yeni Önemli Sürüm" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Değişiklikleri kaydetmek için ilk olarak" cla_url: "KLA'mızı" cla_suffix: "kabul etmelisiniz." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t forum_page: "forumumuzu" forum_suffix: " kullanabilirsiniz." send: "Gönder" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "CodeCombat'in tercüme edilmesine yardımcı olabilirsiniz!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t wizard_settings: title: "Sihirbaz Ayarları" customize_avatar: "Avatar'ınızı Özelleştirin" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Kıyafet" trim: "Süs" cloud: "Püs" +# team: "Team" spell: "Büyü" boots: "Çizme" hue: "Ton" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t wizard_tab: "Sihirbaz" password_tab: "Şifre" emails_tab: "E-postalar" +# job_profile_tab: "Job Profile" admin: "Yönetici" - gravatar_select: "Kullanılacak Gravatar fotoğrafını seçin" - gravatar_add_photos: "Burada resim olarak kullanmak için Gravatar hesabınıza buradaki e-posta adresinin aynısı olacak şekilde resim yükleyin." - gravatar_add_more_photos: "Burada kullanmak üzere Gravatar hesabınıza resim yükleyin." wizard_color: "Sihirbaz Kıyafeti Rengi" new_password: "Yeni Şifre" new_password_verify: "Teyit Et" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t error_saving: "Kayıt Esnasında Hata" saved: "Değişiklikler Kaydedildi" password_mismatch: "Şifreler Uyuşmuyor" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Ayarları Düzenle" # profile_for_prefix: "Profile for " profile_for_suffix: " Kullanıcısının Profili" - profile: "Profil" - user_not_found: "Kullanıcı bulunamadı. URL'den emin misiniz?" - gravatar_not_found_mine: "Şununla ilişkili profilinizi bulamadık:" - gravatar_not_found_email_suffix: "Profil resminizi düzenlemek için" - gravatar_signup_prefix: "Profil resminizi düzenlemek için" - gravatar_signup_suffix: "adresine kaydolmalısınız." - gravatar_not_found_other: "Ne yazık ki, bu kullanıcının e-postasıyla ilişkilendirilmiş bir e-posta adresi yok." - gravatar_contact: "İletişim" - gravatar_websites: "Web siteleri" - gravatar_accounts: "Görüldüğü Gibi" - gravatar_profile_link: "Tam Gravatar Profili" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Seviye yüklenemedi: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t contact_us: "bize ulaşın!" hipchat_prefix: "Bizi ayrıca" hipchat_url: "HipChat otasında bulabilirsiniz." +# back: "Back" revert: "Geri al" revert_models: "Önceki Modeller" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "Bazı Seçenekler?" level_tab_thangs: "Nesneler" level_tab_scripts: "Betikler" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t level_tab_components: "Bileşenler" level_tab_systems: "Sistemler" level_tab_thangs_title: "Geçerli Şartlar" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Başlama Şartları" level_tab_thangs_add: "Nesne Ekle" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Ayarlar" level_component_tab_title: "Geçerli Bileşenler" level_component_btn_new: "Yeni Bileşen Oluştur" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" level_search_title: "Seviye ara" +# signup_to_create: "Sign Up to Create a New Content" read_only_warning: "Uyarı: Yönetici olarak giriş yapmadığınız sürece herhangi bir değişikliği kayıt edemezsiniz." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t body: "Gövde" version: "Sürüm" commit_msg: "Gönderme İletisi" - history: "Geçmiş" + version_history: "Geçmiş" version_history_for: "Sürüm Geçmişi: " result: "Sonuç" results: "Sonuçlar" description: "Açıklama" or: "veya" +# subject: "Subject" email: "E-posta" password: "Şifre" message: "İleti" @@ -626,3 +661,5 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t gplus_friends: "G+ Arkadaşları" gplus_friend_sessions: "G+ Arkadaş Oturumları" leaderboard: "Sıralama" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee index 03ef2a2a9..611ce3c32 100644 --- a/app/locale/uk.coffee +++ b/app/locale/uk.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "українська мова", englishDesc loading: "Завантаження..." saving: "Збереження..." sending: "Надсилання..." +# send: "Send" cancel: "Відміна" save: "Зберегти" create: "Створити" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "українська мова", englishDesc versions: save_version_title: "Зберегти нову версію" new_major_version: "Зберегти основну версію" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Для збереження змін спочатку треба погодитись з нашим" cla_url: "CLA" cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "українська мова", englishDesc forum_page: "наш форум" forum_suffix: "." send: "Надіслати фідбек" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Допоможіть перекласти CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "українська мова", englishDesc wizard_settings: title: "Налаштування" customize_avatar: "Налаштувати аватар" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "Одяг" trim: "Оздоблення" cloud: "Хмаринка" +# team: "Team" spell: "Закляття" boots: "Черевики" hue: "Відтінок" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "українська мова", englishDesc wizard_tab: "Персонаж" password_tab: "Пароль" emails_tab: "Email-адреси" +# job_profile_tab: "Job Profile" admin: "Aдмін" - gravatar_select: "Оберіть, яке фото з Gravatar використовувати" - gravatar_add_photos: "Додайте фото та зменшені зображення до акаунта Gravatar, пов'язаного з вашою email-адресою, щоб обрати зображення" - gravatar_add_more_photos: "Додайти більше фото до вашого акаунта Gravatar, щоб вони були доступні тут." wizard_color: "Колір одягу персонажа" new_password: "Новий пароль" new_password_verify: "Підтвердження паролю" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "українська мова", englishDesc error_saving: "Помилка при збереженні" saved: "Зміни збережено" password_mismatch: "Паролі не збігаються." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Змінити налаштування" profile_for_prefix: "Профіль для " profile_for_suffix: "" - profile: "Профіль" - user_not_found: "Користувача не знайдено. Будь ласка, перевірте URL." - gravatar_not_found_mine: "Ми не можемо знайти ваш профіль, пов'язаний з:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Зареєструйтеся на " - gravatar_signup_suffix: " щоб продовжувати" - gravatar_not_found_other: "Нажаль, немає профіля, що пов'язаний з електронною адресою цієї людини." - gravatar_contact: "Контакти" - gravatar_websites: "Вебсайти" - gravatar_accounts: "Як показано на" - gravatar_profile_link: "Повний профіль Gravatar" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "Неможливо завантажити рівень: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "українська мова", englishDesc contact_us: "зв’яжіться з нами!" hipchat_prefix: "Ви можете також знайти нас в нашій" hipchat_url: "кімнаті HipChat." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" level_tab_thangs: "Об'єкти" level_tab_scripts: "Скрипти" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "українська мова", englishDesc level_tab_components: "Компоненти" level_tab_systems: "Системи" level_tab_thangs_title: "Поточні об'єкти" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "Початковий статус" level_tab_thangs_add: "Додати об'єкти" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "Налаштування" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "українська мова", englishDesc # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "українська мова", englishDesc body: "Тіло" version: "Версія" # commit_msg: "Commit Message" - history: "Історія" + version_history: "Історія" # version_history_for: "Version History for: " result: "Результат" results: "Результати" description: "Опис" or: "чи" +# subject: "Subject" email: "Email" password: "Пароль" message: "Повідомлення" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "українська мова", englishDesc # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee index 670e88789..d08ca0e0f 100644 --- a/app/locale/ur.coffee +++ b/app/locale/ur.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", loading: "Loading..." # saving: "Saving..." # sending: "Sending..." +# send: "Send" # cancel: "Cancel" # save: "Save" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # forum_page: "our forum" # forum_suffix: " instead." # send: "Send Feedback" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: # title: "Help translate CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee index 90b02500a..4ae41f29d 100644 --- a/app/locale/vi.coffee +++ b/app/locale/vi.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn loading: "Tải..." saving: "Lưu..." sending: "Gởi..." +# send: "Send" cancel: "Hủy" save: "Lưu" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn versions: save_version_title: "Lưu Phiên bản Mới" new_major_version: "Phiên bản chính mới" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "Để lưu thay đổi, bạn phải chấp thuận với chúng tôi trước" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn forum_page: "Diễn đàn của chúng tôi" # forum_suffix: " instead." send: "Gởi phản hồi" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "Hãy giúp dịch thuật cho CodeCombat!" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn wizard_settings: title: "Cài đặt Wizard" customize_avatar: "Tùy chỉnh Avatar của bạn" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn wizard_tab: "Wizard" password_tab: "Mật khẩu" emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "Chọn hình Gravatar để sử dụng" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." wizard_color: "Màu trang phục Wizard" new_password: "Mật khẩu mới" new_password_verify: "Xác nhận" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn error_saving: "Lỗi lưu" saved: "Thay đổi được lưu" password_mismatch: "Mật khẩu không khớp." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "Chỉnh sửa cài đặt" # profile_for_prefix: "Profile for " # profile_for_suffix: "" - profile: "Hồ sơ" - user_not_found: "Không có người sử dụng được tìm thấy. Kiểm tra URL?" - gravatar_not_found_mine: "Chúng tôi không thể tìm thấy hồ sơ của bạn được đính kèm theo:" - gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Đăng ký tại " - gravatar_signup_suffix: " để thiết lập!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" - gravatar_websites: "Địa chỉ trang Web" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" # or: "or" +# subject: "Subject" # email: "Email" # password: "Password" # message: "Message" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 3557fba6f..023933929 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese loading: "读取中……" saving: "保存中……" sending: "发送中……" +# send: "Send" cancel: "取消" save: "保存" create: "创建" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese versions: save_version_title: "保存新版本" new_major_version: "新的重要版本" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" cla_prefix: "要想保存更改,您必须先同意我们的" cla_url: "贡献者许可协议" cla_suffix: "。" @@ -111,6 +115,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese forum_page: "我们的论坛" forum_suffix: "" send: "反馈意见" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "帮助我们翻译 CodeCombat" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese wizard_settings: title: "设置向导" customize_avatar: "设置你的头像" +# active: "Active" +# color: "Color" +# group: "Group" clothes: "衣服" trim: "条纹" cloud: "云" +# team: "Team" spell: "魔法球" boots: "鞋子" hue: "颜色" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese wizard_tab: "巫师" password_tab: "密码" emails_tab: "邮件" +# job_profile_tab: "Job Profile" admin: "管理" - gravatar_select: "选择一张 Gravatar 图片" - gravatar_add_photos: "添加小图和图片到一个 Gravatar 账户供你选择。" - gravatar_add_more_photos: "去 Gravatar 添加图片, 然后回来这里查看。" wizard_color: "巫师 衣服 颜色" new_password: "新密码" new_password_verify: "核实" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese error_saving: "保存时出错" saved: "更改已保存" password_mismatch: "密码不匹配。" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "编辑设置" profile_for_prefix: "关于他的基本资料:" profile_for_suffix: "" - profile: "基本资料" - user_not_found: "没有找到用户。网址有错?" - gravatar_not_found_mine: "我们找不到他的基本资料:" - gravatar_not_found_email_suffix: "。" - gravatar_signup_prefix: "去注册 " - gravatar_signup_suffix: " 来设置!" - gravatar_not_found_other: "哎呀,没有与这个邮箱相关的资料。" - gravatar_contact: "联系" - gravatar_websites: "网站" - gravatar_accounts: "显示为" - gravatar_profile_link: "完善 Gravatar 资料" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "关卡不能载入: " @@ -250,7 +273,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese think_solution: "思考解决方法, 而不是问题." # tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" # tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" -# tip_debugging_program: "如果说调试修理 bug 的一种流程, 那么编程肯定是制造bug的流程f debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" +# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" # tip_forums: "Head over to the forums and tell us what you think!" # tip_baby_coders: "In the future, even babies will be Archmages." # tip_morale_improves: "Loading will continue until morale improves." @@ -262,7 +285,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese tip_binary: "这个世界上只有 10 种人: 那些懂二进制的, 还有那些不懂二进制的." # tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" tip_no_try: "做. 或是不做. 这世上不存在'尝试'这种东西. - 尤达大师" -# tip_patience: "Patience you must have, young Padawan. - 尤达大师" +# tip_patience: "Patience you must have, young Padawan. - Yoda" tip_documented_bug: "一个写在文档里的漏洞不算漏洞, 那是个功能." tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" tip_talk_is_cheap: "多说无用, 亮出你的代码. - Linus Torvalds" @@ -295,8 +318,15 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese contact_us: "联系我们!" hipchat_prefix: "你也可以在这里找到我们" hipchat_url: "HipChat 房间。" +# back: "Back" revert: "还原" revert_models: "还原模式" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" level_some_options: "有哪些选项?" level_tab_thangs: "物体" level_tab_scripts: "脚本" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese level_tab_components: "组件" level_tab_systems: "系统" level_tab_thangs_title: "目前所有物体" +# level_tab_thangs_all: "All" level_tab_thangs_conditions: "启动条件" level_tab_thangs_add: "增加物体" +# delete: "Delete" +# duplicate: "Duplicate" level_settings_title: "设置" level_component_tab_title: "目前所有组件" level_component_btn_new: "创建新的组件" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese article_search_title: "在这里搜索物品" thang_search_title: "在这里搜索物品类型" level_search_title: "在这里搜索关卡" +# signup_to_create: "Sign Up to Create a New Content" read_only_warning: "注意: 你无法保存这里的编辑结果, 因为你没有以管理员身份登录." article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese body: "正文" version: "版本" commit_msg: "提交信息" - history: "历史" +# version_history: "Version History" version_history_for: "版本历史: " result: "结果" results: "结果" description: "描述" or: "或" +# subject: "Subject" email: "邮件" password: "密码" message: "信息" @@ -559,7 +594,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese please_login: "请在对奕之前先登录." my_matches: "我的对手" simulate: "模拟" -# simulation_explanation: "通过模拟游戏, 你可以把排名提的更快!" +# simulation_explanation: "By simulating games you can get your game ranked faster!" simulate_games: "模拟游戏!" # simulate_all: "RESET AND SIMULATE GAMES" # games_simulated_by: "Games simulated by you:" @@ -626,3 +661,5 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese gplus_friends: "G+ 朋友" # gplus_friend_sessions: "G+ Friend Sessions" leaderboard: "排行榜" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee index e1d4e62c8..17efa98e0 100644 --- a/app/locale/zh-HANT.coffee +++ b/app/locale/zh-HANT.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese loading: "Loading..." saving: "儲存中..." sending: "發送中...." +# send: "Send" cancel: "取消" save: "存檔" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese forum_page: "論壇" forum_suffix: "討論。" send: "意見反饋" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "幫我們翻譯CodeCombat" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese wizard_tab: "巫師" password_tab: "密碼" emails_tab: "郵件" +# job_profile_tab: "Job Profile" # admin: "Admin" - gravatar_select: "選擇一個Gravatar" - gravatar_add_photos: "上傳頭像到Gravatar" -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." wizard_color: "巫師 衣服 顏色" new_password: "新密碼" new_password_verify: "確認密碼" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese error_saving: "保存時發生錯誤" saved: "修改已儲存" password_mismatch: "密碼不正確。" +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." account_profile: edit_settings: "帳號設定" profile_for_prefix: "關於" profile_for_suffix: "的基本資料" - profile: "基本資料" - user_not_found: "沒有找到用戶。檢查URL?" - gravatar_not_found_mine: "我們找不到有關" - gravatar_not_found_email_suffix: "的資料" - gravatar_signup_prefix: "請至" - gravatar_signup_suffix: " 註冊帳號" - gravatar_not_found_other: "哎呦,找不到這個地址的資料。" - gravatar_contact: "聯繫我們" - gravatar_websites: "網站" - gravatar_accounts: "顯示為" - gravatar_profile_link: "完善 Gravatar 資料" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" play_level: level_load_error: "載入關卡時發生錯誤: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "或" +# subject: "Subject" # email: "Email" # password: "Password" message: "訊息" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/locale/zh.coffee b/app/locale/zh.coffee index 26f9f4118..dcd0038a7 100644 --- a/app/locale/zh.coffee +++ b/app/locale/zh.coffee @@ -3,6 +3,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra loading: "加载中..." saving: "正在保存..." sending: "在发送中。。。" +# send: "Send" cancel: "退出" save: "保存" # create: "Create" @@ -46,6 +47,9 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # versions: # save_version_title: "Save New Version" # new_major_version: "New Major Version" +# update_break_level: "(Could this update break old solutions of the level?)" +# update_break_component: "(Could this update break anything depending on this Component?)" +# update_break_system: "(Could this update break anything depending on this System?)" # cla_prefix: "To save changes, first you must agree to our" # cla_url: "CLA" # cla_suffix: "." @@ -111,6 +115,8 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra forum_page: "我们的论坛" # forum_suffix: " instead." send: "意见反馈" +# contact_candidate: "Contact Candidate" +# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." diplomat_suggestion: title: "帮我们翻译CodeCombat" @@ -123,9 +129,13 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # wizard_settings: # title: "Wizard Settings" # customize_avatar: "Customize Your Avatar" +# active: "Active" +# color: "Color" +# group: "Group" # clothes: "Clothes" # trim: "Trim" # cloud: "Cloud" +# team: "Team" # spell: "Spell" # boots: "Boots" # hue: "Hue" @@ -141,10 +151,8 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# job_profile_tab: "Job Profile" # admin: "Admin" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." # wizard_color: "Wizard Clothes Color" # new_password: "New Password" # new_password_verify: "Verify" @@ -161,22 +169,37 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # error_saving: "Error Saving" # saved: "Changes Saved" # password_mismatch: "Password does not match." +# job_profile: "Job Profile" +# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." +# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # account_profile: # edit_settings: "Edit Settings" # profile_for_prefix: "Profile for " # profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" +# approved: "Approved" +# not_approved: "Not Approved" +# looking_for: "Looking for:" +# last_updated: "Last updated:" +# contact: "Contact" +# work_experience: "Work Experience" +# education: "Education" +# our_notes: "Our Notes" +# projects: "Projects" + +# employers: +# want_to_hire_our_players: "Want to hire expert CodeCombat players?" +# contact_george: "Contact George to see our candidates" +# candidates_count_prefix: "We currently have " +# candidates_count_many: "many" +# candidates_count_suffix: "highly skilled and vetted developers looking for work." +# candidate_name: "Name" +# candidate_location: "Location" +# candidate_looking_for: "Looking For" +# candidate_role: "Role" +# candidate_top_skills: "Top Skills" +# candidate_years_experience: "Yrs Exp" +# candidate_last_updated: "Last Updated" # play_level: # level_load_error: "Level could not be loaded: " @@ -295,8 +318,15 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# back: "Back" # revert: "Revert" # revert_models: "Revert Models" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# level_publish: "Publish This Level (irreversible)?" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -304,8 +334,11 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # level_tab_components: "Components" # level_tab_systems: "Systems" # level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" +# delete: "Delete" +# duplicate: "Duplicate" # level_settings_title: "Settings" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" @@ -327,6 +360,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # article_search_title: "Search Articles Here" # thang_search_title: "Search Thang Types Here" # level_search_title: "Search Levels Here" +# signup_to_create: "Sign Up to Create a New Content" # read_only_warning: "Note: you can't save any edits here, because you're not logged in as an admin." # article: @@ -339,12 +373,13 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # body: "Body" # version: "Version" # commit_msg: "Commit Message" -# history: "History" +# version_history: "Version History" # version_history_for: "Version History for: " # result: "Result" # results: "Results" # description: "Description" or: "或" +# subject: "Subject" email: "邮箱" # password: "Password" message: "留言" @@ -625,4 +660,6 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # facebook_friend_sessions: "Facebook Friend Sessions" # gplus_friends: "G+ Friends" # gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "leaderboard" +# leaderboard: "Leaderboard" +# user_schema: "User Schema" +# user_profile: "User Profile" diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 862ba72fd..e63e1cd0a 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -1,11 +1,6 @@ storage = require 'lib/storage' - -class CocoSchema extends Backbone.Model - constructor: (path, args...) -> - super(args...) - @urlRoot = path + '/schema' - -window.CocoSchema = CocoSchema +deltasLib = require 'lib/deltas' +auth = require 'lib/auth' class CocoModel extends Backbone.Model idAttribute: "_id" @@ -16,26 +11,28 @@ class CocoModel extends Backbone.Model initialize: -> super() - @constructor.schema ?= new CocoSchema(@urlRoot) + @constructor.schema ?= require "schemas/models/#{@urlRoot[4..].replace '.', '_'}" if not @constructor.className console.error("#{@} needs a className set.") @markToRevert() - if @constructor.schema?.loaded - @addSchemaDefaults() - else - @loadSchema() + @addSchemaDefaults() @once 'sync', @onLoaded, @ @saveBackup = _.debounce(@saveBackup, 500) type: -> @constructor.className + + clone: (withChanges=true) -> + # Backbone does not support nested documents + clone = super() + clone.set($.extend(true, {}, if withChanges then @attributes else @_revertAttributes)) + clone onLoaded: -> @loaded = true @loading = false - if @constructor.schema?.loaded - @markToRevert() - @loadFromBackup() + @markToRevert() + @loadFromBackup() set: -> res = super(arguments...) @@ -54,22 +51,10 @@ class CocoModel extends Backbone.Model CocoModel.backedUp[@id] = @ @backedUp = {} - - loadSchema: -> - return if @constructor.schema.loading - @constructor.schema.fetch() - @listenToOnce(@constructor.schema, 'sync', @onConstructorSync) - - onConstructorSync: -> - @constructor.schema.loaded = true - @addSchemaDefaults() - @trigger 'schema-loaded' - - @hasSchema: -> return @schema?.loaded schema: -> return @constructor.schema validate: -> - result = tv4.validateMultiple(@attributes, @constructor.schema?.attributes or {}) + result = tv4.validateMultiple(@attributes, @constructor.schema? or {}) if result.errors?.length console.log @, "got validate result with errors:", result return result.errors unless result.valid @@ -83,6 +68,7 @@ class CocoModel extends Backbone.Model @markToRevert() @clearBackup() @trigger "save", @ + patch.setStatus 'accepted' for patch in @acceptedPatches or [] return super attrs, options fetch: -> @@ -108,7 +94,9 @@ class CocoModel extends Backbone.Model cloneNewMinorVersion: -> newData = $.extend(null, {}, @attributes) - new @constructor(newData) + clone = new @constructor(newData) + clone.acceptedPatches = @acceptedPatches + clone cloneNewMajorVersion: -> clone = @cloneNewMinorVersion() @@ -125,13 +113,13 @@ class CocoModel extends Backbone.Model @set "permissions", (@get("permissions") or []).concat({access: 'read', target: 'public'}) addSchemaDefaults: -> - return if @addedSchemaDefaults or not @constructor.hasSchema() + return if @addedSchemaDefaults @addedSchemaDefaults = true - for prop, defaultValue of @constructor.schema.attributes.default or {} + for prop, defaultValue of @constructor.schema.default or {} continue if @get(prop)? #console.log "setting", prop, "to", defaultValue, "from attributes.default" @set prop, defaultValue - for prop, sch of @constructor.schema.attributes.properties or {} + for prop, sch of @constructor.schema.properties or {} continue if @get(prop)? #console.log "setting", prop, "to", sch.default, "from sch.default" if sch.default? @set prop, sch.default if sch.default? @@ -143,7 +131,7 @@ class CocoModel extends Backbone.Model # returns unfetched model shells for every referenced doc in this model # OPTIMIZE so that when loading models, it doesn't cause the site to stutter data ?= @attributes - schema ?= @schema().attributes + schema ?= @schema() models = [] if $.isArray(data) and schema.items? @@ -194,11 +182,13 @@ class CocoModel extends Backbone.Model return model @isObjectID: (s) -> - s.length is 24 and s.match(/[a-z0-9]/gi)?.length is 24 + s.length is 24 and s.match(/[a-f0-9]/gi)?.length is 24 hasReadAccess: (actor) -> # actor is a User object + actor ?= auth.me + return true if actor.isAdmin() if @get('permissions')? for permission in @get('permissions') if permission.target is 'public' or actor.get('_id') is permission.target @@ -209,12 +199,31 @@ class CocoModel extends Backbone.Model hasWriteAccess: (actor) -> # actor is a User object + actor ?= auth.me + return true if actor.isAdmin() if @get('permissions')? for permission in @get('permissions') if permission.target is 'public' or actor.get('_id') is permission.target return true if permission.access in ['owner', 'write'] return false - + + getDelta: -> + differ = deltasLib.makeJSONDiffer() + differ.diff @_revertAttributes, @attributes + + applyDelta: (delta) -> + newAttributes = $.extend(true, {}, @attributes) + jsondiffpatch.patch newAttributes, delta + @set newAttributes + + getExpandedDelta: -> + delta = @getDelta() + deltasLib.expandDelta(delta, @_revertAttributes, @schema()) + + addPatchToAcceptOnSave: (patch) -> + @acceptedPatches ?= [] + @acceptedPatches.push patch + @acceptedPatches = _.uniq(@acceptedPatches, false, (p) -> p.id) module.exports = CocoModel diff --git a/app/models/Patch.coffee b/app/models/Patch.coffee new file mode 100644 index 000000000..68b62eca9 --- /dev/null +++ b/app/models/Patch.coffee @@ -0,0 +1,8 @@ +CocoModel = require('./CocoModel') + +module.exports = class PatchModel extends CocoModel + @className: "Patch" + urlRoot: "/db/patch" + + setStatus: (status) -> + $.ajax("/db/patch/#{@id}/status", {type:"PUT", data: {status:status}}) \ No newline at end of file diff --git a/app/schemas/definitions/bus.coffee b/app/schemas/definitions/bus.coffee new file mode 100644 index 000000000..b5625025e --- /dev/null +++ b/app/schemas/definitions/bus.coffee @@ -0,0 +1,14 @@ +module.exports = + bus: + title: "Bus" + id: "bus" + $schema: "http://json-schema.org/draft-04/schema#" + description: "Bus" # TODO + type: "object" + properties: # TODO + joined: + type: "boolean" + players: + type: "object" + required: ["joined", "players"] + additionalProperties: false \ No newline at end of file diff --git a/app/schemas/definitions/misc.coffee b/app/schemas/definitions/misc.coffee new file mode 100644 index 000000000..bbf9f5c02 --- /dev/null +++ b/app/schemas/definitions/misc.coffee @@ -0,0 +1,12 @@ +module.exports = + jQueryEvent: + title: "jQuery Event" + id: "jQueryEvent" + $schema: "http://json-schema.org/draft-04/schema#" + description: "A standard jQuery Event" + type: "object" + properties: # TODO schema complete + altKey: + type: "boolean" + required: [] + additionalProperties: true diff --git a/server/commons/i18n_schema.coffee b/app/schemas/i18n_schema.coffee similarity index 100% rename from server/commons/i18n_schema.coffee rename to app/schemas/i18n_schema.coffee diff --git a/app/schemas/languages.coffee b/app/schemas/languages.coffee new file mode 100644 index 000000000..053a89f2a --- /dev/null +++ b/app/schemas/languages.coffee @@ -0,0 +1,34 @@ +locale = require '../locale/locale' # requiring from app; will break if we stop serving from where app lives + +languages = [] +for code, localeInfo of locale + languages.push code: code, nativeDescription: localeInfo.nativeDescription, englishDescription: localeInfo.englishDescription + +module.exports.languages = languages +module.exports.languageCodes = languageCodes = (language.code for language in languages) +module.exports.languageCodesLower = languageCodesLower = (code.toLowerCase() for code in languageCodes) + +# Keep keys lower-case for matching and values with second subtag uppercase like i18next expects +languageAliases = + 'en': 'en-US' + + 'zh-cn': 'zh-HANS' + 'zh-hans-cn': 'zh-HANS' + 'zh-sg': 'zh-HANS' + 'zh-hans-sg': 'zh-HANS' + + 'zh-tw': 'zh-HANT' + 'zh-hant-tw': 'zh-HANT' + 'zh-hk': 'zh-HANT' + 'zh-hant-hk': 'zh-HANT' + 'zh-mo': 'zh-HANT' + 'zh-hant-mo': 'zh-HANT' + +module.exports.languageCodeFromAcceptedLanguages = languageCodeFromAcceptedLanguages = (acceptedLanguages) -> + for lang in acceptedLanguages ? [] + code = languageAliases[lang.toLowerCase()] + return code if code + codeIndex = _.indexOf languageCodesLower, lang + if codeIndex isnt -1 + return languageCodes[codeIndex] + return 'en-US' diff --git a/server/commons/metaschema.coffee b/app/schemas/metaschema.coffee similarity index 100% rename from server/commons/metaschema.coffee rename to app/schemas/metaschema.coffee diff --git a/server/articles/article_schema.coffee b/app/schemas/models/article.coffee similarity index 50% rename from server/articles/article_schema.coffee rename to app/schemas/models/article.coffee index 1fd4769f7..60f65640f 100644 --- a/server/articles/article_schema.coffee +++ b/app/schemas/models/article.coffee @@ -1,13 +1,14 @@ -c = require '../commons/schemas' +c = require './../schemas' ArticleSchema = c.object() c.extendNamedProperties ArticleSchema # name first ArticleSchema.properties.body = { type: 'string', title: 'Content', format: 'markdown' } -ArticleSchema.properties.i18n = { type: 'object', title: 'i18n', format: 'i18n', props: ['body'] } +ArticleSchema.properties.i18n = { type: 'object', title: 'i18n', format: 'i18n', props: ['name', 'body'] } -c.extendBasicProperties(ArticleSchema, 'article') -c.extendSearchableProperties(ArticleSchema) -c.extendVersionedProperties(ArticleSchema, 'article') +c.extendBasicProperties ArticleSchema, 'article' +c.extendSearchableProperties ArticleSchema +c.extendVersionedProperties ArticleSchema, 'article' +c.extendPatchableProperties ArticleSchema module.exports = ArticleSchema diff --git a/server/levels/level_schema.coffee b/app/schemas/models/level.coffee similarity index 97% rename from server/levels/level_schema.coffee rename to app/schemas/models/level.coffee index 8d2d60cd3..7180c6a67 100644 --- a/server/levels/level_schema.coffee +++ b/app/schemas/models/level.coffee @@ -1,5 +1,5 @@ -c = require '../commons/schemas' -ThangComponentSchema = require './thangs/thang_component_schema' +c = require './../schemas' +ThangComponentSchema = require './../models/thang_component' SpecificArticleSchema = c.object() c.extendNamedProperties SpecificArticleSchema # name first @@ -108,9 +108,9 @@ NoteGroupSchema = c.object {title: "Note Group", description: "A group of notes lock: {title: "Lock", description: "Whether the interface should be locked so that the player's focus is on the script, or specific areas to lock.", type: ['boolean', 'array'], items: {type: 'string', enum: ['surface', 'editor', 'palette', 'hud', 'playback', 'playback-hover', 'level', ]}} letterbox: {type: 'boolean', title: 'Letterbox', description:'Turn letterbox mode on or off. Disables surface and playback controls.'} - goals: c.object {title: "Goals", description: "Add or remove goals for the player to complete in the level."}, - add: c.array {title: "Add", description: "Add these goals."}, GoalSchema - remove: c.array {title: "Remove", description: "Remove these goals."}, GoalSchema + goals: c.object {title: "Goals (Old)", description: "Deprecated. Goals added here have no effect. Add goals in the level settings instead."}, + add: c.array {title: "Add", description: "Deprecated. Goals added here have no effect. Add goals in the level settings instead."}, GoalSchema + remove: c.array {title: "Remove", description: "Deprecated. Goals removed here have no effect. Adjust goals in the level settings instead."}, GoalSchema playback: c.object {title: "Playback", description: "Control the playback of the level."}, playing: {type: 'boolean', title: "Set Playing", description: "Set whether playback is playing or paused."} @@ -243,6 +243,7 @@ c.extendBasicProperties LevelSchema, 'level' c.extendSearchableProperties LevelSchema c.extendVersionedProperties LevelSchema, 'level' c.extendPermissionsProperties LevelSchema, 'level' +c.extendPatchableProperties LevelSchema module.exports = LevelSchema diff --git a/server/levels/components/level_component_schema.coffee b/app/schemas/models/level_component.coffee similarity index 97% rename from server/levels/components/level_component_schema.coffee rename to app/schemas/models/level_component.coffee index ac399da2c..8552979ee 100644 --- a/server/levels/components/level_component_schema.coffee +++ b/app/schemas/models/level_component.coffee @@ -1,5 +1,5 @@ -c = require '../../commons/schemas' -metaschema = require '../../commons/metaschema' +c = require './../schemas' +metaschema = require './../metaschema' attackSelfCode = """ class AttacksSelf extends Component @@ -115,5 +115,6 @@ c.extendBasicProperties LevelComponentSchema, 'level.component' c.extendSearchableProperties LevelComponentSchema c.extendVersionedProperties LevelComponentSchema, 'level.component' c.extendPermissionsProperties LevelComponentSchema, 'level.component' +c.extendPatchableProperties LevelComponentSchema module.exports = LevelComponentSchema diff --git a/server/levels/feedbacks/level_feedback_schema.coffee b/app/schemas/models/level_feedback.coffee similarity index 95% rename from server/levels/feedbacks/level_feedback_schema.coffee rename to app/schemas/models/level_feedback.coffee index 54d9e84e1..f8bb6a73c 100644 --- a/server/levels/feedbacks/level_feedback_schema.coffee +++ b/app/schemas/models/level_feedback.coffee @@ -1,4 +1,4 @@ -c = require '../../commons/schemas' +c = require './../schemas' LevelFeedbackLevelSchema = c.object {required: ['original', 'majorVersion']}, { original: c.objectId({}) diff --git a/server/levels/sessions/level_session_schema.coffee b/app/schemas/models/level_session.coffee similarity index 99% rename from server/levels/sessions/level_session_schema.coffee rename to app/schemas/models/level_session.coffee index d798a9d88..670dc9ad4 100644 --- a/server/levels/sessions/level_session_schema.coffee +++ b/app/schemas/models/level_session.coffee @@ -1,4 +1,4 @@ -c = require '../../commons/schemas' +c = require './../schemas' LevelSessionPlayerSchema = c.object id: c.objectId diff --git a/server/levels/systems/level_system_schema.coffee b/app/schemas/models/level_system.coffee similarity index 96% rename from server/levels/systems/level_system_schema.coffee rename to app/schemas/models/level_system.coffee index cc4bc7891..1804de363 100644 --- a/server/levels/systems/level_system_schema.coffee +++ b/app/schemas/models/level_system.coffee @@ -1,5 +1,5 @@ -c = require '../../commons/schemas' -metaschema = require '../../commons/metaschema' +c = require './../schemas' +metaschema = require './../metaschema' jitterSystemCode = """ class Jitter extends System @@ -101,6 +101,7 @@ _.extend LevelSystemSchema.properties, c.extendBasicProperties LevelSystemSchema, 'level.system' c.extendSearchableProperties LevelSystemSchema c.extendVersionedProperties LevelSystemSchema, 'level.system' -c.extendPermissionsProperties LevelSystemSchema, 'level.system' +c.extendPermissionsProperties LevelSystemSchema +c.extendPatchableProperties LevelSystemSchema module.exports = LevelSystemSchema diff --git a/app/schemas/models/patch.coffee b/app/schemas/models/patch.coffee new file mode 100644 index 000000000..e14423371 --- /dev/null +++ b/app/schemas/models/patch.coffee @@ -0,0 +1,27 @@ +c = require './../schemas' + +patchables = ['level', 'thang_type', 'level_system', 'level_component', 'article'] + +PatchSchema = c.object({title:'Patch', required:['target', 'delta', 'commitMessage']}, { + delta: { title: 'Delta', type:['array', 'object'] } + commitMessage: c.shortString({maxLength: 500, minLength: 1}) + creator: c.objectId(links: [{rel: 'extra', href: "/db/user/{($)}"}]) + created: c.date( { title: 'Created', readOnly: true }) + status: { enum: ['pending', 'accepted', 'rejected', 'withdrawn']} + + target: c.object({title: 'Target', required:['collection', 'id']}, { + collection: { enum: patchables } + id: c.objectId(title: 'Target ID') # search by this if not versioned + + # if target is versioned, want to know that info too + original: c.objectId(title: 'Target Original') # search by this if versioned + version: + properties: + major: { type: 'number', minimum: 0 } + minor: { type: 'number', minimum: 0 } + }) +}) + +c.extendBasicProperties(PatchSchema, 'patch') + +module.exports = PatchSchema diff --git a/server/levels/thangs/thang_component_schema.coffee b/app/schemas/models/thang_component.coffee similarity index 95% rename from server/levels/thangs/thang_component_schema.coffee rename to app/schemas/models/thang_component.coffee index 0118d3a4c..eebcf155b 100644 --- a/server/levels/thangs/thang_component_schema.coffee +++ b/app/schemas/models/thang_component.coffee @@ -1,4 +1,4 @@ -c = require '../../commons/schemas' +c = require './../schemas' module.exports = ThangComponentSchema = c.object { title: "Component" diff --git a/server/levels/thangs/thang_type_schema.coffee b/app/schemas/models/thang_type.coffee similarity index 96% rename from server/levels/thangs/thang_type_schema.coffee rename to app/schemas/models/thang_type.coffee index 8b70ccbaf..eb78c1c11 100644 --- a/server/levels/thangs/thang_type_schema.coffee +++ b/app/schemas/models/thang_type.coffee @@ -1,5 +1,5 @@ -c = require '../../commons/schemas' -ThangComponentSchema = require './thang_component_schema' +c = require './../schemas' +ThangComponentSchema = require './thang_component' ThangTypeSchema = c.object() c.extendNamedProperties ThangTypeSchema # name first @@ -146,8 +146,9 @@ ThangTypeSchema.definitions = action: ActionSchema sound: SoundSchema -c.extendBasicProperties(ThangTypeSchema, 'thang.type') -c.extendSearchableProperties(ThangTypeSchema) -c.extendVersionedProperties(ThangTypeSchema, 'thang.type') +c.extendBasicProperties ThangTypeSchema, 'thang.type' +c.extendSearchableProperties ThangTypeSchema +c.extendVersionedProperties ThangTypeSchema, 'thang.type' +c.extendPatchableProperties ThangTypeSchema module.exports = ThangTypeSchema diff --git a/server/users/user_schema.coffee b/app/schemas/models/user.coffee similarity index 99% rename from server/users/user_schema.coffee rename to app/schemas/models/user.coffee index c7de194e3..6bb3939e6 100644 --- a/server/users/user_schema.coffee +++ b/app/schemas/models/user.coffee @@ -1,4 +1,4 @@ -c = require '../commons/schemas' +c = require './../schemas' emailSubscriptions = ['announcement', 'tester', 'level_creator', 'developer', 'article_editor', 'translator', 'support', 'notification'] UserSchema = c.object {}, diff --git a/server/commons/schemas.coffee b/app/schemas/schemas.coffee similarity index 89% rename from server/commons/schemas.coffee rename to app/schemas/schemas.coffee index 49d97bbfe..2d7ae0603 100644 --- a/server/commons/schemas.coffee +++ b/app/schemas/schemas.coffee @@ -1,5 +1,5 @@ #language imports -Language = require '../routes/languages' +Language = require './languages' # schema helper methods me = module.exports @@ -15,7 +15,7 @@ me.object = (ext, props) -> combine {type: 'object', additionalProperties: false me.array = (ext, items) -> combine {type: 'array', items: items or {}}, ext me.shortString = (ext) -> combine({type: 'string', maxLength: 100}, ext) me.pct = (ext) -> combine({type: 'number', maximum: 1.0, minimum: 0.0}, ext) -me.date = (ext) -> combine({type: 'string', format: 'date-time'}, ext) +me.date = (ext) -> combine({type: ['object', 'string'], format: 'date-time'}, ext) # should just be string (Mongo ID), but sometimes mongoose turns them into objects representing those, so we are lenient me.objectId = (ext) -> schema = combine({type: ['object', 'string'] }, ext) me.url = (ext) -> combine({type: 'string', format: 'url', pattern: urlPattern}, ext) @@ -54,7 +54,21 @@ basicProps = (linkFragment) -> me.extendBasicProperties = (schema, linkFragment) -> schema.properties = {} unless schema.properties? _.extend(schema.properties, basicProps(linkFragment)) + +# PATCHABLE +patchableProps = -> + patches: me.array({title:'Patches'}, { + _id: me.objectId(links: [{rel: "db", href: "/db/patch/{($)}"}], title: "Patch ID", description: "A reference to the patch.") + status: { enum: ['pending', 'accepted', 'rejected', 'cancelled']} + }) + allowPatches: { type: 'boolean' } + listeners: me.array({title:'Listeners'}, + me.objectId(links: [{rel: 'extra', href: "/db/user/{($)}"}])) + +me.extendPatchableProperties = (schema) -> + schema.properties = {} unless schema.properties? + _.extend(schema.properties, patchableProps()) # NAMED diff --git a/app/schemas/subscriptions/app.coffee b/app/schemas/subscriptions/app.coffee new file mode 100644 index 000000000..7d0673751 --- /dev/null +++ b/app/schemas/subscriptions/app.coffee @@ -0,0 +1,18 @@ +module.exports = + "application:idle-changed": + {} # TODO schema + + "logging-in-with-facebook": + {} # TODO schema + + "facebook-logged-in": + {} # TODO schema + + "gapi-loaded": + {} # TODO schema + + "logging-in-with-gplus": + {} # TODO schema + + "gplus-logged-in": + {} # TODO schema diff --git a/app/schemas/subscriptions/bus.coffee b/app/schemas/subscriptions/bus.coffee new file mode 100644 index 000000000..549793f3b --- /dev/null +++ b/app/schemas/subscriptions/bus.coffee @@ -0,0 +1,27 @@ +module.exports = + "bus:connecting": + title: "Bus Connecting" + $schema: "http://json-schema.org/draft-04/schema#" + description: "Published when a Bus starts connecting" + type: "object" + properties: + bus: + $ref: "bus" + + "bus:connected": + {} # TODO schema + + "bus:disconnected": + {} # TODO schema + + "bus:new-message": + {} # TODO schema + + "bus:player-joined": + {} # TODO schema + + "bus:player-left": + {} # TODO schema + + "bus:player-states-changed": + {} # TODO schema \ No newline at end of file diff --git a/app/schemas/subscriptions/editor.coffee b/app/schemas/subscriptions/editor.coffee new file mode 100644 index 000000000..eba61f772 --- /dev/null +++ b/app/schemas/subscriptions/editor.coffee @@ -0,0 +1,78 @@ +module.exports = + "save-new-version": + title: "Save New Version" + $schema: "http://json-schema.org/draft-04/schema#" + description: "Published when a version gets saved" + type: "object" + properties: + major: + type: "boolean" + commitMessage: + type: "string" + required: ["major", "commitMessage"] + additionalProperties: false + + # TODO all these events starting with 'level:' should have 'editor' in their name + # to avoid confusion with level play events + + "level:view-switched": + title: "Level View Switched" + $schema: "http://json-schema.org/draft-04/schema#" + description: "Published whenever the view switches" + $ref: "jQueryEvent" + + "level-components-changed": + {} # TODO schema + + "edit-level-component": + {} # TODO schema + + "level-component-edited": + {} # TODO schema + + "level-component-editing-ended": + {} # TODO schema + + "level-systems-changed": + {} # TODO schema + + "edit-level-system": + {} # TODO schema + + "level-system-added": + {} # TODO schema + + "level-system-edited": + {} # TODO schema + + "level-system-editing-ended": + {} # TODO schema + + "level-thangs-changed": + title: "Level Thangs Changed" + $schema: "http://json-schema.org/draft-04/schema#" + description: "Published when a Thang changes" + type: "object" + properties: + thangsData: + type: "array" + required: ["thangsData"] + additionalProperties: false + + "edit-level-thang": + {} # TODO schema + + "level-thang-edited": + {} # TODO schema + + "level-thang-done-editing": + {} # TODO schema + + "level-loaded": + {} # TODO schema + + "level-reload-from-data": + {} # TODO schema + + "save-new-version": + {} # TODO schema diff --git a/app/schemas/subscriptions/errors.coffee b/app/schemas/subscriptions/errors.coffee new file mode 100644 index 000000000..4fa0e33ef --- /dev/null +++ b/app/schemas/subscriptions/errors.coffee @@ -0,0 +1,5 @@ +module.exports = + # app/lib/errors + "server-error": + {} # TODO schema + diff --git a/app/schemas/subscriptions/misc.coffee b/app/schemas/subscriptions/misc.coffee new file mode 100644 index 000000000..5834aaff8 --- /dev/null +++ b/app/schemas/subscriptions/misc.coffee @@ -0,0 +1,20 @@ +module.exports = + "audio-played:loaded": + {} # TODO schema + + # TODO location is debatable + "note-group-started": + {} # TODO schema + + "note-group-ended": + {} # TODO schema + + "modal-closed": + {} # TODO schema + + # TODO I propose prepending 'modal:' + "save-new-version": + {} # TODO schema + + "router:navigate": + {} # TODO schema diff --git a/app/schemas/subscriptions/play.coffee b/app/schemas/subscriptions/play.coffee new file mode 100644 index 000000000..356f06a36 --- /dev/null +++ b/app/schemas/subscriptions/play.coffee @@ -0,0 +1,118 @@ +module.exports = + # TODO There should be a better way to divide these channels into smaller ones + + # TODO location is debatable + "echo-self-wizard-sprite": + {} # TODO schema + + "level:session-will-save": + {} # TODO schema + + "level-loader:progress-changed": + {} # TODO schema + + "level:shift-space-pressed": + {} # TODO schema + + "level:escape-pressed": + {} # TODO schema + + "level-enable-controls": + {} # TODO schema + + "level-set-letterbox": + {} # TODO schema + + "level:started": + {} # TODO schema + + "level-set-debug": + {} # TODO schema + + "level-set-grid": + {} # TODO schema + + "tome:cast-spell": + {} # TODO schema + + "level:restarted": + {} # TODO schema + + "level-set-volume": + {} # TODO schema + + "level-set-time": + {} # TODO schema + + "level-select-sprite": + {} # TODO schema + + "level-set-playing": + {} # TODO schema + + "level:team-set": + {} # TODO schema + + "level:docs-hidden": + {} # TODO schema + + "level:victory-hidden": + {} # TODO schema + + "next-game-pressed": + {} # TODO schema + + "focus-editor": + {} # TODO schema + + "end-current-script": + {} # TODO schema + + "script:reset": + {} # TODO schema + + "script:ended": + {} # TODO schema + + "script:state-changed": + {} # TODO schema + + "play-sound": + {} # TODO schema + + # TODO refactor name + "onLoadingViewUnveiled": + {} # TODO schema + + "playback:manually-scrubbed": + {} # TODO schema + + "change:editor-config": + {} # TODO schema + + "restart-level": + {} # TODO schema + + "play-next-level": + {} # TODO schema + + "level-select-sprite": + {} # TODO schema + + "level-toggle-grid": + {} # TODO schema + + "level-toggle-debug": + {} # TODO schema + + "level-toggle-pathfinding": + {} # TODO schema + + "level-scrub-forward": + {} # TODO schema + + "level-scrub-back": + {} # TODO schema + + "goal-manager:new-goal-states": + {} # TODO schema diff --git a/app/schemas/subscriptions/surface.coffee b/app/schemas/subscriptions/surface.coffee new file mode 100644 index 000000000..6fa5f2415 --- /dev/null +++ b/app/schemas/subscriptions/surface.coffee @@ -0,0 +1,96 @@ +module.exports = # /app/lib/surface + "camera-dragged": + {} # TODO schema + + "camera-zoom-in": + {} # TODO schema + + "camera-zoom-out": + {} # TODO schema + + "camera-zoom-to": + {} # TODO schema + + "camera:zoom-updated": + {} # TODO schema + + "sprite:speech-updated": + {} # TODO schema + + "dialogue-sound-completed": + {} # TODO schema + + "surface:gold-changed": + {} # TODO schema + + "surface:coordinate-selected": + {} # TODO schema + + "surface:coordinates-shown": + {} # TODO schema + + "level-sprite-clear-dialogue": + {} # TODO schema + + "sprite:loaded": + {} # TODO schema + + "choose-point": + {} # TODO schema + + "choose-region": + {} # TODO schema + + "surface:new-thang-added": + {} # TODO schema + + "surface:sprite-selected": + {} # TODO schema + + "thang-began-talking": + {} # TODO schema + + "thang-finished-talking": + {} # TODO schema + + "surface:world-set-up": + {} # TODO schema + + "surface:frame-changed": + {} # TODO schema + + "surface:playback-ended": + {} # TODO schema + + "surface:playback-restarted": + {} # TODO schema + + "level-set-playing": + {} # TODO schema + + "registrar-echo-states": + {} # TODO schema + + "surface:mouse-moved": + {} # TODO schema + + "surface:stage-mouse-down": + {} # TODO schema + + "surface:mouse-scrolled": + {} # TODO schema + + "surface:ticked": + {} # TODO schema + + "surface:mouse-over": + {} # TODO schema + + "surface:mouse-out": + {} # TODO schema + + "self-wizard:target-changed": + {} # TODO schema + + "echo-all-wizard-sprites": + {} # TODO schema diff --git a/app/schemas/subscriptions/tome.coffee b/app/schemas/subscriptions/tome.coffee new file mode 100644 index 000000000..7c6a5a11f --- /dev/null +++ b/app/schemas/subscriptions/tome.coffee @@ -0,0 +1,73 @@ +module.exports = + "tome:cast-spell": + {} # TODO schema + + # TODO do we really need both 'cast-spell' and 'cast-spells'? + "tome:cast-spells": + {} # TODO schema + + "tome:manual-cast": + {} # TODO schema + + "tome:spell-created": + {} # TODO schema + + "tome:spell-debug-property-hovered": + {} # TODO schema + + "tome:toggle-spell-list": + {} # TODO schema + + "tome:reload-code": + {} # TODO schema + + "tome:palette-hovered": + {} # TODO schema + + "tome:palette-pin-toggled": + {} # TODO schema + + "tome:palette-clicked": + {} # TODO schema + + "tome:spell-statement-index-updated": + {} # TODO schema + + # TODO proposition: refactor 'tome' into spell events + "spell-beautify": + {} # TODO schema + + "spell-step-forward": + {} # TODO schema + + "spell-step-backward": + {} # TODO schema + + "tome:spell-loaded": + {} # TODO schema + + "tome:cast-spell": + {} # TODO schema + + "tome:spell-changed": + {} # TODO schema + + "tome:editing-ended": + {} # TODO schema + + "tome:editing-began": + {} # TODO schema + + "tome:problems-updated": + {} # TODO schema + + "tome:thang-list-entry-popover-shown": + {} # TODO schema + + "tome:spell-shown": + {} # TODO schema + + # TODO proposition: add tome to name + "focus-editor": + {} # TODO schema + diff --git a/app/schemas/subscriptions/user.coffee b/app/schemas/subscriptions/user.coffee new file mode 100644 index 000000000..44e713777 --- /dev/null +++ b/app/schemas/subscriptions/user.coffee @@ -0,0 +1,9 @@ +module.exports = + "me:synced": + {} # TODO schema + + "user-fetched": + {} # TODO schema + + "edit-wizard-settings": + {} # TODO schema diff --git a/app/schemas/subscriptions/world.coffee b/app/schemas/subscriptions/world.coffee new file mode 100644 index 000000000..d5e953de4 --- /dev/null +++ b/app/schemas/subscriptions/world.coffee @@ -0,0 +1,15 @@ +module.exports = + "god:user-code-problem": + {} # TODO schema + + "god:infinite-loop": + {} # TODO schema + + "god:user-code-problem": + {} # TODO schema + + "god:new-world-created": + {} # TODO schema + + "god:world-load-progress-changed": + {} # TODO schema \ No newline at end of file diff --git a/app/styles/base.sass b/app/styles/base.sass index 72ff4fe2f..0425ba2d6 100644 --- a/app/styles/base.sass +++ b/app/styles/base.sass @@ -111,6 +111,9 @@ a[data-toggle="modal"] @include box-shadow(0 0 0 #000) //position: absolute width: 99% + + .background-wrapper.plain + background: white .modal-content @include box-shadow(none) @@ -212,7 +215,7 @@ table.table .header-font font-family: $headings-font-family -body[lang='ru'], body[lang|='zh'], body[lang='ja'], body[lang='pl'], body[lang='tr'], body[lang='cs'], body[lang='el'], body[lang='ro'], body[lang='vi'], body[lang='th'], body[lang='ko'], body[lang='sk'], body[lang='sl'], body[lang='bg'], body[lang='he'], body[lang='lt'], body[lang='sr'], body[lang='uk'], body[lang='hi'], body[lang='ur'], +body[lang='ru'], body[lang|='zh'], body[lang='pl'], body[lang='tr'], body[lang='cs'], body[lang='el'], body[lang='ro'], body[lang='vi'], body[lang='th'], body[lang='ko'], body[lang='sk'], body[lang='sl'], body[lang='bg'], body[lang='he'], body[lang='lt'], body[lang='sr'], body[lang='uk'], body[lang='hi'], body[lang='ur'], body[lang='hu'] h1, h2, h3, h4, h5, h6 font-family: 'Open Sans Condensed', Impact, "Arial Narrow", "Arial", sans-serif text-transform: uppercase @@ -222,6 +225,23 @@ body[lang='ru'], body[lang|='zh'], body[lang='ja'], body[lang='pl'], body[lang=' font-family: 'Open Sans Condensed', Impact, "Arial Narrow", "Arial", sans-serif !important text-transform: uppercase letter-spacing: -1px !important + +body[lang='ja'] + h1, h2, h3, h4, h5, h6 + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", 'Open Sans Condensed', sans-serif + text-transform: uppercase + letter-spacing: -1px !important + + .header-font + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", 'Open Sans Condensed', sans-serif + text-transform: uppercase + letter-spacing: -1px !important + + #top-nav + .navbar-nav + li + a.header-font + font-size: 16px @media only screen and (max-width: 800px) .main-content-area @@ -238,3 +258,10 @@ body[lang='ru'], body[lang|='zh'], body[lang='ja'], body[lang='pl'], body[lang=' margin-bottom: 20px .partner-badges display: none + +// point the new glyphicons to the fonts in public + +@font-face + font-family: 'Glyphicons Halflings' + src: url("/fonts/glyphicons-halflings-regular.eot") + src: url("/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("/fonts/glyphicons-halflings-regular.woff") format("woff"), url("/fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("/fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular") format("svg") diff --git a/app/styles/common/top_nav.sass b/app/styles/common/top_nav.sass index 9a41771fe..f5c61685e 100644 --- a/app/styles/common/top_nav.sass +++ b/app/styles/common/top_nav.sass @@ -11,7 +11,7 @@ letter-spacing: 1px .navbuttontext-user-name - max-width: 125px + max-width: 110px overflow: hidden text-overflow: ellipsis white-space: nowrap diff --git a/app/styles/editor/delta.sass b/app/styles/editor/delta.sass new file mode 100644 index 000000000..013478efb --- /dev/null +++ b/app/styles/editor/delta.sass @@ -0,0 +1,43 @@ +.delta-view + .panel-heading + font-size: 13px + padding: 4px + .row + padding: 5px 10px + + .delta-added + border-color: green + > .panel-heading + background-color: lighten(green, 70%) + strong + color: green + + .delta-modified + border-color: darkgoldenrod + > .panel-heading + background-color: lighten(darkgoldenrod, 40%) + strong + color: darkgoldenrod + + .delta-text-diff + border-color: blue + > .panel-heading + background-color: lighten(blue, 45%) + strong + color: blue + table + width: 100% + + .delta-deleted + border-color: red + > .panel-heading + background-color: lighten(red, 42%) + strong + color: red + + .delta-moved-index + border-color: darkslategray + > .panel-heading + background-color: lighten(darkslategray, 60%) + strong + color: darkslategray diff --git a/app/styles/editor/patch.sass b/app/styles/editor/patch.sass new file mode 100644 index 000000000..3296d946c --- /dev/null +++ b/app/styles/editor/patch.sass @@ -0,0 +1,3 @@ +#patch-modal + .modal-body + padding: 10px \ No newline at end of file diff --git a/app/styles/editor/patches.sass b/app/styles/editor/patches.sass new file mode 100644 index 000000000..87c22728e --- /dev/null +++ b/app/styles/editor/patches.sass @@ -0,0 +1,3 @@ +.patches-view + .status-buttons + margin: 10px 0 diff --git a/app/styles/employers.sass b/app/styles/employers.sass index 2d61d81fa..6e64b44a0 100644 --- a/app/styles/employers.sass +++ b/app/styles/employers.sass @@ -7,6 +7,10 @@ cursor: pointer &:hover color: black + + &:first-child + // Make sure that "Developer #56" doesn't wrap onto second row + min-width: 110px .tablesorter-headerAsc background-color: #cfc @@ -16,3 +20,10 @@ tr cursor: pointer + + code + background-color: rgb(220, 220, 220) + color: #555 + margin: 2px 0 + display: inline-block + text-transform: lowercase diff --git a/app/styles/modal/login.sass b/app/styles/modal/login.sass index e89a92118..7d85ad900 100644 --- a/app/styles/modal/login.sass +++ b/app/styles/modal/login.sass @@ -10,3 +10,16 @@ a[data-toggle="coco-modal"] cursor: pointer + +#signup-modal + .modal-footer + padding-top: 0 + div + text-align: center + .social-login-text + padding-top: 20px + .network-logins + width: 263px + margin: 0 auto + div:last-of-type + margin-right: 0px diff --git a/app/styles/modal/save_version.sass b/app/styles/modal/save_version.sass index 9af4225dc..66de28a29 100644 --- a/app/styles/modal/save_version.sass +++ b/app/styles/modal/save_version.sass @@ -1,4 +1,12 @@ #save-version-modal + .modal-body + padding: 10px 50px 30px 20px + + .modal-footer + text-align: left + .buttons + text-align: right + #cla-link cursor: pointer text-decoration: underline @@ -25,3 +33,23 @@ font-size: 0.9em font-style: italic + .delta-view + overflow-y: auto + padding: 10px + border: 1px solid black + background: lighten(#add8e6, 17%) + margin-bottom: 10px + ul + padding-left: 20px + + form + width: 100% + + .commit-message + display: block + width: 100% + + .checkbox + margin: 10px 10px 0 + input + margin-right: 5px \ No newline at end of file diff --git a/app/styles/play/level.sass b/app/styles/play/level.sass index d051e9f43..756e56af7 100644 --- a/app/styles/play/level.sass +++ b/app/styles/play/level.sass @@ -1,6 +1,9 @@ @import "app/styles/bootstrap/mixins" @import "app/styles/mixins" +body.is-playing + background-color: black + #level-view margin: 0 auto @include user-select(none) diff --git a/app/styles/play/level/loading.sass b/app/styles/play/level/loading.sass index 9570497f3..3dac90ec8 100644 --- a/app/styles/play/level/loading.sass +++ b/app/styles/play/level/loading.sass @@ -1,16 +1,9 @@ @import "app/styles/bootstrap/mixins" @import "app/styles/mixins" -@mixin sky-background($url: '', $backgroundPosition: left) - $top: #95D9EF - $mid: #FFFFFF - $bot: #8EC643 - $stop: 99.6% - background: $mid - background-image: url($url) // fallback - background-image: url($url), -webkit-linear-gradient(top, $top, $mid $stop, $bot) - background-image: url($url), -ms-linear-gradient(top, $top, $mid $stop, $bot) - background-image: url($url), linear-gradient(to bottom, $top, $mid $stop, $bot) +@mixin wing-background($url: '', $backgroundPosition: left) + background: black + background-image: url($url) background-repeat: no-repeat background-position: top $backgroundPosition background-size: contain @@ -69,11 +62,11 @@ position: absolute .left-wing - @include sky-background('/images/level/loading_left_wing.png', right) + @include wing-background('/images/level/loading_left_wing.png', right) left: -50% transition: all $UNVEIL_TIME ease .right-wing - @include sky-background('/images/level/loading_right_wing.png', left) + @include wing-background('/images/level/loading_right_wing.png', left) right: -50% transition: all $UNVEIL_TIME ease diff --git a/app/templates/account/job_profile.jade b/app/templates/account/job_profile.jade index a5eff46d3..491ea8b9c 100644 --- a/app/templates/account/job_profile.jade +++ b/app/templates/account/job_profile.jade @@ -1,8 +1,8 @@ h3(data-i18n="account_settings.job_profile") Job Profile if me.get('jobProfileApproved') - p.lead(data-i18n="account_settings.job_profile_approved") Your job profile has been approved by CodeCombat. Hungry employers will see it until you mark it inactive or it is stale for two months. + p.lead(data-i18n="account_settings.job_profile_approved") Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks. else - p.lead(data-i18n="account_settings.job_profile_explanation") Hi! Fill this out, and if we think we can find you a software developer job, we will get in touch to approve your profile. + p.lead(data-i18n="account_settings.job_profile_explanation") Hi! Fill this out, and we will get in touch about finding you a software developer job. #job-profile-treema \ No newline at end of file diff --git a/app/templates/account/profile.jade b/app/templates/account/profile.jade index 5ef74256e..6fee4c8af 100644 --- a/app/templates/account/profile.jade +++ b/app/templates/account/profile.jade @@ -36,10 +36,16 @@ block content div= profile.city + ', ' + profile.country div= profile.visa - div Looking for: #{profile.lookingFor} - div Last updated #{moment(profile.updated).fromNow()} + div + span(data-i18n="account_profile.looking_for") Looking for: + | #{profile.lookingFor} + div + span(data-i18n="account_profile.last_updated") Last updated: + | #{moment(profile.updated).fromNow()} - button#contact-candidate.btn.btn-large.btn-inverse.flat-button Contact #{profile.name.split(' ')[0]} + button#contact-candidate.btn.btn-large.btn-inverse.flat-button + span(data-i18n="account_profile.contact") Contact + | #{profile.name.split(' ')[0]} .middle-column.full-height-column h3= profile.name @@ -53,7 +59,7 @@ block content if profile.work.length h3.experience-header img.header-icon(src="/images/pages/account/profile/work.png", alt="") - | Work Experience + span(data-i18n="account_profile.work_experience") Work Experience each job in profile.work div.duration.pull-right= job.duration | #{job.role} at #{job.employer} @@ -62,14 +68,14 @@ block content if profile.education.length h3.experience-header img.header-icon(src="/images/pages/account/profile/education.png", alt="") - | Education + span(data-i18n="account_profile.work_experience") Education each school in profile.education div.duration.pull-right= school.duration | #{school.degree} at #{school.school} .clearfix if user.get('jobProfileNotes') || me.isAdmin() - h3.experience-header Our Notes + h3.experience-header(data-i18n="account_profile.our_notes") Our Notes - var notes = user.get('jobProfileNotes') || ''; if me.isAdmin() textarea#job-profile-notes!= notes @@ -78,7 +84,7 @@ block content .right-column.full-height-column if profile.projects.length - h3 Projects + h3(data-i18n="account_profile.projects") Projects ul.projects each project in profile.projects li @@ -97,4 +103,4 @@ block content img.profile-photo(src=user.getPhotoURL(256)) h2 TODO - p Public user profiles are not ready yet. \ No newline at end of file + p Public user profiles are not ready yet. If you are seeing this, we probably have a bug leading to a broken link. \ No newline at end of file diff --git a/app/templates/account/wizard_settings.jade b/app/templates/account/wizard_settings.jade index 95684394c..f0c95410e 100644 --- a/app/templates/account/wizard_settings.jade +++ b/app/templates/account/wizard_settings.jade @@ -1,9 +1,9 @@ #color-settings table.table.table-bordered tr - th - th Color - th Group + th(data-i18n="wizard_settings.active") Active + th(data-i18n="wizard_settings.color") Color + th(data-i18n="wizard_settings.group") Group for group in colorGroups tr.color-group(data-name=group.name) td.enabled-cell diff --git a/app/templates/base.jade b/app/templates/base.jade index f31bc2db3..96d184876 100644 --- a/app/templates/base.jade +++ b/app/templates/base.jade @@ -51,12 +51,6 @@ body a.header-font(href='http://blog.codecombat.com/', data-i18n="nav.blog") Blog li.forum a.header-font(href='http://discourse.codecombat.com/', data-i18n="nav.forum") Forum - if me.isAdmin() - li.admin - a.header-font(href='/admin', data-i18n="nav.admin") Admin - - - block outer_content @@ -79,6 +73,8 @@ body a(href='/legal', title='Legal', tabindex=-1, data-i18n="nav.legal") Legal a(href='/about', title='About', tabindex=-1, data-i18n="nav.about") About a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact + if me.isAdmin() + a(href='/admin', data-i18n="nav.admin") Admin .share-buttons .g-plusone(data-href="http://codecombat.com", data-size="medium") diff --git a/app/templates/editor/article/edit.jade b/app/templates/editor/article/edit.jade index 4969e30e9..d61460e60 100644 --- a/app/templates/editor/article/edit.jade +++ b/app/templates/editor/article/edit.jade @@ -10,10 +10,10 @@ block content li.active | #{article.attributes.name} - button(data-i18n="general.history").btn.btn-primary#history-button History + button(data-i18n="general.version_history").btn.btn-primary#history-button Version History button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary#revert-button Revert button(data-i18n="article.edit_btn_preview", disabled=authorized === true ? undefined : "true").btn.btn-primary#preview-button Preview - button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary#save-button Save + button(data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary#save-button Save h3(data-i18n="article.edit_article_title") Edit Article span diff --git a/app/templates/editor/delta.jade b/app/templates/editor/delta.jade new file mode 100644 index 000000000..480e4ef01 --- /dev/null +++ b/app/templates/editor/delta.jade @@ -0,0 +1,46 @@ +- var i = 0 + +mixin deltaPanel(delta, conflict) + - delta.index = i++ + .delta.panel.panel-default(class='delta-'+delta.action, data-index=i) + .panel-heading + if delta.action === 'added' + strong(data-i18n="delta.added") Added + if delta.action === 'modified' + strong(data-i18n="delta.modified") Modified + if delta.action === 'deleted' + strong(data-i18n="delta.deleted") Deleted + if delta.action === 'moved-index' + strong(data-i18n="delta.modified_array") Moved Index + if delta.action === 'text-diff' + strong(data-i18n="delta.text_diff") Text Diff + span + a(data-toggle="collapse" data-parent="#delta-accordion"+(counter) href="#collapse-"+(i+counter)) + span= delta.humanPath + + .panel-collapse.collapse(id="collapse-"+(i+counter)) + .panel-body.row(class=conflict ? "conflict-details" : "details") + if delta.action === 'added' + .new-value.col-md-12= delta.right + if delta.action === 'modified' + .old-value.col-md-6= delta.left + .new-value.col-md-6= delta.right + if delta.action === 'deleted' + .col-md-12 + div.old-value= delta.left + if delta.action === 'text-diff' + .col-md-12 + div.text-diff + if delta.action === 'moved-index' + .col-md-12 + span Moved array value #{JSON.stringify(delta.left)} to index #{delta.destinationIndex} + + if delta.conflict && !conflict + .panel-body + strong MERGE CONFLICT WITH + +deltaPanel(delta.conflict, true) + +.panel-group(id='delta-accordion-'+(counter)) + for delta in deltas + +deltaPanel(delta) + \ No newline at end of file diff --git a/app/templates/editor/level/component/edit.jade b/app/templates/editor/level/component/edit.jade index 44d368080..23c24cf6c 100644 --- a/app/templates/editor/level/component/edit.jade +++ b/app/templates/editor/level/component/edit.jade @@ -15,7 +15,7 @@ nav.navbar.navbar-default(role='navigation') li a(href="#component-settings" data-toggle="tab" data-i18n="editor.level_component_settings") Settings ul.nav.navbar-nav.navbar-left - li(data-i18n="general.history").btn.btn-primary.navbar-btn#history-button History + li(data-i18n="general.version_history").btn.btn-primary.navbar-btn#history-button Version History ul.nav.navbar-nav.navbar-right li(data-i18n="editor.level_component_btn_new").btn.btn-primary.navbar-btn#create-new-component-button Create New Component diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index f90485b49..ba69b27fd 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -7,7 +7,7 @@ block outer_content .container-fluid ul.nav.navbar-nav li - a(href="/editor/level") Back + a(href="/editor/level", data-i18n="editor.back") Back .navbar-header span.navbar-brand span(data-i18n="editor.level_title") Level Editor @@ -26,29 +26,34 @@ block outer_content a(href="#editor-level-components-tab-view", data-toggle="tab", data-i18n="editor.level_tab_components") Components li a(href="#editor-level-systems-tab-view", data-toggle="tab", data-i18n="editor.level_tab_systems") Systems - - + li + a(href="#editor-level-patches", data-toggle="tab", data-i18n="resources.patches")#patches-tab Patches + + ul.nav.navbar-nav.navbar-right li(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary.navbar-btn#revert-button Revert - li(data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary.navbar-btn#commit-level-start-button Save + if authorized + li(data-i18n="common.save").btn.btn-primary.navbar-btn#commit-level-start-button Save + else + li(data-i18n="common.patch").btn.btn-primary.navbar-btn#commit-level-patch-button Patch li(data-i18n="common.fork", disabled=anonymous ? "true": undefined).btn.btn-primary.navbar-btn#fork-level-start-button Fork li(title="⌃↩ or ⌘↩: Play preview of current level", data-i18n="common.play")#play-button.btn.btn-inverse.banner.navbar-btn Play! li.divider li.dropdown - a.dropdown-toggle(href='#', data-toggle='dropdown') + a.dropdown-toggle(href='#', data-toggle='dropdown', data-i18n="editor.more") | More b.caret ul.dropdown-menu li#history-button a(href='#', data-i18n="general.version_history") Version History li - a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home') Wiki + a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home', data-i18n="editor.wiki") Wiki li - a(href='http://www.hipchat.com/g3plnOKqa') Live Chat + a(href='http://www.hipchat.com/g3plnOKqa', data-i18n="editor.live_chat") Live Chat li - a(href='http://discourse.codecombat.com/category/artisan') Forum + a(href='http://discourse.codecombat.com/category/artisan', data-i18n="nav.forum") Forum li a(data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Email @@ -74,6 +79,9 @@ block outer_content div.tab-pane#editor-level-components-tab-view div.tab-pane#editor-level-systems-tab-view + + div.tab-pane#editor-level-patches + .patches-view div#error-view diff --git a/app/templates/editor/level/fork.jade b/app/templates/editor/level/fork.jade index 255fc8d80..6c4f43553 100644 --- a/app/templates/editor/level/fork.jade +++ b/app/templates/editor/level/fork.jade @@ -6,12 +6,12 @@ block modal-header-content block modal-body-content form#save-level-form.form .form-group - label(for="level-name") Name + label(for="level-name", data-i18n="general.name") Name input#level-name(name="name", type="text").form-control block modal-footer-content - button.btn(data-dismiss="modal") Cancel - button.btn.btn-primary#fork-level-confirm-button Save + button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel + button.btn.btn-primary#fork-level-confirm-button(data-i18n="common.save") Save block modal-body-wait-content - h3 Creating Fork... + h3(data-i18n="editor.fork_creating") Creating Fork... diff --git a/app/templates/editor/level/save.jade b/app/templates/editor/level/save.jade index 8ada52b23..eccef370a 100644 --- a/app/templates/editor/level/save.jade +++ b/app/templates/editor/level/save.jade @@ -3,19 +3,20 @@ extends /templates/modal/save_version block modal-body-content h3= "Level: " + level.get('name') + " - " + (levelNeedsSave ? "Modified" : "Not Modified") if levelNeedsSave - form#save-level-form.form - .form-group - label.control-label(for="level-commit-message") Commit Message - textarea.form-control#level-commit-message(name="commit-message", type="text") + .changes-stub + form#save-level-form.form-inline + .form-group.commit-message + input.form-control#level-commit-message(name="commit-message", type="text") if level.isPublished() - .form-group.checkbox - label.control-label(for="level-version-is-major") Major Changes? - input#level-version-is-major(name="version-is-major", type="checkbox") - span.help-block (Could this update break old solutions of the level?) + .checkbox + label + input#level-version-is-major(name="version-is-major", type="checkbox") + span(data-i18n="versions.new_major_version") New Major Version if !level.isPublished() - .form-group.checkbox - label.control-label(for="level-publish") Publish This Level (irreversible)? - input#level-publish(name="publish", type="checkbox") + .checkbox + label + input#level-publish(name="publish", type="checkbox") + span(data-i18n="common.publish") Publish if modifiedComponents.length hr @@ -23,17 +24,17 @@ block modal-body-content each component in modifiedComponents - var id = component.get('_id') h4= "Component: " + component.get('system') + '.' + component.get('name') - form.component-form(id="save-component-" + id + "-form") + .changes-stub + form.form-inline.component-form(id="save-component-" + id + "-form") input(name="component-original", type="hidden", value=component.get('original')) input(name="component-parent-major-version", type="hidden", value=component.get('version').major) - .form-group - label.control-label(for=id + "-commit-message") Commit Message - textarea.form-control(id=id + "-commit-message", name="commit-message", type="text") + .form-group.commit-message + input.form-control(id=id + "-commit-message", name="commit-message", type="text") if component.isPublished() - .form-group.checkbox - label.control-label(for=id + "-version-is-major") Major Changes? - input(id=id + "-version-is-major", name="version-is-major", type="checkbox") - span.help-block (Could this update break anything depending on this Component?) + .checkbox + label + input(id=id + "-version-is-major", name="version-is-major", type="checkbox") + span(data-i18n="versions.new_major_version") New Major Version if modifiedSystems.length hr @@ -41,14 +42,14 @@ block modal-body-content each system in modifiedSystems - var id = system.get('_id') h4= "System: " + system.get('name') - form.system-form(id="save-system-" + id + "-form") + .changes-stub + form.form-inline.system-form(id="save-system-" + id + "-form") input(name="system-original", type="hidden", value=system.get('original')) input(name="system-parent-major-version", type="hidden", value=system.get('version').major) - .form-group - label.control-label(for=id + "-commit-message") Commit Message - textarea.form-control(id=id + "-commit-message", name="commit-message", type="text") + .form-group.commit-message + input.form-control(id=id + "-commit-message", name="commit-message", type="text", placeholder="Commit Message") if system.isPublished() - .form-group.checkbox - label.control-label(for=id + "-version-is-major") Major Changes? - input(id=id + "-version-is-major", name="version-is-major", type="checkbox") - span.help-block (Could this update break anything depending on this System?) + .checkbox + label + input(id=id + "-version-is-major", name="version-is-major", type="checkbox") + span(data-i18n="versions.new_major_version") New Major Version diff --git a/app/templates/editor/level/thangs_tab.jade b/app/templates/editor/level/thangs_tab.jade index b0b86868c..c41c727b8 100644 --- a/app/templates/editor/level/thangs_tab.jade +++ b/app/templates/editor/level/thangs_tab.jade @@ -1,7 +1,7 @@ .thangs-container.thangs-column h3(data-i18n="editor.level_tab_thangs_title") Current Thangs .btn-group(data-toggle="buttons-radio")#extant-thangs-filter - button.btn.btn-primary All + button.btn.btn-primary(data-i18n="editor.level_tab_thangs_all") All button.btn.btn-primary(value="Unit", title="Unit") i.icon-user button.btn.btn-primary(value="Wall", title="Wall") @@ -19,9 +19,9 @@ #canvas-wrapper ul.dropdown-menu#contextmenu li#delete - a Delete + a(data-i18n="editor.delete") Delete li#duplicate - a Duplicate + a(data-i18n="editor.duplicate") Duplicate canvas(width=1848, height=1178)#surface #canvas-left-gradient.gradient #canvas-top-gradient.gradient diff --git a/app/templates/editor/patch_modal.jade b/app/templates/editor/patch_modal.jade new file mode 100644 index 000000000..68fed43f7 --- /dev/null +++ b/app/templates/editor/patch_modal.jade @@ -0,0 +1,23 @@ +extends /templates/modal/modal_base + +block modal-header-content + .modal-header-content + h3 Patch + +block modal-body-content + .modal-body + .changes-stub + + +block modal-footer + .modal-footer + button(data-dismiss="modal", data-i18n="common.cancel").btn Cancel + if isPatchCreator + if status != 'withdrawn' + button.btn.btn-danger#withdraw-button Withdraw + if isPatchRecipient + if status != 'accepted' + button.btn.btn-primary#accept-button Accept + if status != 'rejected' + button.btn.btn-danger#reject-button Reject + \ No newline at end of file diff --git a/app/templates/editor/patches.jade b/app/templates/editor/patches.jade new file mode 100644 index 000000000..872788e7d --- /dev/null +++ b/app/templates/editor/patches.jade @@ -0,0 +1,30 @@ +.btn-group(data-toggle="buttons").status-buttons + label.btn.btn-default.pending + input(type="radio", name="status", value="pending") + | Pending + label.btn.btn-default.accepted + input(type="radio", name="status", value="accepted") + | Accepted + label.btn.btn-default.rejected + input(type="radio", name="status", value="rejected") + | Rejected + label.btn.btn-default.withdrawn + input(type="radio", name="status", value="withdrawn") + | Withdrawn + +if patches.loading + p Loading +else + table.table.table-condensed.table-bordered + tr + th Submitter + th Submitted + th Commit Message + th Review + for patch in patches + tr + td= patch.userName + td= moment(patch.get('created')).format('llll') + td= patch.get('commitMessage') + td + span.glyphicon.glyphicon-wrench(data-patch-id=patch.id).patch-icon diff --git a/app/templates/editor/thang/edit.jade b/app/templates/editor/thang/edit.jade index 1e8ce462d..b1924f439 100644 --- a/app/templates/editor/thang/edit.jade +++ b/app/templates/editor/thang/edit.jade @@ -12,8 +12,8 @@ block content img#portrait.img-thumbnail - button.btn.btn-secondary#history-button(data-i18n="general.history") History - button.btn.btn-primary#save-button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save", disabled=authorized === true ? undefined : "true") Save + button.btn.btn-secondary#history-button(data-i18n="general.version_history") Version History + button.btn.btn-primary#save-button(data-i18n="common.save", disabled=authorized === true ? undefined : "true") Save button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true") Revert h3 Edit Thang Type: "#{thangType.attributes.name}" @@ -27,11 +27,13 @@ block content a(href="#editor-thang-spritesheets-view", data-toggle="tab") Spritesheets li a(href="#editor-thang-colors-tab-view", data-toggle="tab")#color-tab Colors + li + a(href="#editor-thang-patches-view", data-toggle="tab")#patches-tab Patches div.tab-content div.tab-pane#editor-thang-colors-tab-view - div.tab-pane.active#editor-thang-main-tab-view + div.tab-pane#editor-thang-main-tab-view.active div.main-area.well div.file-controls @@ -83,6 +85,10 @@ block content div.tab-pane#editor-thang-spritesheets-view div#spritesheets + + div.tab-pane#editor-thang-patches-view + + div.patches-view div#error-view diff --git a/app/templates/employers.jade b/app/templates/employers.jade index d242a7d77..efeb59429 100644 --- a/app/templates/employers.jade +++ b/app/templates/employers.jade @@ -2,48 +2,30 @@ extends /templates/base block content - .row + h1(data-i18n="employers.want_to_hire_our_players") Want to hire expert CodeCombat players? - .col-md-6 - - h2 CodeCombat for Employers - - p.lead Want to hire expert CodeCombat players? - - p - | CodeCombat doesn't just have beginners. We also have expert software developers who play our - a(href="http://blog.codecombat.com/beat-this-level-get-a-programming-job") developer challenge levels - | . If your company is seeking technical talent, then we'd be happy to help place candidates with you. - - p We were actually overwhelmed by how many talented developers rushed to site, crushed our version of the algorithm in the Gridmancer challenge, and were looking for job opportunities, especially in the SF Bay Area where CodeCombat is located. So if you're an employer, now's a great time to get in touch and meet some amazing programmers. - - p If this sounds interesting, then let's get in touch, find out what you're looking for, talk about recruitment terms, and see what we can do for you. Don't worry–we are not your traditional recruiter. We're a tech company like you who happens to have a ton of great programmers looking to us for help with the job search. - - h3 - a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact") Contact Us + p + span(data-i18n="employers.candidates_count_prefix") We currently have + if candidates.length + | #{candidates.length} + else + span(data-i18n="employers.candidates_count_many") many + | + span(data-i18n="employers.candidates_count_suffix") highly skilled and vetted developers looking for work. + h3 + a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/employer_signup", data-i18n="employers.contact_george") Contact George to see our candidates - .span5 - - h2 Candidate Statistics - - h4 Resumes: 46 - h4 Ages: 16 - 45 - h4 Experience: 0 - 30 years - h4 Skill: from interns and entry level to senior developers and management - h4 Technologies: just about everything - h4 Countries: USA, Canada, Australia, and many more - if candidates.length table.table.table-condensed.table-hover.table-responsive.tablesorter thead tr - th Name - th Location - th Looking For - th Top 5 Skills - th Yrs Exp - th Last Updated - th Current Job + th(data-i18n="general.name") Name + th(data-i18n="employers.candidate_location") Location + th(data-i18n="employers.candidate_looking_for") Looking For + th(data-i18n="employers.candidate_role") Role + th(data-i18n="employers.candidate_top_skills") Top Skills + th(data-i18n="employers.candidate_years_experience") Yrs Exp + th(data-i18n="employers.candidate_last_updated") Last Updated if me.isAdmin() th ✓? @@ -64,20 +46,13 @@ block content else td= profile.country td= profile.lookingFor + td= profile.jobTitle td - each skill in profile.skills.slice(0, 5) + each skill in profile.skills.slice(0, 10) code= skill span td= profile.experience td= moment(profile.updated).fromNow() - if authorized - if profile.work.length - td= profile.work[0].role + ' at ' + profile.work[0].employer - else - td - else - td - em Employer sign-up required. if me.isAdmin() if candidate.get('jobProfileApproved') td ✓ diff --git a/app/templates/home.jade b/app/templates/home.jade index 376ea27fb..dfd523f0c 100644 --- a/app/templates/home.jade +++ b/app/templates/home.jade @@ -4,11 +4,20 @@ block content h1#site-slogan(data-i18n="home.slogan") Learn to Code JavaScript by Playing a Game - #trailer-wrapper - <iframe width="920" height="518" src="//www.youtube.com/embed/1zjaA13k-dA?rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720&wmode=transparent" frameborder="0" wmode="opaque" allowfullscreen></iframe> - img(src="/images/pages/home/video_border.png") - #mobile-trailer-wrapper - <iframe src="//www.youtube.com/embed/1zjaA13k-dA" frameborder="0" width="280" height="158"></iframe> + //- if language is Chinese, we use youku, because China can't visit youtube. + //- otherwise, we use youtube. + if languageName == "zh-HANS" + #trailer-wrapper + <embed src="http://player.youku.com/player.php/sid/XNjk2Mzg5NjYw/v.swf" style="margin-left:15px; margin-top:8px;"allowFullScreen="true" quality="high" width="920" height="518" wmode="opaque"></embed> + img(src="/images/pages/home/video_border.png") + #mobile-trailer-wrapper + <embed src="http://player.youku.com/player.php/sid/XNjk2Mzg5NjYw/v.swf" style="margin-left:15px; margin-top:8px;"allowFullScreen="true" quality="high" width="280" height="158" wmode="opaque"></embed> + else + #trailer-wrapper + <iframe width="920" height="518" src="//www.youtube.com/embed/1zjaA13k-dA?rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720&wmode=transparent" frameborder="0" wmode="opaque" allowfullscreen></iframe> + img(src="/images/pages/home/video_border.png") + #mobile-trailer-wrapper + <iframe src="//www.youtube.com/embed/1zjaA13k-dA" frameborder="0" width="280" height="158"></iframe> hr .alert.alert-danger.lt-ie10 diff --git a/app/templates/kinds/search.jade b/app/templates/kinds/search.jade index b7babdc95..77dce78db 100644 --- a/app/templates/kinds/search.jade +++ b/app/templates/kinds/search.jade @@ -9,9 +9,9 @@ block content | #{currentEditor} if me.get('anonymous') - a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/signup", role="button") Sign Up to Create a New #{modelLabel} + a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/signup", role="button", data-i18n="editor.signup_to_create") Sign Up to Create a New Content else - a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal" data-i18n="#{currentNew}") Create a New Something + a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal", data-i18n="#{currentNew}") Create a New Something input#search(data-i18n="[placeholder]#{currentSearch}") hr div.results @@ -20,18 +20,19 @@ block content // TODO: make this into a ModalView subview div.modal.fade#new-model-modal .modal-dialog - .modal-content - .modal-header - h3 Create New #{modelLabel} - .modal-body - form.form - .form-group - label.control-label(for="name") Name - input#name.form-control(name="name", type="text") - .modal-footer - button.btn(data-dismiss="modal") Cancel - button.btn.btn-primary.new-model-submit Create - .modal-body.wait.secret - h3 Reticulating Splines... - .progress.progress-striped.active - .progress-bar + .background-wrapper + .modal-content + .modal-header + h3(data-i18n="#{currentNew}") Create New #{modelLabel} + .modal-body + form.form + .form-group + label.control-label(for="name", data-i18n="general.name") Name + input#name.form-control(name="name", type="text") + .modal-footer + button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel + button.btn.btn-primary.new-model-submit(data-i18n="common.create") Create + .modal-body.wait.secret + h3(data-i18n="play_level.tip_reticulating") Reticulating Splines... + .progress.progress-striped.active + .progress-bar diff --git a/app/templates/modal/job_profile_contact.jade b/app/templates/modal/job_profile_contact.jade index 87120f033..33a02d34d 100644 --- a/app/templates/modal/job_profile_contact.jade +++ b/app/templates/modal/job_profile_contact.jade @@ -4,7 +4,7 @@ block modal-header-content h3(data-i18n="contact.contact_candidate") Contact Candidate block modal-body-content - p(data-i18n="contact.recruitment_reminder") Use this form to get in touch with candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary for any full-time candidate you hire who stays 90 days, but that part-timers, remote employees, contractors, and interns are free. + p(data-i18n="contact.recruitment_reminder") Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns. .form .form-group label.control-label(for="contact-email", data-i18n="general.email") Email diff --git a/app/templates/modal/revert.jade b/app/templates/modal/revert.jade index f20edd7d2..28b111337 100644 --- a/app/templates/modal/revert.jade +++ b/app/templates/modal/revert.jade @@ -10,4 +10,4 @@ block modal-body-content td | #{model.type()}: #{model.get('name')} td - button(value=model.id) Revert \ No newline at end of file + button(value=model.id, data-i18n="editor.revert") Revert diff --git a/app/templates/modal/save_version.jade b/app/templates/modal/save_version.jade index d1f8fc219..748c541a9 100644 --- a/app/templates/modal/save_version.jade +++ b/app/templates/modal/save_version.jade @@ -1,30 +1,46 @@ extends /templates/modal/modal_base block modal-header-content - h3(data-i18n="versions.save_version_title") Save New Version + if isPatch + h3(data-i18n="versions.submit_patch_title") Submit Patch + else + h3(data-i18n="versions.save_version_title") Save New Version block modal-body-content - form.form - .form-group - label.control-label(for="commitMessage", data-i18n="general.commit_msg") Commit Message - textarea#commit-message.input-large.form-control(name="commitMessage", type="text") - .form-group - label.control-label(for="level-version-is-major", data-i18n="versions.new_major_version") New Major Version - input#major-version.input-large.form-control(name="version-is-major", type="checkbox") - span.help-block + if hasChanges + .changes-stub + form.form-inline + .form-group.commit-message + input.form-control#commit-message(name="commitMessage", type="text") + if !isPatch + .checkbox + label + input#major-version(name="version-is-major", type="checkbox") + span(data-i18n="versions.new_major_version") New Major Version + else + .alert.alert-danger No changes block modal-body-wait-content - h3(data-i18n="common.saving") Saving... + if hasChanges + if isPatch + h3(data-i18n="versions.submitting_patch") Submitting Patch... + else + h3(data-i18n="common.saving") Saving... block modal-footer-content - if !noSaveButton + if hasChanges #accept-cla-wrapper.alert.alert-info span(data-i18n="versions.cla_prefix") To save changes, first you must agree to our | strong#cla-link(data-i18n="versions.cla_url") CLA span(data-i18n="versions.cla_suffix") . - button.btn#agreement-button(data-i18n="versions.cla_agree") I AGREE + button.btn.btn-sm#agreement-button(data-i18n="versions.cla_agree") I AGREE + if isPatch + .alert.alert-info An owner will need to approve it before your changes will become visible. - button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel - if !noSaveButton - button.btn.btn-primary#save-version-button(data-i18n="common.save") Save + .buttons + button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel + if hasChanges && !isPatch + button.btn.btn-primary#save-version-button(data-i18n="common.save") Save + if hasChanges && isPatch + button.btn.btn-primary#submit-patch-button(data-i18n="versions.submit_patch") Submit Patch \ No newline at end of file diff --git a/app/templates/modal/signup.jade b/app/templates/modal/signup.jade index c603d019b..db46c7e03 100644 --- a/app/templates/modal/signup.jade +++ b/app/templates/modal/signup.jade @@ -30,5 +30,14 @@ block modal-body-content block modal-body-wait-content h3(data-i18n="signup.creating") Creating Account... -block modal-footer-content - button.btn.btn-primary.btn-large#signup-button(data-i18n="signup.sign_up") Sign Up +block modal-footer + .modal-footer + div + button.btn.btn-primary.btn-large#signup-button(data-i18n="signup.sign_up") Sign Up + div.social-login-text(data-i18n="signup.social_signup") Or, you can sign up through Facebook or G+: + + .modal-footer.network-logins + div + .fb-login-button(data-show-faces="false", data-width="200", data-max-rows="1", data-scope="email") + div + .gplus-login-button#gplus-login-button diff --git a/app/views/account/job_profile_view.coffee b/app/views/account/job_profile_view.coffee index a39fb6b16..940d52ffe 100644 --- a/app/views/account/job_profile_view.coffee +++ b/app/views/account/job_profile_view.coffee @@ -14,12 +14,6 @@ module.exports = class JobProfileView extends CocoView 'updated' ] - constructor: (options) -> - super options - unless me.schema().loaded - @addSomethingToLoad("user_schema") - @listenToOnce me, 'schema-loaded', => @somethingLoaded 'user_schema' - afterRender: -> super() return if @loading() @@ -29,7 +23,8 @@ module.exports = class JobProfileView extends CocoView visibleSettings = @editableSettings.concat @readOnlySettings data = _.pick (me.get('jobProfile') ? {}), (value, key) => key in visibleSettings data.name ?= (me.get('firstName') + ' ' + me.get('lastName')).trim() if me.get('firstName') - schema = _.cloneDeep me.schema().get('properties').jobProfile + console.log 'schema?', me.schema() + schema = _.cloneDeep me.schema().properties.jobProfile schema.properties = _.pick schema.properties, (value, key) => key in visibleSettings schema.required = _.intersection schema.required, visibleSettings for prop in @readOnlySettings diff --git a/app/views/account/settings_view.coffee b/app/views/account/settings_view.coffee index be4a79c59..0665a7c9c 100644 --- a/app/views/account/settings_view.coffee +++ b/app/views/account/settings_view.coffee @@ -43,11 +43,7 @@ module.exports = class SettingsView extends View @jobProfileView = new JobProfileView() @listenTo @jobProfileView, 'change', @save @insertSubView @jobProfileView - - if me.schema().loaded - @buildPictureTreema() - else - @listenToOnce me, 'schema-loaded', @buildPictureTreema + @buildPictureTreema() chooseTab: (category) -> id = "##{category}-pane" @@ -81,13 +77,10 @@ module.exports = class SettingsView extends View buildPictureTreema: -> data = photoURL: me.get('photoURL') - if data.photoURL?.search('gravatar') isnt -1 - # Old style - data.photoURL = null - schema = _.cloneDeep me.schema().attributes - schema.properties = _.pick me.schema().get('properties'), 'photoURL' + data.photoURL = null if data.photoURL?.search('gravatar') isnt -1 # Old style + schema = _.cloneDeep me.schema() + schema.properties = _.pick me.schema().properties, 'photoURL' schema.required = ['photoURL'] - console.log 'schema is', schema treemaOptions = filePath: "db/user/#{me.id}" schema: schema diff --git a/app/views/admin/base_view.coffee b/app/views/admin/base_view.coffee index 7fe8c09c1..5db653086 100644 --- a/app/views/admin/base_view.coffee +++ b/app/views/admin/base_view.coffee @@ -1,6 +1,6 @@ -View = require 'views/kinds/RootView' +RootView = require 'views/kinds/RootView' template = require 'templates/base' -module.exports = class BaseView extends View +module.exports = class BaseView extends RootView id: "base-view" template: template diff --git a/app/views/admin/users_view.coffee b/app/views/admin/users_view.coffee index c19c7bd37..acc9a8152 100644 --- a/app/views/admin/users_view.coffee +++ b/app/views/admin/users_view.coffee @@ -38,8 +38,7 @@ module.exports = class UsersView extends View @users.fetch() @listenTo(@users, 'all', @render) - getRenderData: => + getRenderData: -> c = super() c.users = (user.attributes for user in @users.models) - console.log('our render data', c) c \ No newline at end of file diff --git a/app/views/editor/article/edit.coffee b/app/views/editor/article/edit.coffee index 875dc6113..0123546e0 100644 --- a/app/views/editor/article/edit.coffee +++ b/app/views/editor/article/edit.coffee @@ -3,6 +3,7 @@ VersionHistoryView = require './versions_view' ErrorView = require '../../error_view' template = require 'templates/editor/article/edit' Article = require 'models/Article' +SaveVersionModal = require 'views/modal/save_version_modal' module.exports = class ArticleEditView extends View id: "editor-article-edit-view" @@ -12,6 +13,7 @@ module.exports = class ArticleEditView extends View events: 'click #preview-button': 'openPreview' 'click #history-button': 'showVersionHistory' + 'click #save-button': 'openSaveModal' subscriptions: 'save-new-version': 'saveNewArticle' @@ -33,17 +35,11 @@ module.exports = class ArticleEditView extends View ) @article.fetch() - @article.loadSchema() - @listenToOnce(@article, 'sync', @onArticleSync) - @listenToOnce(@article, 'schema-loaded', @buildTreema) + @listenToOnce(@article, 'sync', @buildTreema) @pushChangesToPreview = _.throttle(@pushChangesToPreview, 500) - onArticleSync: -> - @article.loaded = true - @buildTreema() - buildTreema: -> - return if @treema? or (not @article.loaded) or (not Article.hasSchema()) + return if @treema? or (not @article.loaded) unless @article.attributes.body @article.set('body', '') @startsLoading = false @@ -52,7 +48,7 @@ module.exports = class ArticleEditView extends View options = data: data filePath: "db/thang.type/#{@article.get('original')}" - schema: Article.schema.attributes + schema: Article.schema readOnly: true unless me.isAdmin() or @article.hasWriteAccess(me) callbacks: change: @pushChangesToPreview @@ -78,13 +74,16 @@ module.exports = class ArticleEditView extends View afterRender: -> super() return if @startsLoading - @showReadOnly() unless me.isAdmin() or @article.hasWriteAccess(me) + @showReadOnly() if me.get('anonymous') - openPreview: => + openPreview: -> @preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600') @preview.focus() if window.focus @preview.onload = => @pushChangesToPreview() return false + + openSaveModal: -> + @openModalView(new SaveVersionModal({model: @article})) saveNewArticle: (e) -> @treema.endExistingEdits() diff --git a/app/views/editor/components/main.coffee b/app/views/editor/components/main.coffee index 7b813595b..0104aa5d9 100644 --- a/app/views/editor/components/main.coffee +++ b/app/views/editor/components/main.coffee @@ -20,9 +20,6 @@ module.exports = class ThangComponentEditView extends CocoView render: => return if @destroyed - for model in [Level, LevelComponent] - temp = new model() - @listenToOnce temp, 'schema-loaded', @render unless model.schema?.loaded if not @componentCollection @componentCollection = @supermodel.getCollection new ComponentsCollection() unless @componentCollection.loaded @@ -32,7 +29,7 @@ module.exports = class ThangComponentEditView extends CocoView afterRender: -> super() - return @showLoading() unless @componentCollection?.loaded and Level.schema.loaded and LevelComponent.schema.loaded + return @showLoading() unless @componentCollection?.loaded @hideLoading() @buildExtantComponentTreema() @buildAddComponentTreema() @@ -45,7 +42,7 @@ module.exports = class ThangComponentEditView extends CocoView buildExtantComponentTreema: -> treemaOptions = supermodel: @supermodel - schema: Level.schema.get('properties').thangs.items.properties.components + schema: Level.schema.properties.thangs.items.properties.components data: _.cloneDeep @components callbacks: {select: @onSelectExtantComponent, change:@onChangeExtantComponents} noSortable: true @@ -69,7 +66,7 @@ module.exports = class ThangComponentEditView extends CocoView treemaOptions = supermodel: @supermodel - schema: { type: 'array', items: LevelComponent.schema.attributes } + schema: { type: 'array', items: LevelComponent.schema } data: ($.extend(true, {}, c) for c in components) callbacks: {select: @onSelectAddableComponent, enter: @onAddComponentEnterPressed } readOnly: true diff --git a/app/views/editor/delta.coffee b/app/views/editor/delta.coffee new file mode 100644 index 000000000..09c0981a6 --- /dev/null +++ b/app/views/editor/delta.coffee @@ -0,0 +1,70 @@ +CocoView = require 'views/kinds/CocoView' +template = require 'templates/editor/delta' +deltasLib = require 'lib/deltas' + +TEXTDIFF_OPTIONS = + baseTextName: "Old" + newTextName: "New" + contextSize: 5 + viewType: 1 + +module.exports = class DeltaView extends CocoView + @deltaCounter: 0 + className: "delta-view" + template: template + + constructor: (options) -> + super(options) + @model = options.model + @headModel = options.headModel + @expandedDeltas = @model.getExpandedDelta() + if @headModel + @headDeltas = @headModel.getExpandedDelta() + @conflicts = deltasLib.getConflicts(@headDeltas, @expandedDeltas) + DeltaView.deltaCounter += @expandedDeltas.length + + getRenderData: -> + c = super() + c.deltas = @expandedDeltas + c.counter = DeltaView.deltaCounter + c + + afterRender: -> + deltas = @$el.find('.details') + for delta, i in deltas + deltaEl = $(delta) + deltaData = @expandedDeltas[i] + @expandDetails(deltaEl, deltaData) + + conflictDeltas = @$el.find('.conflict-details') + conflicts = (delta.conflict for delta in @expandedDeltas when delta.conflict) + for delta, i in conflictDeltas + deltaEl = $(delta) + deltaData = conflicts[i] + @expandDetails(deltaEl, deltaData) + + expandDetails: (deltaEl, deltaData) -> + treemaOptions = { schema: deltaData.schema, readOnly: true } + + if _.isObject(deltaData.left) and leftEl = deltaEl.find('.old-value') + options = _.defaults {data: deltaData.left}, treemaOptions + TreemaNode.make(leftEl, options).build() + + if _.isObject(deltaData.right) and rightEl = deltaEl.find('.new-value') + options = _.defaults {data: deltaData.right}, treemaOptions + TreemaNode.make(rightEl, options).build() + + if deltaData.action is 'text-diff' + left = difflib.stringAsLines deltaData.left + right = difflib.stringAsLines deltaData.right + sm = new difflib.SequenceMatcher(left, right) + opcodes = sm.get_opcodes() + el = deltaEl.find('.text-diff') + options = {baseTextLines: left, newTextLines: right, opcodes: opcodes} + args = _.defaults options, TEXTDIFF_OPTIONS + el.append(diffview.buildView(args)) + + getApplicableDelta: -> + delta = @model.getDelta() + delta = deltasLib.pruneConflictsFromDelta delta, @conflicts if @conflicts + delta \ No newline at end of file diff --git a/app/views/editor/level/component/edit.coffee b/app/views/editor/level/component/edit.coffee index 7571e9a80..3f91f1467 100644 --- a/app/views/editor/level/component/edit.coffee +++ b/app/views/editor/level/component/edit.coffee @@ -31,7 +31,7 @@ module.exports = class LevelComponentEditView extends View buildSettingsTreema: -> data = _.pick @levelComponent.attributes, (value, key) => key in @editableSettings - schema = _.cloneDeep LevelComponent.schema.attributes + schema = _.cloneDeep LevelComponent.schema schema.properties = _.pick schema.properties, (value, key) => key in @editableSettings schema.required = _.intersection schema.required, @editableSettings @@ -55,7 +55,7 @@ module.exports = class LevelComponentEditView extends View buildConfigSchemaTreema: -> treemaOptions = supermodel: @supermodel - schema: LevelComponent.schema.get('properties').configSchema + schema: LevelComponent.schema.properties.configSchema data: @levelComponent.get 'configSchema' callbacks: {change: @onConfigSchemaEdited} treemaOptions.readOnly = true unless me.isAdmin() @@ -63,7 +63,7 @@ module.exports = class LevelComponentEditView extends View @configSchemaTreema.build() @configSchemaTreema.open() # TODO: schema is not loaded for the first one here? - @configSchemaTreema.tv4.addSchema('metaschema', LevelComponent.schema.get('properties').configSchema) + @configSchemaTreema.tv4.addSchema('metaschema', LevelComponent.schema.properties.configSchema) onConfigSchemaEdited: => @levelComponent.set 'configSchema', @configSchemaTreema.data diff --git a/app/views/editor/level/edit.coffee b/app/views/editor/level/edit.coffee index df7e2502d..a08cfde80 100644 --- a/app/views/editor/level/edit.coffee +++ b/app/views/editor/level/edit.coffee @@ -12,6 +12,8 @@ ComponentsTabView = require './components_tab_view' SystemsTabView = require './systems_tab_view' LevelSaveView = require './save_view' LevelForkView = require './fork_view' +SaveVersionModal = require 'views/modal/save_version_modal' +PatchesView = require 'views/editor/patches_view' VersionHistoryView = require './versions_view' ErrorView = require '../../error_view' @@ -26,6 +28,8 @@ module.exports = class EditorLevelView extends View 'click #commit-level-start-button': 'startCommittingLevel' 'click #fork-level-start-button': 'startForkingLevel' 'click #history-button': 'showVersionHistory' + 'click #patches-tab': -> @patchesView.load() + 'click #commit-level-patch-button': 'startPatchingLevel' constructor: (options, @levelID) -> super options @@ -88,7 +92,8 @@ module.exports = class EditorLevelView extends View @componentsTab = @insertSubView new ComponentsTabView supermodel: @supermodel @systemsTab = @insertSubView new SystemsTabView supermodel: @supermodel Backbone.Mediator.publish 'level-loaded', level: @level - @showReadOnly() unless me.isAdmin() or @level.hasWriteAccess(me) + @showReadOnly() if me.get('anonymous') + @patchesView = @insertSubView(new PatchesView(@level), @$el.find('.patches-view')) onPlayLevel: (e) -> sendLevel = => @@ -103,9 +108,12 @@ module.exports = class EditorLevelView extends View @childWindow.onPlayLevelViewLoaded = (e) => sendLevel() # still a hack @childWindow.focus() + startPatchingLevel: (e) -> + @openModalView new SaveVersionModal({model:@level}) + Backbone.Mediator.publish 'level:view-switched', e + startCommittingLevel: (e) -> - levelSaveView = new LevelSaveView level: @level, supermodel: @supermodel - @openModalView levelSaveView + @openModalView new LevelSaveView level: @level, supermodel: @supermodel Backbone.Mediator.publish 'level:view-switched', e startForkingLevel: (e) -> diff --git a/app/views/editor/level/save_view.coffee b/app/views/editor/level/save_view.coffee index e3e5ad25c..33d94370b 100644 --- a/app/views/editor/level/save_view.coffee +++ b/app/views/editor/level/save_view.coffee @@ -3,11 +3,13 @@ template = require 'templates/editor/level/save' forms = require 'lib/forms' LevelComponent = require 'models/LevelComponent' LevelSystem = require 'models/LevelSystem' +DeltaView = require 'views/editor/delta' module.exports = class LevelSaveView extends SaveVersionModal template: template instant: false modalWidthPercent: 60 + plain: true events: 'click #save-version-button': 'commitLevel' @@ -23,8 +25,20 @@ module.exports = class LevelSaveView extends SaveVersionModal context.levelNeedsSave = @level.hasLocalChanges() context.modifiedComponents = _.filter @supermodel.getModels(LevelComponent), @shouldSaveEntity context.modifiedSystems = _.filter @supermodel.getModels(LevelSystem), @shouldSaveEntity - context.noSaveButton = not (context.levelNeedsSave or context.modifiedComponents.length or context.modifiedSystems.length) + context.hasChanges = (context.levelNeedsSave or context.modifiedComponents.length or context.modifiedSystems.length) + @lastContext = context context + + afterRender: -> + super() + changeEls = @$el.find('.changes-stub') + models = if @lastContext.levelNeedsSave then [@level] else [] + models = models.concat @lastContext.modifiedComponents + models = models.concat @lastContext.modifiedSystems + for changeEl, i in changeEls + model = models[i] + deltaView = new DeltaView({model:model}) + @insertSubView(deltaView, $(changeEl)) shouldSaveEntity: (m) -> return true if m.hasLocalChanges() diff --git a/app/views/editor/level/scripts_tab_view.coffee b/app/views/editor/level/scripts_tab_view.coffee index 8e06b8a58..03855662d 100644 --- a/app/views/editor/level/scripts_tab_view.coffee +++ b/app/views/editor/level/scripts_tab_view.coffee @@ -3,7 +3,6 @@ template = require 'templates/editor/level/scripts_tab' Level = require 'models/Level' Surface = require 'lib/surface/Surface' nodes = require './treema_nodes' -defaultScripts = require 'lib/scripts/defaultScripts' module.exports = class ScriptsTabView extends View id: "editor-level-scripts-tab-view" @@ -22,9 +21,8 @@ module.exports = class ScriptsTabView extends View @level = e.level @dimensions = @level.dimensions() scripts = $.extend(true, [], @level.get('scripts') ? []) - scripts = _.cloneDeep defaultScripts unless scripts.length treemaOptions = - schema: Level.schema.get('properties').scripts + schema: Level.schema.properties.scripts data: scripts callbacks: change: @onScriptsChanged @@ -54,7 +52,7 @@ module.exports = class ScriptsTabView extends View filePath: "db/level/#{@level.get('original')}" files: @files view: @ - schema: Level.schema.get('properties').scripts.items + schema: Level.schema.properties.scripts.items data: selected.data thangIDs: thangIDs dimensions: @dimensions diff --git a/app/views/editor/level/settings_tab_view.coffee b/app/views/editor/level/settings_tab_view.coffee index 7556c4a4f..6f6822885 100644 --- a/app/views/editor/level/settings_tab_view.coffee +++ b/app/views/editor/level/settings_tab_view.coffee @@ -25,7 +25,7 @@ module.exports = class SettingsTabView extends View onLevelLoaded: (e) -> @level = e.level data = _.pick @level.attributes, (value, key) => key in @editableSettings - schema = _.cloneDeep Level.schema.attributes + schema = _.cloneDeep Level.schema schema.properties = _.pick schema.properties, (value, key) => key in @editableSettings schema.required = _.intersection schema.required, @editableSettings thangIDs = @getThangIDs() diff --git a/app/views/editor/level/system/edit.coffee b/app/views/editor/level/system/edit.coffee index c92894cdd..338ede1e5 100644 --- a/app/views/editor/level/system/edit.coffee +++ b/app/views/editor/level/system/edit.coffee @@ -29,7 +29,7 @@ module.exports = class LevelSystemEditView extends View buildSettingsTreema: -> data = _.pick @levelSystem.attributes, (value, key) => key in @editableSettings - schema = _.cloneDeep LevelSystem.schema.attributes + schema = _.cloneDeep LevelSystem.schema schema.properties = _.pick schema.properties, (value, key) => key in @editableSettings schema.required = _.intersection schema.required, @editableSettings @@ -53,7 +53,7 @@ module.exports = class LevelSystemEditView extends View buildConfigSchemaTreema: -> treemaOptions = supermodel: @supermodel - schema: LevelSystem.schema.get('properties').configSchema + schema: LevelSystem.schema.properties.configSchema data: @levelSystem.get 'configSchema' callbacks: {change: @onConfigSchemaEdited} treemaOptions.readOnly = true unless me.isAdmin() @@ -61,7 +61,7 @@ module.exports = class LevelSystemEditView extends View @configSchemaTreema.build() @configSchemaTreema.open() # TODO: schema is not loaded for the first one here? - @configSchemaTreema.tv4.addSchema('metaschema', LevelSystem.schema.get('properties').configSchema) + @configSchemaTreema.tv4.addSchema('metaschema', LevelSystem.schema.properties.configSchema) onConfigSchemaEdited: => @levelSystem.set 'configSchema', @configSchemaTreema.data diff --git a/app/views/editor/level/systems_tab_view.coffee b/app/views/editor/level/systems_tab_view.coffee index 52d92b969..eb4747b0e 100644 --- a/app/views/editor/level/systems_tab_view.coffee +++ b/app/views/editor/level/systems_tab_view.coffee @@ -67,7 +67,7 @@ module.exports = class SystemsTabView extends View treemaOptions = # TODO: somehow get rid of the + button, or repurpose it to open the LevelSystemAddView instead supermodel: @supermodel - schema: Level.schema.get('properties').systems + schema: Level.schema.properties.systems data: systems readOnly: true unless me.isAdmin() or @level.hasWriteAccess(me) callbacks: @@ -159,11 +159,12 @@ class LevelSystemNode extends TreemaObjectNode name = "#{@system.get('name')} v#{@system.get('version').major}" @buildValueForDisplaySimply valEl, "#{name}" - onEnterPressed: -> + onEnterPressed: (e) -> + super e Backbone.Mediator.publish 'edit-level-system', original: @data.original, majorVersion: @data.majorVersion - open: -> - super() + open: (depth) -> + super depth cTreema = @childrenTreemas.config if cTreema? and (cTreema.getChildren().length or cTreema.canAddChild()) cTreema.open() diff --git a/app/views/editor/level/thangs_tab_view.coffee b/app/views/editor/level/thangs_tab_view.coffee index ecab0cd98..2a8536f9f 100644 --- a/app/views/editor/level/thangs_tab_view.coffee +++ b/app/views/editor/level/thangs_tab_view.coffee @@ -141,7 +141,7 @@ module.exports = class ThangsTabView extends View return if @startsLoading data = $.extend(true, {}, @level.attributes) treemaOptions = - schema: Level.schema.get('properties').thangs + schema: Level.schema.properties.thangs data: data.thangs supermodel: @supermodel callbacks: diff --git a/app/views/editor/patch_modal.coffee b/app/views/editor/patch_modal.coffee new file mode 100644 index 000000000..19f3ebfe6 --- /dev/null +++ b/app/views/editor/patch_modal.coffee @@ -0,0 +1,60 @@ +ModalView = require 'views/kinds/ModalView' +template = require 'templates/editor/patch_modal' +DeltaView = require 'views/editor/delta' +auth = require 'lib/auth' + +module.exports = class PatchModal extends ModalView + id: "patch-modal" + template: template + plain: true + + events: + 'click #withdraw-button': 'withdrawPatch' + 'click #reject-button': 'rejectPatch' + 'click #accept-button': 'acceptPatch' + + constructor: (@patch, @targetModel, options) -> + super(options) + targetID = @patch.get('target').id + if false + @originalSource = targetModel.clone(false) + @onOriginalLoaded() + else + @originalSource = new targetModel.constructor({_id:targetID}) + @originalSource.fetch() + @listenToOnce @originalSource, 'sync', @onOriginalLoaded + @addResourceToLoad(@originalSource) + + getRenderData: -> + c = super() + c.isPatchCreator = @patch.get('creator') is auth.me.id + c.isPatchRecipient = @targetModel.hasWriteAccess() + c.status = @patch.get 'status' + c + + afterRender: -> + return if @originalSource.loading + headModel = @originalSource.clone(false) + headModel.set(@targetModel.attributes) + + pendingModel = @originalSource.clone(false) + pendingModel.applyDelta(@patch.get('delta')) + + @deltaView = new DeltaView({model:pendingModel, headModel:headModel}) + changeEl = @$el.find('.changes-stub') + @insertSubView(@deltaView, changeEl) + super() + + acceptPatch: -> + delta = @deltaView.getApplicableDelta() + @targetModel.applyDelta(delta) + @targetModel.addPatchToAcceptOnSave(@patch) + @hide() + + rejectPatch: -> + @patch.setStatus('rejected') + @hide() + + withdrawPatch: -> + @patch.setStatus('withdrawn') + @hide() \ No newline at end of file diff --git a/app/views/editor/patches_view.coffee b/app/views/editor/patches_view.coffee new file mode 100644 index 000000000..f8dd4fa15 --- /dev/null +++ b/app/views/editor/patches_view.coffee @@ -0,0 +1,56 @@ +CocoView = require 'views/kinds/CocoView' +template = require 'templates/editor/patches' +PatchesCollection = require 'collections/PatchesCollection' +nameLoader = require 'lib/NameLoader' +PatchModal = require './patch_modal' + +module.exports = class PatchesView extends CocoView + template: template + className: 'patches-view' + status: 'pending' + + events: + 'change .status-buttons': 'onStatusButtonsChanged' + 'click .patch-icon': 'openPatchModal' + + constructor: (@model, options) -> + super(options) + @initPatches() + + initPatches: -> + @startedLoading = false + @patches = new PatchesCollection([], {}, @model, @status) + @listenToOnce @patches, 'sync', @gotPatches + @addResourceToLoad @patches, 'patches' + + gotPatches: -> + ids = (p.get('creator') for p in @patches.models) + jqxhr = nameLoader.loadNames ids + if jqxhr then @addRequestToLoad(jqxhr, 'user_names', 'gotPatches') else @render() + + load: -> + return if @startedLoading + @patches.fetch() + @startedLoading = true + + getRenderData: -> + c = super() + patch.userName = nameLoader.getName(patch.get('creator')) for patch in @patches.models + c.patches = @patches.models + c.status + c + + afterRender: -> + @$el.find(".#{@status}").addClass 'active' + + onStatusButtonsChanged: (e) -> + @loaded = false + @status = $(e.target).val() + @initPatches() + @load() + @render() + + openPatchModal: (e) -> + patch = _.find @patches.models, {id:$(e.target).data('patch-id')} + modal = new PatchModal(patch, @model) + @openModalView(modal) \ No newline at end of file diff --git a/app/views/editor/thang/colors_tab_view.coffee b/app/views/editor/thang/colors_tab_view.coffee index a858f4385..87c887522 100644 --- a/app/views/editor/thang/colors_tab_view.coffee +++ b/app/views/editor/thang/colors_tab_view.coffee @@ -12,7 +12,7 @@ module.exports = class ColorsTabView extends CocoView constructor: (@thangType, options) -> @listenToOnce(@thangType, 'sync', @tryToBuild) - @listenToOnce(@thangType.schema(), 'sync', @tryToBuild) + # @listenToOnce(@thangType.schema(), 'sync', @tryToBuild) @colorConfig = { hue: 0, saturation: 0.5, lightness: 0.5 } @spriteBuilder = new SpriteBuilder(@thangType) f = => @@ -115,7 +115,7 @@ module.exports = class ColorsTabView extends CocoView return unless @thangType.loaded and @thangType.schema().loaded data = @thangType.get('colorGroups') data ?= {} - schema = @thangType.schema().attributes.properties?.colorGroups + schema = @thangType.schema().properties?.colorGroups treemaOptions = data: data schema: schema diff --git a/app/views/editor/thang/edit.coffee b/app/views/editor/thang/edit.coffee index cfd85aa43..21fee69d3 100644 --- a/app/views/editor/thang/edit.coffee +++ b/app/views/editor/thang/edit.coffee @@ -9,6 +9,8 @@ View = require 'views/kinds/RootView' ThangComponentEditView = require 'views/editor/components/main' VersionHistoryView = require './versions_view' ColorsTabView = require './colors_tab_view' +PatchesView = require 'views/editor/patches_view' +SaveVersionModal = require 'views/modal/save_version_modal' ErrorView = require '../../error_view' template = require 'templates/editor/thang/edit' @@ -33,6 +35,8 @@ module.exports = class ThangTypeEditView extends View 'click #marker-button': 'toggleDots' 'click #end-button': 'endAnimation' 'click #history-button': 'showVersionHistory' + 'click #save-button': 'openSaveModal' + 'click #patches-tab': -> @patchesView.load() subscriptions: 'save-new-version': 'saveNewThangType' @@ -67,7 +71,7 @@ module.exports = class ThangTypeEditView extends View @refreshAnimation = _.debounce @refreshAnimation, 500 onThangTypeSync: -> - return unless @thangType.loaded and ThangType.hasSchema() + return unless @thangType.loaded @startsLoading = false @files = new DocumentFiles(@thangType) @supermodel.addModelResource(@files, 'thang_document').load() @@ -94,7 +98,8 @@ module.exports = class ThangTypeEditView extends View @initSliders() @initComponents() @insertSubView(new ColorsTabView(@thangType)) - @showReadOnly() unless me.isAdmin() or @thangType.hasWriteAccess(me) + @patchesView = @insertSubView(new PatchesView(@thangType), @$el.find('.patches-view')) + @showReadOnly() if me.get('anonymous') initComponents: => options = @@ -343,7 +348,7 @@ module.exports = class ThangTypeEditView extends View buildTreema: -> data = @getThangData() - schema = _.cloneDeep ThangType.schema.attributes + schema = _.cloneDeep ThangType.schema schema.properties = _.pick schema.properties, (value, key) => not (key in ['components']) options = data: data @@ -400,11 +405,14 @@ module.exports = class ThangTypeEditView extends View @showAnimation() @showingSelectedNode = false - destroy: -> - @camera?.destroy() - super() - showVersionHistory: (e) -> versionHistoryView = new VersionHistoryView thangType:@thangType, @thangTypeID @openModalView versionHistoryView Backbone.Mediator.publish 'level:view-switched', e + + openSaveModal: -> + @openModalView(new SaveVersionModal({model: @thangType})) + + destroy: -> + @camera?.destroy() + super() diff --git a/app/views/employers_view.coffee b/app/views/employers_view.coffee index a43bbf70a..cdbf8f074 100644 --- a/app/views/employers_view.coffee +++ b/app/views/employers_view.coffee @@ -3,8 +3,7 @@ template = require 'templates/employers' app = require 'application' User = require 'models/User' CocoCollection = require 'models/CocoCollection' -employerSignupTemplate = require 'templates/modal/employer_signup_modal' -ModalView = require 'views/kinds/ModalView' +EmployerSignupView = require 'views/modal/employer_signup_modal' class CandidatesCollection extends CocoCollection url: '/db/user/x/candidates' @@ -85,6 +84,4 @@ module.exports = class EmployersView extends View url = "/account/profile/#{id}" app.router.navigate url, {trigger: true} else - employerSignupModal = new ModalView() - employerSignupModal.template = employerSignupTemplate - @openModalView employerSignupModal + @openModalView new EmployerSignupView diff --git a/app/views/home_view.coffee b/app/views/home_view.coffee index 565e7e1a7..d3f5494a9 100644 --- a/app/views/home_view.coffee +++ b/app/views/home_view.coffee @@ -23,6 +23,7 @@ module.exports = class HomeView extends View else console.warn 'no more jquery browser version...' c.isEnglish = (me.get('preferredLanguage') or 'en').startsWith 'en' + c.languageName = me.get('preferredLanguage') c afterRender: -> diff --git a/app/views/kinds/CocoView.coffee b/app/views/kinds/CocoView.coffee index afdc84499..488d4939a 100644 --- a/app/views/kinds/CocoView.coffee +++ b/app/views/kinds/CocoView.coffee @@ -104,6 +104,7 @@ module.exports = class CocoView extends Backbone.View context.fbRef = context.pathname.replace(/[^a-zA-Z0-9+/=\-.:_]/g, '').slice(0, 40) or 'home' context.isMobile = @isMobile() context.isIE = @isIE() + context.moment = moment context afterRender: -> @@ -192,7 +193,7 @@ module.exports = class CocoView extends Backbone.View showReadOnly: -> return if me.isAdmin() - warning = $.i18n.t 'editor.read_only_warning', defaultValue: "Note: you can't save any edits here, because you're not logged in as an admin." + warning = $.i18n.t 'editor.read_only_warning2', defaultValue: "Note: you can't save any edits here, because you're not logged in." noty text: warning, layout: 'center', type: 'information', killer: true, timeout: 5000 # Loading ModalViews @@ -231,18 +232,23 @@ module.exports = class CocoView extends Backbone.View # Subviews - insertSubView: (view) -> - @subviews[view.id].destroy() if view.id of @subviews - @$el.find('#'+view.id).after(view.el).remove() + insertSubView: (view, elToReplace=null) -> + key = view.id or (view.constructor.name+classCount++) + key = _.string.underscored(key) + @subviews[key].destroy() if key of @subviews + elToReplace ?= @$el.find('#'+view.id) + elToReplace.after(view.el).remove() view.parent = @ view.render() view.afterInsert() - @subviews[view.id] = view + view.parentKey = key + @subviews[key] = view + view removeSubView: (view) -> view.$el.empty() + delete @subviews[view.parentKey] view.destroy() - delete @subviews[view.id] # Utilities @@ -274,6 +280,7 @@ module.exports = class CocoView extends Backbone.View slider - -mobileRELong = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i + mobileRELong = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i mobileREShort = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i + +module.exports = CocoView diff --git a/app/views/kinds/ModalView.coffee b/app/views/kinds/ModalView.coffee index 5222df067..2bf6ee8db 100644 --- a/app/views/kinds/ModalView.coffee +++ b/app/views/kinds/ModalView.coffee @@ -5,6 +5,7 @@ module.exports = class ModalView extends CocoView closeButton: true closesOnClickOutside: true modalWidthPercent: null + plain: false shortcuts: 'esc': 'hide' @@ -31,6 +32,7 @@ module.exports = class ModalView extends CocoView @$el.on 'hide.bs.modal', => @onHidden() unless @hidden @hidden = true + @$el.find('.background-wrapper').addClass('plain') if @plain afterInsert: -> super() diff --git a/app/views/kinds/RootView.coffee b/app/views/kinds/RootView.coffee index 0a26d6cf3..7ef3e7221 100644 --- a/app/views/kinds/RootView.coffee +++ b/app/views/kinds/RootView.coffee @@ -41,13 +41,14 @@ module.exports = class RootView extends CocoView hash = location.hash location.hash = '' location.hash = hash - @buildLanguages() @renderScrollbar() #@$('.antiscroll-wrap').antiscroll() # not yet, buggy afterRender: -> super(arguments...) @chooseTab(location.hash.replace('#','')) if location.hash + @buildLanguages() + $('body').removeClass('is-playing') chooseTab: (category) -> $("a[href='##{category}']", @$el).tab('show') @@ -57,7 +58,7 @@ module.exports = class RootView extends CocoView buildLanguages: -> $select = @$el.find(".language-dropdown").empty() if $select.hasClass("fancified") - $select.parent().find('.options,.trigger').remove() + $select.parent().find('.options, .trigger').remove() $select.unwrap().removeClass("fancified") preferred = me.lang() codes = _.keys(locale) @@ -75,10 +76,8 @@ module.exports = class RootView extends CocoView $.i18n.setLng(newLang, {}) @saveLanguage(newLang) @render() - @buildLanguages() unless newLang.split('-')[0] is "en" @openModalView(application.router.getView("modal/diplomat_suggestion", "_modal")) - $('body').attr('lang', newLang) saveLanguage: (newLang) -> me.set('preferredLanguage', newLang) diff --git a/app/views/kinds/SearchView.coffee b/app/views/kinds/SearchView.coffee index 5f93924c3..9ce303b7c 100644 --- a/app/views/kinds/SearchView.coffee +++ b/app/views/kinds/SearchView.coffee @@ -96,7 +96,7 @@ module.exports = class SearchView extends View name = @$el.find('#name').val() model = new @model() model.set('name', name) - if @model.schema.get('properties').permissions + if @model.schema.properties.permissions model.set 'permissions', [{access: 'owner', target: me.id}] res = model.save() return unless res diff --git a/app/views/modal/employer_signup_modal.coffee b/app/views/modal/employer_signup_modal.coffee new file mode 100644 index 000000000..de66c007d --- /dev/null +++ b/app/views/modal/employer_signup_modal.coffee @@ -0,0 +1,7 @@ +View = require 'views/kinds/ModalView' +template = require 'templates/modal/employer_signup_modal' + +module.exports = class EmployerSignupView extends View + id: "employer-signup" + template: template + closeButton: true diff --git a/app/views/modal/login_modal.coffee b/app/views/modal/login_modal.coffee index 8a433dd28..68306a03e 100644 --- a/app/views/modal/login_modal.coffee +++ b/app/views/modal/login_modal.coffee @@ -36,7 +36,7 @@ module.exports = class LoginModalView extends View loginAccount: (e) => forms.clearFormAlerts(@$el) userObject = forms.formToObject @$el - res = tv4.validateMultiple userObject, User.schema.attributes + res = tv4.validateMultiple userObject, User.schema return forms.applyErrorsToForm(@$el, res.errors) unless res.valid @enableModalInProgress(@$el) # TODO: part of forms loginUser(userObject) diff --git a/app/views/modal/revert_modal.coffee b/app/views/modal/revert_modal.coffee index 91358988c..68094c371 100644 --- a/app/views/modal/revert_modal.coffee +++ b/app/views/modal/revert_modal.coffee @@ -5,16 +5,16 @@ CocoModel = require 'models/CocoModel' module.exports = class RevertModal extends ModalView id: 'revert-modal' template: template - + events: 'click #changed-models button': 'onRevertModel' - + onRevertModel: (e) -> id = $(e.target).val() CocoModel.backedUp[id].revert() $(e.target).closest('tr').remove() @reloadOnClose = true - + getRenderData: -> c = super() models = _.values CocoModel.backedUp @@ -23,5 +23,4 @@ module.exports = class RevertModal extends ModalView c onHidden: -> - console.log 'reload?', @reloadOnClose location.reload() if @reloadOnClose diff --git a/app/views/modal/save_version_modal.coffee b/app/views/modal/save_version_modal.coffee index 86e1ea96b..8c49327f5 100644 --- a/app/views/modal/save_version_modal.coffee +++ b/app/views/modal/save_version_modal.coffee @@ -1,18 +1,39 @@ ModalView = require 'views/kinds/ModalView' template = require 'templates/modal/save_version' +DeltaView = require 'views/editor/delta' +Patch = require 'models/Patch' +forms = require 'lib/forms' module.exports = class SaveVersionModal extends ModalView id: 'save-version-modal' template: template + plain: true events: 'click #save-version-button': 'onClickSaveButton' 'click #cla-link': 'onClickCLALink' 'click #agreement-button': 'onAgreedToCLA' - + 'click #submit-patch-button': 'onClickPatchButton' + + constructor: (options) -> + super options + @model = options.model or options.level + new Patch() # hack to get the schema to load, delete this later + @isPatch = not @model.hasWriteAccess() + + getRenderData: -> + c = super() + c.isPatch = @isPatch + c.hasChanges = @model.hasLocalChanges() + c + afterRender: -> super() @$el.find(if me.get('signedCLA') then '#accept-cla-wrapper' else '#save-version-button').hide() + changeEl = @$el.find('.changes-stub') + deltaView = new DeltaView({model:@model}) + @insertSubView(deltaView, changeEl) + @$el.find('.commit-message input').attr('placeholder', $.i18n.t('general.commit_msg')) onClickSaveButton: -> Backbone.Mediator.publish 'save-new-version', { @@ -20,6 +41,27 @@ module.exports = class SaveVersionModal extends ModalView commitMessage: @$el.find('#commit-message').val() } + onClickPatchButton: -> + forms.clearFormAlerts @$el + patch = new Patch() + patch.set 'delta', @model.getDelta() + patch.set 'commitMessage', @$el.find('#commit-message').val() + patch.set 'target', { + 'collection': _.string.underscored @model.constructor.className + 'id': @model.id + } + errors = patch.validate() + forms.applyErrorsToForm(@$el, errors) if errors + res = patch.save() + return unless res + @enableModalInProgress(@$el) + + res.error => + @disableModalInProgress(@$el) + + res.success => + @hide() + onClickCLALink: -> window.open('/cla', 'cla', 'height=800,width=900') diff --git a/app/views/modal/signup_modal.coffee b/app/views/modal/signup_modal.coffee index 5ecbc07c5..63174261f 100644 --- a/app/views/modal/signup_modal.coffee +++ b/app/views/modal/signup_modal.coffee @@ -57,8 +57,12 @@ module.exports = class SignupModalView extends View userObject.emailSubscriptions.push 'notification' unless 'notification' in userObject.emailSubscriptions else userObject.emailSubscriptions = _.without (userObject.emailSubscriptions ? []), 'announcement', 'notification' - res = tv4.validateMultiple userObject, User.schema.attributes + res = tv4.validateMultiple userObject, User.schema return forms.applyErrorsToForm(@$el, res.errors) unless res.valid window.tracker?.trackEvent 'Finished Signup' @enableModalInProgress(@$el) createUser userObject, null, window.nextLevelURL + + afterInsert: -> + super() + application.router.renderLoginButtons() diff --git a/app/views/modal/wizard_settings_modal.coffee b/app/views/modal/wizard_settings_modal.coffee index 0223187bd..5715a4c1f 100644 --- a/app/views/modal/wizard_settings_modal.coffee +++ b/app/views/modal/wizard_settings_modal.coffee @@ -22,6 +22,7 @@ module.exports = class WizardSettingsModal extends View WizardSettingsView = require 'views/account/wizard_settings_view' view = new WizardSettingsView() @insertSubView view + super() checkNameExists: => forms.clearFormAlerts(@$el) @@ -31,7 +32,7 @@ module.exports = class WizardSettingsModal extends View forms.applyErrorsToForm(@$el, {property:'name', message:'is already taken'}) if id and id isnt me.id $.ajax("/db/user/#{name}/nameToID", {success: success}) - onWizardSettingsDone: => + onWizardSettingsDone: -> me.set('name', $('#wizard-settings-name').val()) forms.clearFormAlerts(@$el) res = me.validate() @@ -42,10 +43,11 @@ module.exports = class WizardSettingsModal extends View res = me.save() return unless res save = $('#save-button', @$el).text($.i18n.t('common.saving', defaultValue: 'Saving...')) - .addClass('btn-info').show().removeClass('btn-danger') + .addClass('btn-info').show().removeClass('btn-danger') res.error => errors = JSON.parse(res.responseText) + console.warn "Got errors saving user:", errors forms.applyErrorsToForm(@$el, errors) @disableModalInProgress(@$el) @@ -53,4 +55,3 @@ module.exports = class WizardSettingsModal extends View @hide() @enableModalInProgress(@$el) - me.save() diff --git a/app/views/play/level/playback_view.coffee b/app/views/play/level/playback_view.coffee index 4a3e4d359..191a00c22 100644 --- a/app/views/play/level/playback_view.coffee +++ b/app/views/play/level/playback_view.coffee @@ -107,6 +107,9 @@ module.exports = class PlaybackView extends View @hookUpScrubber() @updateMusicButton() $(window).on('resize', @onWindowResize) + ua = navigator.userAgent.toLowerCase() + if /safari/.test(ua) and not /chrome/.test(ua) + @$el.find('.toggle-fullscreen').hide() updatePopupContent: -> @timePopup.updateContent "<h2>#{@timeToString @newTime}</h2>#{@formatTime(@current, @currentTime)}<br/>#{@formatTime(@total, @totalTime)}" @@ -151,7 +154,7 @@ module.exports = class PlaybackView extends View @newTime = 0 @currentTime = 0 - @timePopup = new HoverPopup unless @timePopup? + @timePopup ?= new HoverPopup #TODO: Why do we need defaultValues here at all? Fallback language has been set to 'en'... oO @@ -192,7 +195,7 @@ module.exports = class PlaybackView extends View @$progressScrubber.slider('disable', true) catch e #console.warn('error disabling scrubber') - @timePopup.disable() + @timePopup?.disable() $('#volume-button', @$el).removeClass('disabled') onEnableControls: (e) -> @@ -203,7 +206,7 @@ module.exports = class PlaybackView extends View @$progressScrubber.slider('enable', true) catch e #console.warn('error enabling scrubber') - @timePopup.enable() + @timePopup?.enable() onSetPlaying: (e) -> @playing = (e ? {}).playing ? true @@ -242,21 +245,21 @@ module.exports = class PlaybackView extends View @lastProgress = e.progress onProgressEnter: (e) -> - #Why it needs itself as parameter you ask? Ask Twitter instead.. - @timePopup.enter @timePopup + # Why it needs itself as parameter you ask? Ask Twitter instead. + @timePopup?.enter @timePopup onProgressLeave: (e) -> - @timePopup.leave @timePopup + @timePopup?.leave @timePopup onProgressHover: (e) -> timeRatio = @$progressScrubber.width() / @totalTime @newTime = e.offsetX / timeRatio @updatePopupContent() - @timePopup.onHover e + @timePopup?.onHover e - #Show it instantaniously if close enough to current time. - if Math.abs(@currentTime - @newTime) < 1 and not @timePopup.shown - @timePopup.show() unless @timePopup.shown + # Show it instantaneously if close enough to current time. + if @timePopup and Math.abs(@currentTime - @newTime) < 1 and not @timePopup.shown + @timePopup.show() updateProgress: (progress) -> $('.scrubber .progress-bar', @$el).css('width', "#{progress*100}%") diff --git a/app/views/play/level_view.coffee b/app/views/play/level_view.coffee index a50231a86..cf9a26d88 100644 --- a/app/views/play/level_view.coffee +++ b/app/views/play/level_view.coffee @@ -127,6 +127,7 @@ module.exports = class PlayLevelView extends View @insertSubView @loadingView = new LoadingView {} @$el.find('#level-done-button').hide() super() + $('body').addClass('is-playing') onLevelLoaderProgressChanged: -> return if @seenDocs @@ -275,12 +276,10 @@ module.exports = class PlayLevelView extends View setTimeout(@preloadNextLevel, 3000) showVictory: -> - options = {level: @level, supermodel: @supermodel, session: @session} + options = {level: @level, supermodel: @supermodel, session:@session} docs = new VictoryModal(options) @openModalView(docs) window.tracker?.trackEvent 'Saw Victory', level: @world.name, label: @world.name - if me.get('anonymous') - window.nextLevelURL = @getNextLevelID() # Signup will go here on completion instead of reloading. onRestartLevel: -> @tome.reloadAllCode() @@ -297,10 +296,11 @@ module.exports = class PlayLevelView extends View window.tracker?.trackEvent 'Saw Initial Infinite Loop', level: @world.name, label: @world.name onPlayNextLevel: -> - nextLevelID = @getNextLevelID() - nextLevelURL = @getNextLevelURL() + nextLevel = @getNextLevel() + nextLevelID = nextLevel.get('slug') or nextLevel.id + url = "/play/level/#{nextLevelID}" Backbone.Mediator.publish 'router:navigate', { - route: nextLevelURL, + route: url, viewClass: PlayLevelView, viewArgs: [{supermodel:@supermodel}, nextLevelID]} @@ -309,12 +309,6 @@ module.exports = class PlayLevelView extends View levels = @supermodel.getModels(Level) return l for l in levels when l.get('original') is nextLevelOriginal - getNextLevelID: -> - nextLevel = @getNextLevel() - nextLevelID = nextLevel.get('slug') or nextLevel.id - - getNextLevelURL: -> "/play/level/#{@getNextLevelID()}" - onHighlightDom: (e) -> if e.delay delay = e.delay @@ -421,7 +415,7 @@ module.exports = class PlayLevelView extends View return if @alreadyLoadedState @alreadyLoadedState = true state = @originalSessionState - if state.frame + if state.frame and @level.get('type') isnt 'ladder' # https://github.com/codecombat/codecombat/issues/714 Backbone.Mediator.publish 'level-set-time', { time: 0, frameOffset: state.frame } if state.selected # TODO: Should also restore selected spell here by saving spellName @@ -479,6 +473,5 @@ module.exports = class PlayLevelView extends View clearInterval(@pointerInterval) @bus?.destroy() #@instance.save() unless @instance.loading - delete window.nextLevelURL console.profileEnd?() if PROFILE_ME super() diff --git a/app/views/play/spectate_view.coffee b/app/views/play/spectate_view.coffee index da6f5e611..7a3058212 100644 --- a/app/views/play/spectate_view.coffee +++ b/app/views/play/spectate_view.coffee @@ -119,6 +119,7 @@ module.exports = class SpectateLevelView extends View @insertSubView @loadingView = new LoadingView {} @$el.find('#level-done-button').hide() super() + $('body').addClass('is-playing') onLevelLoaderProgressChanged: -> return if @seenDocs diff --git a/app/views/play_view.coffee b/app/views/play_view.coffee index d505cb5e6..349f900c7 100644 --- a/app/views/play_view.coffee +++ b/app/views/play_view.coffee @@ -227,4 +227,3 @@ module.exports = class PlayView extends View super() @$el.find('.modal').on 'shown.bs.modal', -> $('input:visible:first', @).focus() - diff --git a/bower.json b/bower.json index b5462543e..2c7d15146 100644 --- a/bower.json +++ b/bower.json @@ -37,10 +37,12 @@ "firebase": "~1.0.2", "catiline": "~2.9.3", "d3": "~3.4.4", + "jsondiffpatch": "~0.1.5", "nanoscroller": "~0.8.0", "jquery.tablesorter": "~2.15.13", - "treema": "~0.0.1", - "bootstrap": "~3.1.1" + "treema": ">=0.0.1", + "bootstrap": "~3.1.1", + "validated-backbone-mediator": "~0.1.3" }, "overrides": { "backbone": { @@ -55,6 +57,9 @@ "underscore.string": { "main": "lib/underscore.string.js" }, + "jsondiffpatch": { + "main": ["build/bundle-full.js", "build/formatters.js", "src/formatters/html.css"] + }, "jquery.tablesorter": { "main": [ "js/jquery.tablesorter.js", diff --git a/config.coffee b/config.coffee index 176701755..27c476980 100644 --- a/config.coffee +++ b/config.coffee @@ -52,6 +52,8 @@ exports.config = 'vendor/scripts/soundjs-NEXT.combined.js' 'vendor/scripts/tweenjs-NEXT.combined.js' 'vendor/scripts/movieclip-NEXT.min.js' + # Validated Backbone Mediator dependencies + 'bower_components/tv4/tv4.js' # Aether before box2d for some strange Object.defineProperty thing 'bower_components/aether/build/aether.js' diff --git a/package.json b/package.json index fc229cd02..ee0dcc201 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "mongoose": "3.8.x", "mongoose-text-search": "~0.0.2", "request": "2.12.x", - "tv4": "1.0.11", + "tv4": "1.0.x", "lodash": "~2.0.0", "underscore.string": "2.3.x", "async": "0.2.x", @@ -56,7 +56,7 @@ "graceful-fs": "~2.0.1", "node-force-domain": "~0.1.0", "mailchimp-api": "2.0.x", - "express-useragent": "~0.0.9", + "express-useragent": "~0.0.9", "gridfs-stream": "0.4.x", "stream-buffers": "0.2.x", "sendwithus": "2.0.x", diff --git a/scripts/devSetup/directoryController.py b/scripts/devSetup/directoryController.py index 6585ff5f8..5087db888 100644 --- a/scripts/devSetup/directoryController.py +++ b/scripts/devSetup/directoryController.py @@ -20,23 +20,30 @@ class DirectoryController(object): def bin_directory(self): return self.root_install_directory + def mkdir(self, path): + if os.path.exists(path): + print(u"Skipping creation of " + path + " because it exists.") + else: + os.mkdir(path) + def create_directory_in_tmp(self,subdirectory): - os.mkdir(self.generate_path_for_directory_in_tmp(subdirectory)) + path = self.generate_path_for_directory_in_tmp(subdirectory) + self.mkdir(path) def generate_path_for_directory_in_tmp(self,subdirectory): return self.tmp_directory + os.sep + subdirectory def create_directory_in_bin(self,subdirectory): full_path = self.bin_directory + os.sep + subdirectory - os.mkdir(full_path) + self.mkdir(full_path) def create_base_directories(self): shutil.rmtree(self.root_dir + os.sep + "coco" + os.sep + "node_modules",ignore_errors=True) #just in case try: - if os.path.exists(self.tmp_directory): - self.remove_tmp_directory() - os.mkdir(self.tmp_directory) + if os.path.exists(self.tmp_directory): + self.remove_tmp_directory() + os.mkdir(self.tmp_directory) except: - raise errors.CoCoError(u"There was an error creating the directory structure, do you have correct permissions? Please remove all and start over.") + raise errors.CoCoError(u"There was an error creating the directory structure, do you have correct permissions? Please remove all and start over.") def remove_directories(self): shutil.rmtree(self.bin_directory + os.sep + "node",ignore_errors=True) diff --git a/scripts/devSetup/factories.py b/scripts/devSetup/factories.py index f14f922ec..1eab847bb 100644 --- a/scripts/devSetup/factories.py +++ b/scripts/devSetup/factories.py @@ -37,10 +37,12 @@ class SetupFactory(object): try: mongo_version_string = subprocess.check_output("mongod --version",shell=True) mongo_version_string = mongo_version_string.decode(encoding='UTF-8') - except: - print("Mongod not found.") + except Exception as e: + print("Mongod not found: %s"%e) if "v2.6." not in mongo_version_string: - print("MongoDB not found, so installing...") + if mongo_version_string: + print("Had MongoDB version: %s"%mongo_version_string) + print("MongoDB not found, so installing a local copy...") self.mongo.download_dependencies() self.mongo.install_dependencies() self.node.download_dependencies() diff --git a/scripts/devSetup/mongo.py b/scripts/devSetup/mongo.py index 88de736af..eb57ea452 100644 --- a/scripts/devSetup/mongo.py +++ b/scripts/devSetup/mongo.py @@ -8,7 +8,7 @@ import os from configuration import Configuration from dependency import Dependency import sys - +import shutil class MongoDB(Dependency): def __init__(self,configuration): @@ -32,13 +32,20 @@ class MongoDB(Dependency): def bashrc_string(self): return "COCO_MONGOD_PATH=" + self.config.directory.bin_directory + os.sep + u"mongo" + os.sep +"bin" + os.sep + "mongod" + def download_dependencies(self): - self.downloader.download() - self.downloader.decompress() + install_directory = self.config.directory.bin_directory + os.sep + u"mongo" + if os.path.exists(install_directory): + print(u"Skipping MongoDB download because " + install_directory + " exists.") + else: + self.downloader.download() + self.downloader.decompress() def install_dependencies(self): install_directory = self.config.directory.bin_directory + os.sep + u"mongo" - import shutil - shutil.copytree(self.findUnzippedMongoBinPath(),install_directory) + if os.path.exists(install_directory): + print(u"Skipping creation of " + install_directory + " because it exists.") + else: + shutil.copytree(self.findUnzippedMongoBinPath(),install_directory) def findUnzippedMongoBinPath(self): return self.downloader.download_directory + os.sep + \ diff --git a/scripts/devSetup/node.py b/scripts/devSetup/node.py index 065634aad..8fb1265d8 100644 --- a/scripts/devSetup/node.py +++ b/scripts/devSetup/node.py @@ -37,19 +37,27 @@ class Node(Dependency): return self.config.directory.bin_directory def download_dependencies(self): - self.downloader.download() - self.downloader.decompress() + install_directory = self.config.directory.bin_directory + os.sep + u"node" + if os.path.exists(install_directory): + print(u"Skipping Node download because " + install_directory + " exists.") + else: + self.downloader.download() + self.downloader.decompress() def bashrc_string(self): return "COCO_NODE_PATH=" + self.config.directory.bin_directory + os.sep + u"node" + os.sep + "bin" + os.sep +"node" def install_dependencies(self): install_directory = self.config.directory.bin_directory + os.sep + u"node" #check for node here - unzipped_node_path = self.findUnzippedNodePath() if self.config.system.operating_system in ["mac","linux"] and not which("node"): + unzipped_node_path = self.findUnzippedNodePath() print("Copying node into /usr/local/bin/...") shutil.copy(unzipped_node_path + os.sep + "bin" + os.sep + "node","/usr/local/bin/") os.chmod("/usr/local/bin/node",S_IRWXG|S_IRWXO|S_IRWXU) - shutil.copytree(self.findUnzippedNodePath(),install_directory) + if os.path.exists(install_directory): + print(u"Skipping creation of " + install_directory + " because it exists.") + else: + unzipped_node_path = self.findUnzippedNodePath() + shutil.copytree(self.findUnzippedNodePath(),install_directory) wants_to_upgrade = True if self.check_if_executable_installed(u"npm"): warning_string = u"A previous version of npm has been found. \nYou may experience problems if you have a version of npm that's too old.Would you like to upgrade?(y/n) " diff --git a/scripts/windows/coco-dev-setup/batch/config/config.coco b/scripts/windows/coco-dev-setup/batch/config/config.coco index e2d7570f5..da381689f 100755 --- a/scripts/windows/coco-dev-setup/batch/config/config.coco +++ b/scripts/windows/coco-dev-setup/batch/config/config.coco @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="ISO-8859-1" ?> <variables> - <version>3.3</version> + <version>3.5</version> <author>GlenDC</author> <copyright>CodeCombat.com � 2013-2014</copyright> <github_url>https://github.com/codecombat/codecombat.git</github_url> diff --git a/scripts/windows/coco-dev-setup/batch/config/downloads.coco b/scripts/windows/coco-dev-setup/batch/config/downloads.coco index 1d57fbb71..f8906cbb4 100755 --- a/scripts/windows/coco-dev-setup/batch/config/downloads.coco +++ b/scripts/windows/coco-dev-setup/batch/config/downloads.coco @@ -18,6 +18,14 @@ <vs10redist>http://download.microsoft.com/download/C/6/D/C6D0FD4E-9E53-4897-9B91-836EBA2AACD3/vcredist_x86.exe</vs10redist> </general> </general> + <Win8> + <b32> + <mongodb>https://fastdl.mongodb.org/win32/mongodb-win32-i386-2.6.0.zip</mongodb> + </b32> + <b64> + <mongodb>https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-2.6.0.zip</mongodb> + </b64> + </Win8> <Win7> <b32> <mongodb>https://fastdl.mongodb.org/win32/mongodb-win32-i386-2.6.0.zip</mongodb> diff --git a/scripts/windows/coco-dev-setup/batch/config/finished_header.coco b/scripts/windows/coco-dev-setup/batch/config/finished_header.coco old mode 100755 new mode 100644 index 3e8f64b02..9163183ca --- a/scripts/windows/coco-dev-setup/batch/config/finished_header.coco +++ b/scripts/windows/coco-dev-setup/batch/config/finished_header.coco @@ -1,7 +1,7 @@ - ______ _____ _ _ _____ _____ _ _ ___________ - | ___|_ _| \ | |_ _/ ___| | | || ___| _ \ - | |_ | | | \| | | | \ `--.| |_| || |__ | | | | - | _| | | | . ` | | | `--. \ _ || __|| | | | - | | _| |_| |\ |_| |_/\__/ / | | || |___| |/ / - \_| \___/\_| \_/\___/\____/\_| |_/\____/|___/ + ______ _____ _ _ _____ _____ _ _ ___________ + | ___|_ _| \ | |_ _/ ___| | | || ___| _ \ + | |_ | | | \| | | | \ `--.| |_| || |__ | | | | + | _| | | | . ` | | | `--. \ _ || __|| | | | + | | _| |_| |\ |_| |_/\__/ / | | || |___| |/ / + \_| \___/\_| \_/\___/\____/\_| |_/\____/|___/ \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/config/github_header.coco b/scripts/windows/coco-dev-setup/batch/config/github_header.coco old mode 100755 new mode 100644 index dd979561d..ce71943fc --- a/scripts/windows/coco-dev-setup/batch/config/github_header.coco +++ b/scripts/windows/coco-dev-setup/batch/config/github_header.coco @@ -1,7 +1,7 @@ - _____ _____ _____ _ _ _ _______ - | __ \_ _|_ _| | | | | | | ___ \ - | | \/ | | | | | |_| | | | | |_/ / - | | __ | | | | | _ | | | | ___ \ - | |_\ \_| |_ | | | | | | |_| | |_/ / - \____/\___/ \_/ \_| |_/\___/\____/ + _____ _____ _____ _ _ _ _______ + | __ \_ _|_ _| | | | | | | ___ \ + | | \/ | | | | | |_| | | | | |_/ / + | | __ | | | | | _ | | | | ___ \ + | |_\ \_| |_ | | | | | | |_| | |_/ / + \____/\___/ \_/ \_| |_/\___/\____/ \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/config/install_header.coco b/scripts/windows/coco-dev-setup/batch/config/install_header.coco old mode 100755 new mode 100644 index a804e1db3..e99e50e70 --- a/scripts/windows/coco-dev-setup/batch/config/install_header.coco +++ b/scripts/windows/coco-dev-setup/batch/config/install_header.coco @@ -1,7 +1,7 @@ - _____ ___________ _____ _ _ ___ ______ _____ - / ___|| _ | ___|_ _| | | |/ _ \ | ___ \ ___| - \ `--. | | | | |_ | | | | | / /_\ \| |_/ / |__ - `--. \| | | | _| | | | |/\| | _ || /| __| - /\__/ /\ \_/ / | | | \ /\ / | | || |\ \| |___ - \____/ \___/\_| \_/ \/ \/\_| |_/\_| \_\____/ + _____ ___________ _____ _ _ ___ ______ _____ + / ___|| _ | ___|_ _| | | |/ _ \ | ___ \ ___| + \ `--. | | | | |_ | | | | | / /_\ \| |_/ / |__ + `--. \| | | | _| | | | |/\| | _ || /| __| + /\__/ /\ \_/ / | | | \ /\ / | | || |\ \| |___ + \____/ \___/\_| \_/ \/ \/\_| |_/\_| \_\____/ \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/config/license.coco b/scripts/windows/coco-dev-setup/batch/config/localized/license-nl.coco similarity index 100% rename from scripts/windows/coco-dev-setup/batch/config/license.coco rename to scripts/windows/coco-dev-setup/batch/config/localized/license-nl.coco diff --git a/scripts/windows/coco-dev-setup/batch/config/localized/license.coco b/scripts/windows/coco-dev-setup/batch/config/localized/license.coco new file mode 100755 index 000000000..9b753bf10 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/config/localized/license.coco @@ -0,0 +1,10 @@ + +The MIT License (MIT) + +Copyright (c) 2014 CodeCombat Inc. and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN sCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE. diff --git a/scripts/windows/coco-dev-setup/batch/config/readme.coco b/scripts/windows/coco-dev-setup/batch/config/localized/readme-nl.coco similarity index 100% rename from scripts/windows/coco-dev-setup/batch/config/readme.coco rename to scripts/windows/coco-dev-setup/batch/config/localized/readme-nl.coco diff --git a/scripts/windows/coco-dev-setup/batch/config/localized/readme.coco b/scripts/windows/coco-dev-setup/batch/config/localized/readme.coco new file mode 100755 index 000000000..40665c28c --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/config/localized/readme.coco @@ -0,0 +1,29 @@ + _____ _ _____ _ _ + / __ \ | | / __ \ | | | | + | / \/ ___ __| | ___ | / \/ ___ _ __ ___ | |__ __ _| |_ + | | / _ \ / _` |/ _ \ | | / _ \| '_ ` _ \| '_ \ / _` | __| + | \__/\ (_) | (_| | __/ | \__/\ (_) | | | | | | |_) | (_| | |_ + \____/\___/ \__,_|\___| \____/\___/|_| |_| |_|_.__/ \__,_|\__| + +============================================================================= + +Congratulations, you are now part of the CodeCombat community. +Now that your Develop Environment has been setup, you are ready to start +contributing and help us make this world a better place. + +Do you have questions or would you like to meet us? +Talk with us on hipchat @ https://www.hipchat.com/g3plnOKqa + +Another way to reach is, is by visiting our forum. +You can find it @ http://discourse.codecombat.com/ + +You can read about the latest developments on our blog site. +This one can be found @ http://blog.codecombat.com/ + +Last but not least, you can find most of our documentation +and information on our wiki @ https://github.com/codecombat/codecombat/wiki + +We hope you'll enjoy yourself within our community, just as much as us. + + + - Nick, George, Scott, Michael, Jeremy and Glen diff --git a/scripts/windows/coco-dev-setup/batch/config/localized/tips-nl.coco b/scripts/windows/coco-dev-setup/batch/config/localized/tips-nl.coco new file mode 100755 index 000000000..bc12d3bf5 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/config/localized/tips-nl.coco @@ -0,0 +1,8 @@ + 1) Antwoord voorzichtig en juist, indien er een vraag gesteld wordt. + 2) Deze installatie is nog steeds in beta en kan bugs bevatten. + 3) Rapporteer bugs op 'https://github.com/codecombat/codecombat/issues' + 4) Heb je vragen of suggesties? Praat met ons op HipChat via CodeCombat.com + + Je kan een Engelstalige stappengids + voor deze installatie vinden op onze wiki: + github.com/codecombat/codecombat/wiki/Setup-on-Windows:-a-step-by-step-guide \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/config/tips.coco b/scripts/windows/coco-dev-setup/batch/config/localized/tips.coco similarity index 100% rename from scripts/windows/coco-dev-setup/batch/config/tips.coco rename to scripts/windows/coco-dev-setup/batch/config/localized/tips.coco diff --git a/scripts/windows/coco-dev-setup/batch/config/npm_and_brunch_header.coco b/scripts/windows/coco-dev-setup/batch/config/npm_and_brunch_header.coco old mode 100755 new mode 100644 index 968e651dd..53a47af88 --- a/scripts/windows/coco-dev-setup/batch/config/npm_and_brunch_header.coco +++ b/scripts/windows/coco-dev-setup/batch/config/npm_and_brunch_header.coco @@ -1,7 +1,7 @@ - _ _ _________ ___ ____________ _ _ _ _ _____ _ _ - | \ | || ___ \ \/ | | ___ \ ___ \ | | | \ | / __ \| | | | - | \| || |_/ / . . | ______ | |_/ / |_/ / | | | \| | / \/| |_| | - | . ` || __/| |\/| | |______| | ___ \ /| | | | . ` | | | _ | - | |\ || | | | | | | |_/ / |\ \| |_| | |\ | \__/\| | | | - \_| \_/\_| \_| |_/ \____/\_| \_|\___/\_| \_/\____/\_| |_/ + _ _ _________ ___ ____________ _ _ _ _ _____ _ _ + | \ | || ___ \ \/ | | ___ \ ___ \ | | | \ | / __ \| | | | + | \| || |_/ / . . | ______ | |_/ / |_/ / | | | \| | / \/| |_| | + | . ` || __/| |\/| | |______| | ___ \ /| | | | . ` | | | _ | + | |\ || | | | | | | |_/ / |\ \| |_| | |\ | \__/\| | | | + \_| \_/\_| \_| |_/ \____/\_| \_|\___/\_| \_/\____/\_| |_/ \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/de.coco b/scripts/windows/coco-dev-setup/batch/localisation/de.coco deleted file mode 100755 index e8af90621..000000000 --- a/scripts/windows/coco-dev-setup/batch/localisation/de.coco +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<variables> - <global> - <native>Deutsch</native> - <description>German</description> - <intro>Ab jetzt senden wir unser Feedback in Englisch!</intro> - </global> - <install> - <system> - <bit>-Bit System erkannt.</bit> - <prefix>Es wurde das Betriebssystem</prefix> - <sufix>erkannt.</sufix> - <xp>Windows XP wird nicht unterstützt. Installation abgebrochen.</xp> - </system> - <process> - <sks>Sind die für CodeCombat benötigten Programme bereits installiert?</sks> - <skq>Wir empfehlen Ihnen, mit „Nein“ zu antorten, falls Sie unsicher sind.</skq> - <skc>Überspringe Installation der Programme...</skc> - <s1>Ohne Software von Drittanbietern könnte CodeCombat nicht entwickelt werden.</s1> - <s2>Aus diesem Grund müssen Sie diese Software installieren,</s2> - <s3>um sich in der Community zu engagieren.</s3> - <s4>Wenn Sie ein Programm bereits installiert haben, brechen Sie die Installation bitte ab.</s4> - <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> - <prefix>Haben Sie bereits die aktuellste Version von</prefix> - <sufix>installiert?</sufix> - <downloading>wird heruntergeladen...</downloading> - <installing>wird installiert...</installing> - <unzipping>wird entpackt...</unzipping> - <cleaning>wird aufgeräumt...</cleaning> - <mongodbpath>Bitte geben Sie den kompletten Pfad an, an dem MongoDB installiert werden soll</mongodbpath> - </process> - </install> - <github> - <intro> - <opensource>Wie Du bereits weißt, ist CodeCombat Open Source.</opensource> - <online>Unser Quellcode ist komplett auf Github.</online> - <manual>Wenn Du möchtest, kannst du das komplette Git Repository selbst herunterladen und nach deinen wünschen einrichten.</manual> - <norec>Allerdings empfehlen wir, dass du den Prozess statt dessen uns überlässt.</norec> - </intro> - <skip> - <question>Willst du das lokale Git Setup selbst vornehmen?</question> - <consequence>Bit vergewissere dich, dass das Repository korrekt heruntergeladen wurde, bevor du fortfährst.</consequence> - <donotclose>Bitte schließe dieses Fenster nicht.</donotclose> - <wait>Wenn du fertig bist, drücke eine beliebige Taste zum Fortfahren...</wait> - </skip> - <process> - <path>Gebe bitte den kompletten Pfad zu deinem CodeCombat Git Repository ein: </path> - <checkout>Bitte gib den kompletten Pfad ein, an dem du die CodeCombat Umgebung einrichten willst</checkout> - <bashi>Diese Installation benötigt die Git Bash.</bashi> - <bashp64>Die Git Bash ist standardmäßig in 'C:\Program Files (x86)\Git' installiert.</bashp64> - <bashp32>Die Git Bash ist standardmäßig in 'C:\Program Files\Git' installiert.</bashp32> - <bashq>Bitte gebe den kompletten Pfad zur Git Bash ein, oder drücke Enter, um den Standardpfad zu verwenden</bashq> - <ssh>Willst du das Repository via SSH auschecken?</ssh> - </process> - </github> - <switch> - <install>The installation of your local environment was succesfull!</install> - <close>You can now close this setup.</close> - <open>After that, you should open the configuration setup to automaticly configure your environment...</open> - </switch> - <npm> - <install>Installing bower, brunch, nodemon and sendwithus...</install> - <binstall>Installing bower packages...</binstall> - <sass>Installing sass...</sass> - <npm>Installing npm...</npm> - <brnch>Starting brunch....</brnch> - <mongodb>Setting up a MongoDB database for you...</mongodb> - <database>Downloading the last version of the CodeCombat database...</database> - <script>Preparing the automatic startup script for you...</script> - <close>Don't close!</close> - </npm> - <error> - <path>Dieser Pfad existiert bereits. Willst du ihn wirklich überschreiben?</path> - <exist>Dieser Pfad exisitert nicht. Bitte versuche es erneut...</exist> - </error> - <end> - <succesfull>Die CodeCombat Entwicklungsumgebung wurde erfoglreich installiert.</succesfull> - <thankyou>Vielen Dank für die Unterstützung und bis bald.</thankyou> - <readme>Willst du das README lesen, um weitere Informationen zu erhalten?</readme> - </end> - <start> - <s1>Von nun an kannst du die Entwicklungsumgebung starten unter</s1> - <s2>einmal mit der Maus klicken.</s2> - <s3> 1) Einfach Doppelklicken</s3> - <s4>und warten bis die Entwicklungsumgebung fertig geladen hat.</s4> - <s5> 2) Jetzt 'localhost:3000' in deinem bevorzugten Browser aufrufen.</s5> - <s6>Fertig. Du bist nun bereit, bei CodeCombat mitzuarbeiten!</s6> - </start> -</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/fr.coco b/scripts/windows/coco-dev-setup/batch/localisation/fr.coco old mode 100755 new mode 100644 index d2a0d67ae..9dfac45b6 --- a/scripts/windows/coco-dev-setup/batch/localisation/fr.coco +++ b/scripts/windows/coco-dev-setup/batch/localisation/fr.coco @@ -1,89 +1,82 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<variables> - <global> - <native>français</native> - <description>French</description> - <intro>From now on we'll send our feedback in English!</intro> - </global> - <install> - <system> - <bit>-bit computer detected.</bit> - <prefix>The operating system</prefix> - <sufix>was detected.</sufix> - <xp>We don't support Windows XP, installation cancelled.</xp> - </system> - <process> - <sks>Have you already installed all the software needed for CodeCombat?</sks> - <skq>We recommand that you reply negative in case you're not sure.</skq> - <skc>Skipping the installation of the software...</skc> - <s1>CodeCombat couldn't be developed without third-party software.</s1> - <s2>That's why you'll need to install this software,</s2> - <s3>in order to start contributing to our community.</s3> - <s4>Cancel the installation if you already have the application.</s4> - <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> - <prefix>Do you already have the latest version of</prefix> - <sufix>installed?</sufix> - <downloading>is downloading...</downloading> - <installing>is installing...</installing> - <unzipping>is unzipping...</unzipping> - <cleaning>is cleaning...</cleaning> - <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> - </process> - </install> - <github> - <intro> - <opensource>CodeCombat is opensource, like you already know.</opensource> - <online>All our sourcecode can be found online at Github.</online> - <manual>You can choose to do the entire Git setup yourself.</manual> - <norec>However we recommend that you instead let us handle it instead.</norec> - </intro> - <skip> - <question>Do you want to do the Local Git setup manually yourself?</question> - <consequence>Make sure you have correctly setup your repository before processing.</consequence> - <donotclose>Do not close this window please.</donotclose> - <wait>When you're ready, press any key to continue...</wait> - </skip> - <process> - <path>Please give the full path of your CodeCombat git repository: </path> - <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> - <bashi>This installation requires Git Bash.</bashi> - <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> - <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> - <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> - <ssh>Do you want to checkout the repository via ssh?</ssh> - </process> - </github> - <switch> - <install>The installation of your local environment was succesfull!</install> - <close>You can now close this setup.</close> - <open>After that, you should open the configuration setup to automaticly configure your environment...</open> - </switch> - <npm> - <install>Installing bower, brunch, nodemon and sendwithus...</install> - <binstall>Installing bower packages...</binstall> - <sass>Installing sass...</sass> - <npm>Installing npm...</npm> - <brnch>Starting brunch....</brnch> - <mongodb>Setting up a MongoDB database for you...</mongodb> - <db>Downloading the last version of the CodeCombat database...</db> - <script>Preparing the automatic startup script for you...</script> - <close>Don't close!</close> - </npm> - <error> - <path>That path already exists, are you sure you want to overwrite it?</path> - <exist>That path doesn't exist. Please try again...</exist> - </error> - <end> - <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> - <thankyou>Thank you already for your contribution and see you soon.</thankyou> - <readme>Do you want to read the README for more information?</readme> - </end> - <start> - <s1>From now on you can start the dev. environment at</s1> - <s2>the touch of a single mouse click.</s2> - <s3> 1) Just double click</s3> - <s4> and let the environment start up.</s4> - <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> - <s6>That's it, you're now ready to start working on CodeCombat!</s6> - </start> +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>français</native> + <intro>From now on we'll send our feedback in English!</intro> + </global> + <install> + <system> + <bit>-bit computer detected.</bit> + <prefix>The operating system</prefix> + <sufix>was detected.</sufix> + <xp>We don't support Windows XP, installation cancelled.</xp> + </system> + <process> + <sks>Have you already installed all the software needed for CodeCombat?</sks> + <skq>We recommand that you reply negative in case you're not sure.</skq> + <skc>Skipping the installation of the software...</skc> + <s1>CodeCombat couldn't be developed without third-party software.</s1> + <s2>That's why you'll need to install this software,</s2> + <s3>in order to start contributing to our community.</s3> + <s4>Cancel the installation if you already have the application.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Do you already have the latest version of</prefix> + <sufix>installed?</sufix> + <downloading>is downloading...</downloading> + <installing>is installing...</installing> + <unzipping>is unzipping...</unzipping> + <cleaning>is cleaning...</cleaning> + <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat is opensource, like you already know.</opensource> + <online>All our sourcecode can be found online at Github.</online> + <manual>You can choose to do the entire Git setup yourself.</manual> + <norec>However we recommend that you instead let us handle it instead.</norec> + </intro> + <skip> + <question>Do you want to do the Local Git setup manually yourself?</question> + <consequence>Make sure you have correctly setup your repository before processing.</consequence> + <donotclose>Do not close this window please.</donotclose> + <wait>When you're ready, press any key to continue...</wait> + </skip> + <process> + <path>Please give the full path of your CodeCombat git repository: </path> + <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> + <bashi>This installation requires Git Bash.</bashi> + <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> + <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> + <ssh>Do you want to checkout the repository via ssh?</ssh> + </process> + </github> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <db>Downloading the last version of the CodeCombat database...</db> + <script>Preparing the automatic startup script for you...</script> + </npm> + <error> + <path>That path already exists, are you sure you want to overwrite it?</path> + <exist>That path doesn't exist. Please try again...</exist> + </error> + <end> + <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> + <thankyou>Thank you already for your contribution and see you soon.</thankyou> + <readme>Do you want to read the README for more information?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) Just double click</s3> + <s4> and let the environment start up.</s4> + <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> + <s6>That's it, you're now ready to start working on CodeCombat!</s6> + </start> </variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/languages.coco b/scripts/windows/coco-dev-setup/batch/localisation/languages.coco old mode 100755 new mode 100644 index a98092066..6acbda23b --- a/scripts/windows/coco-dev-setup/batch/localisation/languages.coco +++ b/scripts/windows/coco-dev-setup/batch/localisation/languages.coco @@ -1,6 +1,7 @@ -en -nl -de -fr -zh-HANT +en +nl +de +fr +zh +zh-HANT zh-HANS \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/nl.coco b/scripts/windows/coco-dev-setup/batch/localisation/nl.coco deleted file mode 100755 index 39b95ef9b..000000000 --- a/scripts/windows/coco-dev-setup/batch/localisation/nl.coco +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<variables> - <global> - <native>Nederlands</native> - <description>Dutch</description> - <intro>Vanaf nu geven we onze feedback in het Nederlands!</intro> - </global> - <install> - <system> - <bit>-bit computer gedetecteerd.</bit> - <prefix>Het besturingsysteem</prefix> - <sufix>is gedetecteerd.</sufix> - <xp>Wij ondersteunen Windows XP niet, installatie geanulleerd.</xp> - </system> - <process> - <sks>Heb je alle benodige software al geinstalleerd?</sks> - <skq>We raden aan dat je negatief antwoord indien je niet zeker bent.</skq> - <skc>De installatie van software wordt geanulleerd...</skc> - <s1>CodeCombat kon niet worden ontwikkeld zonder third-party software.</s1> - <s2>Dat is waarom je deze software moet installeren,</s2> - <s3>zodat je je kan beginnen met het bijdragen tot onze gemeenschap.</s3> - <s4>Annuleer de installatie als je de applicatie al hebt.</s4> - <winpath>Zorg er zeker voor dat je de optie selecteert dat de applicatie aan je Windows Path toevoegt, als de optie beschikbaar is.</winpath> - <prefix>Heb je al de laatste versie van</prefix> - <sufix>geinstalleerd?</sufix> - <downloading>is aan het downloaden...</downloading> - <installing>is aan het installeren...</installing> - <unzipping>is aan het uitpakken...</unzipping> - <cleaning>is aan het opkuisen...</cleaning> - <mongodbpath>Geef het volledige pad op, waar mongodb mag worden geinstalleerd</mongodbpath> - </process> - </install> - <github> - <intro> - <opensource>CodeCombat is opensource, zoals je waarschijnlijk wel al weet.</opensource> - <online>Je kan al onze sourcecode vinden op Github.</online> - <manual>Indien je wil, kan je de Git setup manueel doen.</manual> - <norec>Maar wij raden aan dat je ons dit automatisch laat afhandellen.</norec> - </intro> - <skip> - <question>Wil je de lokale Git setup manueel doen?</question> - <consequence>Zorg er zeker voor dat jouw git repository correct is.</consequence> - <donotclose>Sluit dit venster niet alsjeblieft.</donotclose> - <wait>Wanneer je klaar bent, druk dan eender welke toets om verder te gaan...</wait> - </skip> - <process> - <path>Geef alsjeblieft het volledige pad van je CodeCombat git repository: </path> - <checkout>Geef alsjeblieft het volledige pad waar je de CodeCombat Ontwikkelings omgeving will installeren</checkout> - <bashi>Deze installatie maakt gebruik van Git Bash.</bashi> - <bashp64>Git bash is normaal geinstalleerd in 'C:\Program Files (x86)\Git'.</bashp64> - <bashp32>Git bash is normaal geinstalleerd in 'C:\Program Files\Git'.</bashp32> - <bashq>Geef alsjeblieft het volledige pad op van Git Bash of druk gewoon op enter indien je het pad niet gewijzigd heeft</bashq> - <ssh>Wil je het git project downloaden via ssh?</ssh> - </process> - </github> - <switch> - <install>The installation of your local environment was succesfull!</install> - <close>You can now close this setup.</close> - <open>After that, you should open the configuration setup to automaticly configure your environment...</open> - </switch> - <npm> - <install>Installing bower, brunch, nodemon and sendwithus...</install> - <binstall>Installing bower packages...</binstall> - <sass>Installing sass...</sass> - <npm>Installing npm...</npm> - <brnch>Starting brunch....</brnch> - <mongodb>Setting up a MongoDB database for you...</mongodb> - <database>Downloading the last version of the CodeCombat database...</database> - <script>Preparing the automatic startup script for you...</script> - <close>Niet sluiten!</close> - </npm> - <error> - <path>Dat pad bestaat al, ben je zeker dat je het wil overschrijven?</path> - <exist>Dat pad bestaat niet, probeer alsjeblieft opnieuw...</exist> - </error> - <end> - <succesfull>De installatie van de CodeCombat-Ontwikkelings omgeving was succesvol.</succesfull> - <thankyou>Alvast bedankt voor al je werk en tot binnenkort.</thankyou> - <readme>Wil je de LEESMIJ lezen voor meer informatie?</readme> - </end> - <start> - <s1>Vanaf nu kan je de ontwikkelings omgeving opstarten</s1> - <s2>met het gemak van een enkele muisklik.</s2> - <s3> 1) Dubbelklik op</s3> - <s4>en laat de omgeving opstarten.</s4> - <s5> 2) Nu kan je 'localhost:3000' openen in je browser naar voorkeur.</s5> - <s6>Dat is het, je bent nu klaar om te starten met je werk aan CodeCombat.</s6> - </start> -</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/zh-HANS.coco b/scripts/windows/coco-dev-setup/batch/localisation/zh-HANS.coco deleted file mode 100755 index 410d032f7..000000000 --- a/scripts/windows/coco-dev-setup/batch/localisation/zh-HANS.coco +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<variables> - <global> - <native>简体中文</native> - <description>Traditional Chinese</description> - <intro>目前我们只能用英文给你反馈!</intro> - </global> - <install> - <system> - <bit>-位系统.</bit> - <prefix>操作系统</prefix> - <sufix>被侦测到.</sufix> - <xp>我们不支持 Windows XP, 安装取消.</xp> - </system> - <process> - <sks>你是否已经安装好运行 CodeCombat 所需的所有软件?</sks> - <skq>如果你不确定的话请回答 No.</skq> - <skc>正在跳过此软件的安装...</skc> - <s1>CodeCombat 无法在不使用第三方服务的情况下开发.</s1> - <s2>这就是为什么你需要安装这些软件,</s2> - <s3>为了开始给我们的开源社区做贡献.</s3> - <s4>如果你已经有了这些软件 请取消安装.</s4> - <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> - <prefix>你是否已经安装了最新版本的</prefix> - <sufix>?</sufix> - <downloading>正在下载...</downloading> - <installing>正在安装...</installing> - <unzipping>正在解压...</unzipping> - <cleaning>正在清理...</cleaning> - <mongodbpath>请输入你希望安装 mongodb 的文件夹的全路径</mongodbpath> - </process> - </install> - <github> - <intro> - <opensource>CodeCombat 是开源的.</opensource> - <online>我们的所有源代码都放在了 Github.</online> - <manual>你可以选择自己手工安装 Git.</manual> - <norec>但我们仍然建议让程序自动替你完成.</norec> - </intro> - <skip> - <question>你是否想自己手工安装本地 Git 安装?</question> - <consequence>请确保在开始处理前, 你有正确设置好你的库.</consequence> - <donotclose>请不要关闭此窗口.</donotclose> - <wait>如果你准备好了, 请按任意键继续...</wait> - </skip> - <process> - <path>请输入你 CodeCombat git库的全路径: </path> - <checkout>请输入你想安装 CodeCombat 环境的全路径</checkout> - <bashi>这项安装需要 Git Bash.</bashi> - <bashp64>Git bash 默认安装在 'C:\Program Files (x86)\Git'.</bashp64> - <bashp32>Git bash 默认安装在 'C:\Program Files\Git'.</bashp32> - <bashq>请输入 git bash 的安装全路径, 如果你安装的是默认路径, 那么直接输入回车即可</bashq> - <ssh>你是否想使用 ssh 来检出(checkout)库(repository)?</ssh> - </process> - </github> - <switch> - <install>The installation of your local environment was succesfull!</install> - <close>You can now close this setup.</close> - <open>After that, you should open the configuration setup to automaticly configure your environment...</open> - </switch> - <npm> - <install>正在安装 bower, brunch, nodemon 和 sendwithus...</install> - <binstall>正在用 bower 安装依赖包...</binstall> - <sass>正在安装 sass...</sass> - <npm>正在安装 npm...</npm> - <brnch>正在开启 brunch....</brnch> - <mongodb>正在为你设置 MongoDB 数据库...</mongodb> - <db>正在下载 CodeCombat 数据库的最新版本...</db> - <script>Preparing the automatic startup script for you...</script> - <close>Don't close!</close> - </npm> - <error> - <path>这个路径已经存在, 你想要覆盖它吗?</path> - <exist>这个路径不存在, 请再次尝试...</exist> - </error> - <end> - <succesfull>CodeCombat 开发环境的搭建已成功.</succesfull> - <thankyou>感谢~ 我们会很快再次见面的 :)</thankyou> - <readme>你是否想阅读 README 文件以了解更多信息?</readme> - </end> - <start> - <s1>From now on you can start the dev. environment at</s1> - <s2>the touch of a single mouse click.</s2> - <s3> 1) 双击文件</s3> - <s4> 启动开发环境.</s4> - <s5> 2) 在浏览器里访问 'localhost:3000' </s5> - <s6>好了,你现在可以开始开发 CodeCombat 了!</s6> - </start> -</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/zh-HANT.coco b/scripts/windows/coco-dev-setup/batch/localisation/zh.coco old mode 100755 new mode 100644 similarity index 89% rename from scripts/windows/coco-dev-setup/batch/localisation/zh-HANT.coco rename to scripts/windows/coco-dev-setup/batch/localisation/zh.coco index 8c242effa..6cada7324 --- a/scripts/windows/coco-dev-setup/batch/localisation/zh-HANT.coco +++ b/scripts/windows/coco-dev-setup/batch/localisation/zh.coco @@ -1,89 +1,82 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<variables> - <global> - <native>繁体中文</native> - <description>Simplified Chinese</description> - <intro>From now on we'll send our feedback in English!</intro> - </global> - <install> - <system> - <bit>-bit computer detected.</bit> - <prefix>The operating system</prefix> - <sufix>was detected.</sufix> - <xp>We don't support Windows XP, installation cancelled.</xp> - </system> - <process> - <sks>Have you already installed all the software needed for CodeCombat?</sks> - <skq>We recommand that you reply negative in case you're not sure.</skq> - <skc>Skipping the installation of the software...</skc> - <s1>CodeCombat couldn't be developed without third-party software.</s1> - <s2>That's why you'll need to install this software,</s2> - <s3>in order to start contributing to our community.</s3> - <s4>Cancel the installation if you already have the application.</s4> - <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> - <prefix>Do you already have the latest version of</prefix> - <sufix>installed?</sufix> - <downloading>is downloading...</downloading> - <installing>is installing...</installing> - <unzipping>is unzipping...</unzipping> - <cleaning>is cleaning...</cleaning> - <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> - </process> - </install> - <github> - <intro> - <opensource>CodeCombat is opensource, like you already know.</opensource> - <online>All our sourcecode can be found online at Github.</online> - <manual>You can choose to do the entire Git setup yourself.</manual> - <norec>However we recommend that you instead let us handle it instead.</norec> - </intro> - <skip> - <question>Do you want to do the Local Git setup manually yourself?</question> - <consequence>Make sure you have correctly setup your repository before processing.</consequence> - <donotclose>Do not close this window please.</donotclose> - <wait>When you're ready, press any key to continue...</wait> - </skip> - <process> - <path>Please give the full path of your CodeCombat git repository: </path> - <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> - <bashi>This installation requires Git Bash.</bashi> - <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> - <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> - <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> - <ssh>Do you want to checkout the repository via ssh?</ssh> - </process> - </github> - <switch> - <install>The installation of your local environment was succesfull!</install> - <close>You can now close this setup.</close> - <open>After that, you should open the configuration setup to automaticly configure your environment...</open> - </switch> - <npm> - <install>Installing bower, brunch, nodemon and sendwithus...</install> - <binstall>Installing bower packages...</binstall> - <sass>Installing sass...</sass> - <npm>Installing npm...</npm> - <brnch>Starting brunch....</brnch> - <mongodb>Setting up a MongoDB database for you...</mongodb> - <db>Downloading the last version of the CodeCombat database...</db> - <script>Preparing the automatic startup script for you...</script> - <close>Don't close!</close> - </npm> - <error> - <path>That path already exists, are you sure you want to overwrite it?</path> - <exist>That path doesn't exist. Please try again...</exist> - </error> - <end> - <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> - <thankyou>Thank you already for your contribution and see you soon.</thankyou> - <readme>Do you want to read the README for more information?</readme> - </end> - <start> - <s1>From now on you can start the dev. environment at</s1> - <s2>the touch of a single mouse click.</s2> - <s3> 1) Just double click</s3> - <s4> and let the environment start up.</s4> - <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> - <s6>That's it, you're now ready to start working on CodeCombat!</s6> - </start> +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>中文</native> + <intro>From now on we'll send our feedback in English!</intro> + </global> + <install> + <system> + <bit>-bit computer detected.</bit> + <prefix>The operating system</prefix> + <sufix>was detected.</sufix> + <xp>We don't support Windows XP, installation cancelled.</xp> + </system> + <process> + <sks>Have you already installed all the software needed for CodeCombat?</sks> + <skq>We recommand that you reply negative in case you're not sure.</skq> + <skc>Skipping the installation of the software...</skc> + <s1>CodeCombat couldn't be developed without third-party software.</s1> + <s2>That's why you'll need to install this software,</s2> + <s3>in order to start contributing to our community.</s3> + <s4>Cancel the installation if you already have the application.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Do you already have the latest version of</prefix> + <sufix>installed?</sufix> + <downloading>is downloading...</downloading> + <installing>is installing...</installing> + <unzipping>is unzipping...</unzipping> + <cleaning>is cleaning...</cleaning> + <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat is opensource, like you already know.</opensource> + <online>All our sourcecode can be found online at Github.</online> + <manual>You can choose to do the entire Git setup yourself.</manual> + <norec>However we recommend that you instead let us handle it instead.</norec> + </intro> + <skip> + <question>Do you want to do the Local Git setup manually yourself?</question> + <consequence>Make sure you have correctly setup your repository before processing.</consequence> + <donotclose>Do not close this window please.</donotclose> + <wait>When you're ready, press any key to continue...</wait> + </skip> + <process> + <path>Please give the full path of your CodeCombat git repository: </path> + <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> + <bashi>This installation requires Git Bash.</bashi> + <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> + <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> + <ssh>Do you want to checkout the repository via ssh?</ssh> + </process> + </github> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <db>Downloading the last version of the CodeCombat database...</db> + <script>Preparing the automatic startup script for you...</script> + </npm> + <error> + <path>That path already exists, are you sure you want to overwrite it?</path> + <exist>That path doesn't exist. Please try again...</exist> + </error> + <end> + <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> + <thankyou>Thank you already for your contribution and see you soon.</thankyou> + <readme>Do you want to read the README for more information?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) Just double click</s3> + <s4> and let the environment start up.</s4> + <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> + <s6>That's it, you're now ready to start working on CodeCombat!</s6> + </start> </variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localization/de.coco b/scripts/windows/coco-dev-setup/batch/localization/de.coco new file mode 100644 index 000000000..2b793068f --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/de.coco @@ -0,0 +1,192 @@ +<<<<<<< HEAD:scripts/windows/coco-dev-setup/batch/localisation/de.coco +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>Deutsch</native> + <intro>Ab jetzt senden wir unser Feedback in Englisch!</intro> + </global> + <install> + <system> + <bit>-Bit System erkannt.</bit> + <prefix>Es wurde das Betriebssystem</prefix> + <sufix>erkannt.</sufix> + <xp>Windows XP wird nicht unterstützt. Installation abgebrochen.</xp> + </system> + <process> + <sks>Sind die für CodeCombat benötigten Programme bereits installiert?</sks> + <skq>Wir empfehlen Ihnen, mit „Nein“ zu antorten, falls Sie unsicher sind.</skq> + <skc>Überspringe Installation der Programme...</skc> + <s1>Ohne Software von Drittanbietern könnte CodeCombat nicht entwickelt werden.</s1> + <s2>Aus diesem Grund müssen Sie diese Software installieren,</s2> + <s3>um sich in der Community zu engagieren.</s3> + <s4>Wenn Sie ein Programm bereits installiert haben, brechen Sie die Installation bitte ab.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Haben Sie bereits die aktuellste Version von</prefix> + <sufix>installiert?</sufix> + <downloading>wird heruntergeladen...</downloading> + <installing>wird installiert...</installing> + <unzipping>wird entpackt...</unzipping> + <cleaning>wird aufgeräumt...</cleaning> + <mongodbpath>Bitte geben Sie den kompletten Pfad an, an dem MongoDB installiert werden soll</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>Wie Du bereits weißt, ist CodeCombat Open Source.</opensource> + <online>Unser Quellcode ist komplett auf Github.</online> + <manual>Wenn Du möchtest, kannst du das komplette Git Repository selbst herunterladen und nach deinen wünschen einrichten.</manual> + <norec>Allerdings empfehlen wir, dass du den Prozess statt dessen uns überlässt.</norec> + </intro> + <skip> + <question>Willst du das lokale Git Setup selbst vornehmen?</question> + <consequence>Bit vergewissere dich, dass das Repository korrekt heruntergeladen wurde, bevor du fortfährst.</consequence> + <donotclose>Bitte schließe dieses Fenster nicht.</donotclose> + <wait>Wenn du fertig bist, drücke eine beliebige Taste zum Fortfahren...</wait> + </skip> + <process> + <path>Gebe bitte den kompletten Pfad zu deinem CodeCombat Git Repository ein: </path> + <checkout>Bitte gib den kompletten Pfad ein, an dem du die CodeCombat Umgebung einrichten willst</checkout> + <bashi>Diese Installation benötigt die Git Bash.</bashi> + <bashp64>Die Git Bash ist standardmäßig in 'C:\Program Files (x86)\Git' installiert.</bashp64> + <bashp32>Die Git Bash ist standardmäßig in 'C:\Program Files\Git' installiert.</bashp32> + <bashq>Bitte gebe den kompletten Pfad zur Git Bash ein, oder drücke Enter, um den Standardpfad zu verwenden</bashq> + <ssh>Willst du das Repository via SSH auschecken?</ssh> + </process> + </github> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <database>Downloading the last version of the CodeCombat database...</database> + <script>Preparing the automatic startup script for you...</script> + </npm> + <error> + <path>Dieser Pfad existiert bereits. Willst du ihn wirklich überschreiben?</path> + <exist>Dieser Pfad exisitert nicht. Bitte versuche es erneut...</exist> + </error> + <end> + <succesfull>Die CodeCombat Entwicklungsumgebung wurde erfoglreich installiert.</succesfull> + <thankyou>Vielen Dank für die Unterstützung und bis bald.</thankyou> + <readme>Willst du das README lesen, um weitere Informationen zu erhalten?</readme> + </end> + <start> + <s1>Von nun an kannst du die Entwicklungsumgebung starten unter</s1> + <s2>einmal mit der Maus klicken.</s2> + <s3> 1) Einfach Doppelklicken</s3> + <s4>und warten bis die Entwicklungsumgebung fertig geladen hat.</s4> + <s5> 2) Jetzt 'localhost:3000' in deinem bevorzugten Browser aufrufen.</s5> + <s6>Fertig. Du bist nun bereit, bei CodeCombat mitzuarbeiten!</s6> + </start> +======= +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>Deutsch</native> + <description>German</description> + <tips>Before we start the installation, here are some tips:</tips> + <exit>Press any key to exit...</exit> + </global> + <language> + <choosen>You have choosen Deutsch as your language.</choosen> + <feedback>Ab jetzt senden wir unser Feedback in Deutsch.</feedback> + </language> + <license> + <s1>In order to continue the installation of the developers environment</s1> + <s2>you will have to read and agree with the following license:</s2> + <q1>Have you read the license and do you agree with it?</q1> + <a1>This setup can't happen without an agreement.</a1> + <a2>Installation and Setup of the CodeCombat environment is cancelled.</a2> + </license> + <install> + <system> + <bit>-Bit System erkannt.</bit> + <prefix>Es wurde das Betriebssystem</prefix> + <sufix>erkannt.</sufix> + <xp>Windows XP wird nicht unterstützt. Installation abgebrochen.</xp> + </system> + <process> + <sks>Sind die für CodeCombat benötigten Programme bereits installiert?</sks> + <skq>Wir empfehlen Ihnen, mit „Nein“ zu antorten, falls Sie unsicher sind.</skq> + <skc>Überspringe Installation der Programme...</skc> + <s1>Ohne Software von Drittanbietern könnte CodeCombat nicht entwickelt werden.</s1> + <s2>Aus diesem Grund müssen Sie diese Software installieren,</s2> + <s3>um sich in der Community zu engagieren.</s3> + <s4>Wenn Sie ein Programm bereits installiert haben, brechen Sie die Installation bitte ab.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Haben Sie bereits die aktuellste Version von</prefix> + <sufix>installiert?</sufix> + <downloading>wird heruntergeladen...</downloading> + <installing>wird installiert...</installing> + <unzipping>wird entpackt...</unzipping> + <cleaning>wird aufgeräumt...</cleaning> + <mongodbpath>Bitte geben Sie den kompletten Pfad an, an dem MongoDB installiert werden soll</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>Wie Du bereits weißt, ist CodeCombat Open Source.</opensource> + <online>Unser Quellcode ist komplett auf Github.</online> + <manual>Wenn Du möchtest, kannst du das komplette Git Repository selbst herunterladen und nach deinen wünschen einrichten.</manual> + <norec>Allerdings empfehlen wir, dass du den Prozess statt dessen uns überlässt.</norec> + </intro> + <skip> + <question>Willst du das lokale Git Setup selbst vornehmen?</question> + <consequence>Bit vergewissere dich, dass das Repository korrekt heruntergeladen wurde, bevor du fortfährst.</consequence> + <donotclose>Bitte schließe dieses Fenster nicht.</donotclose> + <wait>Wenn du fertig bist, drücke eine beliebige Taste zum Fortfahren...</wait> + </skip> + <process> + <path>Gebe bitte den kompletten Pfad zu deinem CodeCombat Git Repository ein: </path> + <checkout>Bitte gib den kompletten Pfad ein, an dem du die CodeCombat Umgebung einrichten willst</checkout> + <bashi>Diese Installation benötigt die Git Bash.</bashi> + <bashp64>Die Git Bash ist standardmäßig in 'C:\Program Files (x86)\Git' installiert.</bashp64> + <bashp32>Die Git Bash ist standardmäßig in 'C:\Program Files\Git' installiert.</bashp32> + <bashq>Bitte gebe den kompletten Pfad zur Git Bash ein, oder drücke Enter, um den Standardpfad zu verwenden</bashq> + <ssh>Willst du das Repository via SSH auschecken?</ssh> + </process> + <config> + <intro>You should have forked CodeCombat to your own GitHub Account by now...</intro> + <info>Please enter your github information, to configure your local repository.</info> + <username>Username: </username> + <password>Password: </password> + <process>Thank you... Configuring your local repistory right now...</process> + </config> + </github> + <switch> + <install>The installation of your local environment was succesfull!</install> + <close>You can now close this setup.</close> + <open>After that, you should open the configuration setup to automaticly configure your environment...</open> + </switch> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <database>Downloading the last version of the CodeCombat database...</database> + <script>Preparing the automatic startup script for you...</script> + <close>Don't close!</close> + </npm> + <error> + <path>Dieser Pfad existiert bereits. Willst du ihn wirklich überschreiben?</path> + <exist>Dieser Pfad exisitert nicht. Bitte versuche es erneut...</exist> + </error> + <end> + <succesfull>Die CodeCombat Entwicklungsumgebung wurde erfoglreich installiert.</succesfull> + <thankyou>Vielen Dank für die Unterstützung und bis bald.</thankyou> + <readme>Willst du das README lesen, um weitere Informationen zu erhalten?</readme> + </end> + <start> + <s1>Von nun an kannst du die Entwicklungsumgebung starten unter</s1> + <s2>einmal mit der Maus klicken.</s2> + <s3> 1) Einfach Doppelklicken</s3> + <s4>und warten bis die Entwicklungsumgebung fertig geladen hat.</s4> + <s5> 2) Jetzt 'localhost:3000' in deinem bevorzugten Browser aufrufen.</s5> + <s6>Fertig. Du bist nun bereit, bei CodeCombat mitzuarbeiten!</s6> + </start> +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7:scripts/windows/coco-dev-setup/batch/localization/de.coco +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localisation/en.coco b/scripts/windows/coco-dev-setup/batch/localization/en.coco similarity index 85% rename from scripts/windows/coco-dev-setup/batch/localisation/en.coco rename to scripts/windows/coco-dev-setup/batch/localization/en.coco index 46464bb55..bef7c9ae6 100755 --- a/scripts/windows/coco-dev-setup/batch/localisation/en.coco +++ b/scripts/windows/coco-dev-setup/batch/localization/en.coco @@ -3,8 +3,20 @@ <global> <native>English</native> <description>English</description> - <intro>From now on we'll send our feedback in English!</intro> + <tips>Before we start the installation, here are some tips:</tips> + <exit>Press any key to exit...</exit> </global> + <language> + <choosen>You have choosen English as your language.</choosen> + <feedback>From now on we'll send our feedback in English.</feedback> + </language> + <license> + <s1>In order to continue the installation of the developers environment</s1> + <s2>you will have to read and agree with the following license:</s2> + <q1>Have you read the license and do you agree with it?</q1> + <a1>This setup can't happen without an agreement.</a1> + <a2>Installation and Setup of the CodeCombat environment is cancelled.</a2> + </license> <install> <system> <bit>-bit computer detected.</bit> diff --git a/scripts/windows/coco-dev-setup/batch/localization/languages.coco b/scripts/windows/coco-dev-setup/batch/localization/languages.coco new file mode 100755 index 000000000..2f3e2fe0d --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/languages.coco @@ -0,0 +1,6 @@ +en +ru +nl +de +zh-HANT +zh-HANS \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localization/nl.coco b/scripts/windows/coco-dev-setup/batch/localization/nl.coco new file mode 100755 index 000000000..a969efb31 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/nl.coco @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>Nederlands</native> + <description>Dutch</description> + <tips>Voor we verder gaan met de installatie hier volgen enkele tips:</tips> + <exit>Druk een willekeurige toets in om af te sluiten...</exit> + </global> + <language> + <choosen>Je hebt Nederlands gekozen als jouw taal naar keuze.</choosen> + <feedback>Vanaf nu geven we onze feedback in het Nederlands.</feedback> + </language> + <license> + <s1>Om verder te gaan met de installatie van jouw CodeCombat omgeving</s1> + <s2>moet je de licentieovereenkomst lezen en ermee akkoord gaan.</s2> + <q1>Heb je de licentieovereenkomst gelezen en ga je ermee akkoord?</q1> + <a1>Deze installatie kan niet doorgaan zonder jouw akkoord.</a1> + <a2>De installatie van jouw Developers omgeving is nu geannulleerd.</a2> + </license> + <install> + <system> + <bit>-bit computer gedetecteerd.</bit> + <prefix>Het besturingssysteem</prefix> + <sufix>is gedetecteerd.</sufix> + <xp>Wij ondersteunen Windows XP niet, installatie geannuleerd.</xp> + </system> + <process> + <sks>Heb je alle benodige software al ge�nstalleerd?</sks> + <skq>We raden aan dat je negatief antwoord indien je niet zeker bent.</skq> + <skc>De installatie van software wordt geannuleerd...</skc> + <s1>CodeCombat kon niet worden ontwikkeld zonder third-party software.</s1> + <s2>Dat is waarom je deze software moet installeren,</s2> + <s3>zodat je kan beginnen met het bijdragen tot onze gemeenschap.</s3> + <s4>Annuleer de installatie als je de applicatie al hebt.</s4> + <winpath>Zorg er zeker voor dat je de optie selecteert die de applicatie aan je Windows Path toevoegt, als deze optie beschikbaar is.</winpath> + <prefix>Heb je al de laatste versie van</prefix> + <sufix>ge�nstalleerd?</sufix> + <downloading>is aan het downloaden...</downloading> + <installing>is aan het installeren...</installing> + <unzipping>is aan het uitpakken...</unzipping> + <cleaning>is aan het opkuisen...</cleaning> + <mongodbpath>Geef het volledige pad op waar mongodb mag worden ge�nstalleerd</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat is open-source, zoals je waarschijnlijk wel al weet.</opensource> + <online>Je kunt al onze source code vinden op Github.</online> + <manual>Indien je wil, kan je de Git setup ook manueel doen.</manual> + <norec>Maar wij raden aan dat je ons dit automatisch laat afhandelen.</norec> + </intro> + <skip> + <question>Wil je de lokale Git setup manueel doen?</question> + <consequence>Zorg er zeker voor dat jouw git repository correct is.</consequence> + <donotclose>Sluit dit venster alsjeblieft niet.</donotclose> + <wait>Wanneer je klaar bent, druk dan op eender welke toets om verder te gaan...</wait> + </skip> + <process> + <path>Geef alsjeblieft het volledige pad in van je CodeCombat git repository: </path> + <checkout>Geef alsjeblieft het volledige pad in waar je de CodeCombat ontwikkelingsomgeving wilt installeren</checkout> + <bashi>Deze installatie maakt gebruik van Git Bash.</bashi> + <bashp64>Git bash is normaal gezien ge�nstalleerd in 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash is normaal gezien ge�nstalleerd in 'C:\Program Files\Git'.</bashp32> + <bashq>Geef alsjeblieft het volledige pad op van Git Bash of druk gewoon op enter indien je het pad niet gewijzigd hebt.</bashq> + <ssh>Wil je het git project downloaden via ssh?</ssh> + </process> + <config> + <intro>Je zou nu al een eigen CodeCombat-fork moeten hebben gekoppeld aan jouw GitHub account...</intro> + <info>Geef jou GitHub informatie alstublieft, zodat wij jou lokale repositorie kunnen configureren.</info> + <username>Gebruikersnaam: </username> + <password>Wachtwoord: </password> + <process>Dank u, jouw lokaal project wordt nu geconfigureerd...</process> + </config> + </github> + <switch> + <install>De installatie van jouw lokale omgeving was een succes!</install> + <close>Je kan nu deze setup sluiten.</close> + <open>Nadien, kan je de 'configuration' setup openen om jouw omgeving automatisch te configureren...</open> + </switch> + <npm> + <install>Bezig met het installeren van bower, brunch, nodemon en sendwithus...</install> + <binstall>Bower packages worden ge�nstalleerd...</binstall> + <sass>Sass wordt ge�nstalleerd...</sass> + <npm>Npm wordt ge�nstalleerd...</npm> + <brnch>Brunch wordt gestart...</brnch> + <mongodb>De MongoDB database wordt voor je klaargemaakt...</mongodb> + <database>De laatste versie van de CodeCombat database wordt gedownload...</database> + <script>Het automatische start-script wordt voor je klaargemaakt...</script> + <close>Niet sluiten!</close> + </npm> + <error> + <path>Dat pad bestaat al, ben je zeker dat je het wil overschrijven?</path> + <exist>Dat pad bestaat niet, probeer alsjeblieft opnieuw...</exist> + </error> + <end> + <succesfull>De installatie van de CodeCombat ontwikkelingsomgeving was succesvol.</succesfull> + <thankyou>Alvast bedankt voor al je werk en tot binnenkort.</thankyou> + <readme>Wil je de LEESMIJ lezen voor meer informatie?</readme> + </end> + <start> + <s1>Vanaf nu kan je de ontwikkelingsomgeving opstarten</s1> + <s2>met het gemak van een enkele muisklik.</s2> + <s3> 1) Dubbelklik op</s3> + <s4>en laat de omgeving opstarten.</s4> + <s5> 2) Nu kan je 'localhost:3000' openen in je browser naar voorkeur.</s5> + <s6>Dat is het, je bent nu klaar om te starten met je werk aan CodeCombat.</s6> + </start> +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localization/ru.coco b/scripts/windows/coco-dev-setup/batch/localization/ru.coco new file mode 100644 index 000000000..150391711 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/ru.coco @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>�������</native> + <description>Russian</description> + <tips>Before we start the installation, here are some tips:</tips> + <exit>Press any key to exit...</exit> + </global> + <language> + <choosen>You have choosen ������� as your language.</choosen> + <feedback>C ������� ������� �� ����� �������� �� �������.</feedback> + </language> + <license> + <s1>In order to continue the installation of the developers environment</s1> + <s2>you will have to read and agree with the following license:</s2> + <q1>Have you read the license and do you agree with it?</q1> + <a1>This setup can't happen without an agreement.</a1> + <a2>Installation and Setup of the CodeCombat environment is cancelled.</a2> + </license> + <install> + <system> + <bit>-������ ��������� ���������.</bit> + <prefix>���������� ������������ �������</prefix> + <sufix>.</sufix> + <xp>�� �� ������������ Windows XP, ��������� ��������.</xp> + </system> + <process> + <sks>�� ��� ���������� �� ����������� �����������, ����������� ��� CodeCombat?</sks> + <skq>�� ����������� �������� ������������, ���� �� �� �������.</skq> + <skc>������� ��������� ������������ �����������...</skc> + <s1>CodeCombat �� ��� �� ���� ���������� ��� ���������� ������������ �����������.</s1> + <s2>��� ������ �� ������ ������ ���������� ��� ����������� �����������</s2> + <s3>��� ����, ����� ������ ������� ����� � ���� ����������.</s3> + <s4>�������� ���������, ���� � ��� ��� ���� ����������.</s4> + <winpath>��������� � ������ �����, ������� ��������� ���������� � Windows PATH, ���� ����� ��������.</winpath> + <prefix>� ��� ��� ���� ��������� ������</prefix> + <sufix>?</sufix> + <downloading>�����������...</downloading> + <installing>���������������...</installing> + <unzipping>���������������...</unzipping> + <cleaning>���������...</cleaning> + <mongodbpath>����������, ���������� ������ ����, ���� ������ ���� ���������� MongoDB</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>�������� ��� CodeCombat ������, ��� �� ��� ������.</opensource> + <online>���� ��� �������� ��� ����� ���� ������ ������ � Github.</online> + <manual>�� ������ ������� ������� ��������������� ��������� Git.</manual> + <norec>������ �� �����������, ������ �����, �������� ���������� ���.</norec> + </intro> + <skip> + <question>�� ������ �������� ��������� Local Git ������� ��������������?</question> + <consequence>���������, ��� �� ��������� ��������� ����������� ����� �����������.</consequence> + <donotclose>�� ���������� ��� ����, ����������.</donotclose> + <wait>����� �� ������ ������, ������� ����� ������� ��� �����������...</wait> + </skip> + <process> + <path>����������, ������� ������ ���� �� ������ CodeCombat ����������� git: </path> + <checkout>����������, ������� ������ ����, ���� �� ������ ���������� ����� CodeCombat</checkout> + <bashi>������ ��������� ������� Git Bash.</bashi> + <bashp64>Git bash �� ��������� ���������� � 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash �� ��������� ���������� � 'C:\Program Files\Git'.</bashp32> + <bashq>����������, ������� ������ ����, ���� ���������� git bash ��� ������ ������� Enter, ���� �� ��������� � ����� �� ���������</bashq> + <ssh>�� ������ ��������� ����������� ����� ssh?</ssh> + </process> + <config> + <intro>�� ������ ���� ������� ���� CodeCombat �� ����� �������� GitHub...</intro> + <info>����������, ������� ���� ������ github, ����� ��������� ��������� �����������.</info> + <username>��� ������������: </username> + <password>������: </password> + <process>�������... ��� ��������� ������ ���������� �����������...</process> + </config> + </github> + <switch> + <install>��������� ����� ��������� ����� ������� ���������!</install> + <close>������ �� ������ ������� ������ ����������.</close> + <open>����� ����� �� ������ ������� ���������� �������� ��� �������������� ������������ ����� �����...</open> + </switch> + <npm> + <install>��������� bower, brunch, nodemon � sendwithus...</install> + <binstall>��������� ������� bower...</binstall> + <sass>��������� sass...</sass> + <npm>��������� npm...</npm> + <brnch>������ brunch....</brnch> + <mongodb>��������� ���� ������ MongoDB...</mongodb> + <db>���������� ��������� ������ ���� ������ CodeCombat...</db> + <script>���������� ��������������� ������� ������� ��� ���...</script> + <close>�� ����������!</close> + </npm> + <error> + <path>���� ���� ��� ����������, �� �������, ��� ������ ������������ ���?</path> + <exist>���� ���� �� ����������. ����������, ���������� ��� ���...</exist> + </error> + <end> + <succesfull>��������� ����� ������������ CodeCombat ������� ���������.</succesfull> + <thankyou>������� ������� �� ��� ����� � �� ������ �������.</thankyou> + <readme>�� ������ ��������� README ��� ��������� �������������� ����������?</readme> + </end> + <start> + <s1>� ����� ������� �� ������ ��������� ����� ������������</s1> + <s2>� ������� ������ ����.</s2> + <s3> 1) ������ ��������</s3> + <s4> � ����� ����� �����������.</s4> + <s5> 2) ������ ������ �������� 'localhost:3000' � ����� ������� ��������.</s5> + <s6>��� � ��, ������ �� ������ ���������� � ������ ��� CodeCombat!</s6> + </start> +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/localization/zh-HANS.coco b/scripts/windows/coco-dev-setup/batch/localization/zh-HANS.coco new file mode 100644 index 000000000..febc98c56 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/zh-HANS.coco @@ -0,0 +1,193 @@ +<<<<<<< HEAD:scripts/windows/coco-dev-setup/batch/localisation/zh-HANS.coco +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>简体中文</native> + <intro>目前我们只能用英文给你反馈!</intro> + </global> + <install> + <system> + <bit>-位系统.</bit> + <prefix>操作系统</prefix> + <sufix>被侦测到.</sufix> + <xp>我们不支持 Windows XP, 安装取消.</xp> + </system> + <process> + <sks>你是否已经安装好运行 CodeCombat 所需的所有软件?</sks> + <skq>如果你不确定的话请回答 No.</skq> + <skc>正在跳过此软件的安装...</skc> + <s1>CodeCombat 无法在不使用第三方服务的情况下开发.</s1> + <s2>这就是为什么你需要安装这些软件,</s2> + <s3>为了开始给我们的开源社区做贡献.</s3> + <s4>如果你已经有了这些软件 请取消安装.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>你是否已经安装了最新版本的</prefix> + <sufix>?</sufix> + <downloading>正在下载...</downloading> + <installing>正在安装...</installing> + <unzipping>正在解压...</unzipping> + <cleaning>正在清理...</cleaning> + <mongodbpath>请输入你希望安装 mongodb 的文件夹的全路径<mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat 是开源的.</opensource> + <online>我们的所有源代码都放在了 Github.</online> + <manual>你可以选择自己手工安装 Git.</manual> + <norec>但我们仍然建议让程序自动替你完成.</norec> + </intro> + <skip> + <question>你是否想自己手工安装本地 Git 安装?</question> + <consequence>请确保在开始处理前, 你有正确设置好你的库.</consequence> + <donotclose>请不要关闭此窗口.</donotclose> + <wait>如果你准备好了, 请按任意键继续...</wait> + </skip> + <process> + <path>请输入你 CodeCombat git库的全路径: </path> + <checkout>请输入你想安装 CodeCombat 环境的全路径</checkout> + <bashi>这项安装需要 Git Bash.</bashi> + <bashp64>Git bash 默认安装在 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash 默认安装在 'C:\Program Files\Git'.</bashp32> + <bashq>请输入 git bash 的安装全路径, 如果你安装的是默认路径, 那么直接输入回车即可</bashq> + <ssh>你是否想使用 ssh 来检出(checkout)库(repository)?</ssh> + </process> + </github> + <npm> + <install>正在安装 bower, brunch, nodemon 和 sendwithus...</install> + <binstall>正在用 bower 安装依赖包...</binstall> + <sass>正在安装 sass...</sass> + <npm>正在安装 npm...</npm> + <brnch>正在开启 brunch....</brnch> + <mongodb>正在为你设置 MongoDB 数据库...</mongodb> + <db>正在下载 CodeCombat 数据库的最新版本...</db> + <script>Preparing the automatic startup script for you...</script> + </npm> + <error> + <path>这个路径已经存在, 你想要覆盖它吗?</path> + <exist>这个路径不存在, 请再次尝试...</exist> + </error> + <end> + <succesfull>CodeCombat 开发环境的搭建已成功.</succesfull> + <thankyou>感谢~ 我们会很快再次见面的 :)</thankyou> + <readme>你是否想阅读 README 文件以了解更多信息?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) 双击文件</s3> + <s4> 启动开发环境.</s4> + <s5> 2) 在浏览器里访问 'localhost:3000' </s5> + <s6>好了,你现在可以开始开发 CodeCombat 了!</s6> + </start> +</variables> +======= +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>简体中文</native> + <description>Traditional Chinese</description> + <tips>Before we start the installation, here are some tips:</tips> + <exit>Press any key to exit...</exit> + </global> + <language> + <choosen>You have choosen 简体中文 as your language.</choosen> + <feedback>目前我们只能用英文给你反馈</feedback> + </language> + <license> + <s1>In order to continue the installation of the developers environment</s1> + <s2>you will have to read and agree with the following license:</s2> + <q1>Have you read the license and do you agree with it?</q1> + <a1>This setup can't happen without an agreement.</a1> + <a2>Installation and Setup of the CodeCombat environment is cancelled.</a2> + </license> + <install> + <system> + <bit>-位系统.</bit> + <prefix>操作系统</prefix> + <sufix>被侦测到.</sufix> + <xp>我们不支持 Windows XP, 安装取消.</xp> + </system> + <process> + <sks>你是否已经安装好运行 CodeCombat 所需的所有软件?</sks> + <skq>如果你不确定的话请回答 No.</skq> + <skc>正在跳过此软件的安装...</skc> + <s1>CodeCombat 无法在不使用第三方服务的情况下开发.</s1> + <s2>这就是为什么你需要安装这些软件,</s2> + <s3>为了开始给我们的开源社区做贡献.</s3> + <s4>如果你已经有了这些软件 请取消安装.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>你是否已经安装了最新版本的</prefix> + <sufix>?</sufix> + <downloading>正在下载...</downloading> + <installing>正在安装...</installing> + <unzipping>正在解压...</unzipping> + <cleaning>正在清理...</cleaning> + <mongodbpath>请输入你希望安装 mongodb 的文件夹的全路径</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat 是开源的.</opensource> + <online>我们的所有源代码都放在了 Github.</online> + <manual>你可以选择自己手工安装 Git.</manual> + <norec>但我们仍然建议让程序自动替你完成.</norec> + </intro> + <skip> + <question>你是否想自己手工安装本地 Git 安装?</question> + <consequence>请确保在开始处理前, 你有正确设置好你的库.</consequence> + <donotclose>请不要关闭此窗口.</donotclose> + <wait>如果你准备好了, 请按任意键继续...</wait> + </skip> + <process> + <path>请输入你 CodeCombat git库的全路径: </path> + <checkout>请输入你想安装 CodeCombat 环境的全路径</checkout> + <bashi>这项安装需要 Git Bash.</bashi> + <bashp64>Git bash 默认安装在 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash 默认安装在 'C:\Program Files\Git'.</bashp32> + <bashq>请输入 git bash 的安装全路径, 如果你安装的是默认路径, 那么直接输入回车即可</bashq> + <ssh>你是否想使用 ssh 来检出(checkout)库(repository)?</ssh> + </process> + <config> + <intro>You should have forked CodeCombat to your own GitHub Account by now...</intro> + <info>Please enter your github information, to configure your local repository.</info> + <username>Username: </username> + <password>Password: </password> + <process>Thank you... Configuring your local repistory right now...</process> + </config> + </github> + <switch> + <install>The installation of your local environment was succesfull!</install> + <close>You can now close this setup.</close> + <open>After that, you should open the configuration setup to automaticly configure your environment...</open> + </switch> + <npm> + <install>正在安装 bower, brunch, nodemon 和 sendwithus...</install> + <binstall>正在用 bower 安装依赖包...</binstall> + <sass>正在安装 sass...</sass> + <npm>正在安装 npm...</npm> + <brnch>正在开启 brunch....</brnch> + <mongodb>正在为你设置 MongoDB 数据库...</mongodb> + <db>正在下载 CodeCombat 数据库的最新版本...</db> + <script>Preparing the automatic startup script for you...</script> + <close>Don't close!</close> + </npm> + <error> + <path>这个路径已经存在, 你想要覆盖它吗?</path> + <exist>这个路径不存在, 请再次尝试...</exist> + </error> + <end> + <succesfull>CodeCombat 开发环境的搭建已成功.</succesfull> + <thankyou>感谢~ 我们会很快再次见面的 :)</thankyou> + <readme>你是否想阅读 README 文件以了解更多信息?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) 双击文件</s3> + <s4> 启动开发环境.</s4> + <s5> 2) 在浏览器里访问 'localhost:3000' </s5> + <s6>好了,你现在可以开始开发 CodeCombat 了!</s6> + </start> +</variables> +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7:scripts/windows/coco-dev-setup/batch/localization/zh-HANS.coco diff --git a/scripts/windows/coco-dev-setup/batch/localization/zh-HANT.coco b/scripts/windows/coco-dev-setup/batch/localization/zh-HANT.coco new file mode 100644 index 000000000..b54a269e5 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/localization/zh-HANT.coco @@ -0,0 +1,192 @@ +<<<<<<< HEAD:scripts/windows/coco-dev-setup/batch/localisation/zh-HANT.coco +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>繁体中文</native> + <intro>From now on we'll send our feedback in English!</intro> + </global> + <install> + <system> + <bit>-bit computer detected.</bit> + <prefix>The operating system</prefix> + <sufix>was detected.</sufix> + <xp>We don't support Windows XP, installation cancelled.</xp> + </system> + <process> + <sks>Have you already installed all the software needed for CodeCombat?</sks> + <skq>We recommand that you reply negative in case you're not sure.</skq> + <skc>Skipping the installation of the software...</skc> + <s1>CodeCombat couldn't be developed without third-party software.</s1> + <s2>That's why you'll need to install this software,</s2> + <s3>in order to start contributing to our community.</s3> + <s4>Cancel the installation if you already have the application.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Do you already have the latest version of</prefix> + <sufix>installed?</sufix> + <downloading>is downloading...</downloading> + <installing>is installing...</installing> + <unzipping>is unzipping...</unzipping> + <cleaning>is cleaning...</cleaning> + <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat is opensource, like you already know.</opensource> + <online>All our sourcecode can be found online at Github.</online> + <manual>You can choose to do the entire Git setup yourself.</manual> + <norec>However we recommend that you instead let us handle it instead.</norec> + </intro> + <skip> + <question>Do you want to do the Local Git setup manually yourself?</question> + <consequence>Make sure you have correctly setup your repository before processing.</consequence> + <donotclose>Do not close this window please.</donotclose> + <wait>When you're ready, press any key to continue...</wait> + </skip> + <process> + <path>Please give the full path of your CodeCombat git repository: </path> + <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> + <bashi>This installation requires Git Bash.</bashi> + <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> + <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> + <ssh>Do you want to checkout the repository via ssh?</ssh> + </process> + </github> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <db>Downloading the last version of the CodeCombat database...</db> + <script>Preparing the automatic startup script for you...</script> + </npm> + <error> + <path>That path already exists, are you sure you want to overwrite it?</path> + <exist>That path doesn't exist. Please try again...</exist> + </error> + <end> + <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> + <thankyou>Thank you already for your contribution and see you soon.</thankyou> + <readme>Do you want to read the README for more information?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) Just double click</s3> + <s4> and let the environment start up.</s4> + <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> + <s6>That's it, you're now ready to start working on CodeCombat!</s6> + </start> +======= +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>繁体中文</native> + <description>Simplified Chinese</description> + <tips>Before we start the installation, here are some tips:</tips> + <exit>Press any key to exit...</exit> + </global> + <language> + <choosen>You have choosen 繁体中文 as your language.</choosen> + <feedback>From now on we'll send our feedback in 繁体中文.</feedback> + </language> + <license> + <s1>In order to continue the installation of the developers environment</s1> + <s2>you will have to read and agree with the following license:</s2> + <q1>Have you read the license and do you agree with it?</q1> + <a1>This setup can't happen without an agreement.</a1> + <a2>Installation and Setup of the CodeCombat environment is cancelled.</a2> + </license> + <install> + <system> + <bit>-bit computer detected.</bit> + <prefix>The operating system</prefix> + <sufix>was detected.</sufix> + <xp>We don't support Windows XP, installation cancelled.</xp> + </system> + <process> + <sks>Have you already installed all the software needed for CodeCombat?</sks> + <skq>We recommand that you reply negative in case you're not sure.</skq> + <skc>Skipping the installation of the software...</skc> + <s1>CodeCombat couldn't be developed without third-party software.</s1> + <s2>That's why you'll need to install this software,</s2> + <s3>in order to start contributing to our community.</s3> + <s4>Cancel the installation if you already have the application.</s4> + <winpath>Make sure to select the option that adds the application to your Windows Path, if the option is available.</winpath> + <prefix>Do you already have the latest version of</prefix> + <sufix>installed?</sufix> + <downloading>is downloading...</downloading> + <installing>is installing...</installing> + <unzipping>is unzipping...</unzipping> + <cleaning>is cleaning...</cleaning> + <mongodbpath>Please define the full path where mongodb should be installed</mongodbpath> + </process> + </install> + <github> + <intro> + <opensource>CodeCombat is opensource, like you already know.</opensource> + <online>All our sourcecode can be found online at Github.</online> + <manual>You can choose to do the entire Git setup yourself.</manual> + <norec>However we recommend that you instead let us handle it instead.</norec> + </intro> + <skip> + <question>Do you want to do the Local Git setup manually yourself?</question> + <consequence>Make sure you have correctly setup your repository before processing.</consequence> + <donotclose>Do not close this window please.</donotclose> + <wait>When you're ready, press any key to continue...</wait> + </skip> + <process> + <path>Please give the full path of your CodeCombat git repository: </path> + <checkout>Please enter the full path where you want to install your CodeCombat environment</checkout> + <bashi>This installation requires Git Bash.</bashi> + <bashp64>Git bash is by default installed at 'C:\Program Files (x86)\Git'.</bashp64> + <bashp32>Git bash is by default installed at 'C:\Program Files\Git'.</bashp32> + <bashq>Please enter the full path where git bash is installed or just press enter if it's in the default location</bashq> + <ssh>Do you want to checkout the repository via ssh?</ssh> + </process> + <config> + <intro>You should have forked CodeCombat to your own GitHub Account by now...</intro> + <info>Please enter your github information, to configure your local repository.</info> + <username>Username: </username> + <password>Password: </password> + <process>Thank you... Configuring your local repistory right now...</process> + </config> + </github> + <switch> + <install>The installation of your local environment was succesfull!</install> + <close>You can now close this setup.</close> + <open>After that, you should open the configuration setup to automaticly configure your environment...</open> + </switch> + <npm> + <install>Installing bower, brunch, nodemon and sendwithus...</install> + <binstall>Installing bower packages...</binstall> + <sass>Installing sass...</sass> + <npm>Installing npm...</npm> + <brnch>Starting brunch....</brnch> + <mongodb>Setting up a MongoDB database for you...</mongodb> + <db>Downloading the last version of the CodeCombat database...</db> + <script>Preparing the automatic startup script for you...</script> + <close>Don't close!</close> + </npm> + <error> + <path>That path already exists, are you sure you want to overwrite it?</path> + <exist>That path doesn't exist. Please try again...</exist> + </error> + <end> + <succesfull>The setup of the CodeCombat Dev. Environment was succesfull.</succesfull> + <thankyou>Thank you already for your contribution and see you soon.</thankyou> + <readme>Do you want to read the README for more information?</readme> + </end> + <start> + <s1>From now on you can start the dev. environment at</s1> + <s2>the touch of a single mouse click.</s2> + <s3> 1) Just double click</s3> + <s4> and let the environment start up.</s4> + <s5> 2) Now just open 'localhost:3000' in your prefered browser.</s5> + <s6>That's it, you're now ready to start working on CodeCombat!</s6> + </start> +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7:scripts/windows/coco-dev-setup/batch/localization/zh-HANT.coco +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/ask_question.bat b/scripts/windows/coco-dev-setup/batch/scripts/ask_question.bat old mode 100755 new mode 100644 index fe7ffdd8c..6633ba71d --- a/scripts/windows/coco-dev-setup/batch/scripts/ask_question.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/ask_question.bat @@ -1,5 +1,5 @@ -set /p res="%1 [Y/N]: " -set "result=unset" -if "%res%"=="Y" (set "result=true") -if "%res%"=="y" (set "result=true") +set /p res="%1 [Y/N]: " +set "result=unset" +if "%res%"=="Y" (set "result=true") +if "%res%"=="y" (set "result=true") if "%result%"=="unset" (set "result=false") \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_app.bat b/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_app.bat old mode 100755 new mode 100644 index 3408a13e6..760b40889 --- a/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_app.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_app.bat @@ -1,71 +1,141 @@ -set "temp_directory=c:\.coco\" -set "curl_app=..\utilities\curl.exe" -set "zu_app=..\utilities\7za.exe" - -if NOT exist "%temp_directory%" ( - md %temp_directory% -) - -call get_local_text install_process_prefix install process prefix -call get_local_text install_process_sufix install process sufix - -call ask_question "!install_process_prefix! %1 !install_process_sufix!" - -if "%result%"=="true" ( - goto:exit_installation -) - -call print_dashed_seperator - -call get_extension %2 download_extension -call get_local_text install_process_downloading install process downloading -echo %1 !install_process_downloading! -set "install_file=!temp_directory!%1.!download_extension!" -start /wait cmd.exe /c "TITLE %1 !install_process_downloading! && %curl_app% -k -m 10800 --retry 100 -o !install_file! %2" - -if "%download_extension%"=="zip" ( - set "package_path=!temp_directory!%1\" - - %zu_app% x !install_file! -o!package_path! -y - - for /f "delims=" %%a in ('dir !package_path! /on /ad /b') do @set mongodb_original_directory=%%a - - call print_dashed_seperator - goto:get_mongodb_path - - :get_mongodb_path - call get_local_text install_process_mongodbpath install process mongodbpath - set /p "mongodb_path=!install_process_mongodbpath!: " - if exist "%mongodb_path%" ( - call get_local_text error_path error path - call ask_question "!error_path!" - if "!result!"=="false" ( - call print_dashed_seperator - goto:get_mongodb_path - ) else ( - rmdir /s /q %mongodb_path% - ) - ) - md %mongodb_path% - - %systemroot%\System32\xcopy !package_path!!mongodb_original_directory! !mongodb_path! /r /h /s /e /y - - call set_environment_var "!mongodb_path!\bin" - - goto:clean_up -) - -call get_local_text install_process_installing install process installing -echo %1 !install_process_installing! -echo. -start /WAIT !install_file! -goto:clean_up - -:clean_up - call get_local_text install_process_cleaning install process cleaning - echo %1 !install_process_cleaning! - rmdir /s /q "!temp_directory!" - goto:exit_installation - -:exit_installation +<<<<<<< HEAD +set "temp_directory=c:\.coco\" +set "curl_app=..\utilities\curl.exe" +set "zu_app=..\utilities\7za.exe" + +if NOT exist "%temp_directory%" ( + md %temp_directory% +) + +call get_local_text install_process_prefix install process prefix +call get_local_text install_process_sufix install process sufix + +call ask_question "!install_process_prefix! %1 !install_process_sufix!" + +if "%result%"=="true" ( + goto:exit_installation +) + +call print_dashed_seperator + +call get_extension %2 download_extension +call get_local_text install_process_downloading install process downloading +echo %1 !install_process_downloading! +set "install_file=!temp_directory!%1.!download_extension!" +%curl_app% -k %2 -o !install_file! + +if "%download_extension%"=="zip" ( + set "package_path=!temp_directory!%1\" + + %zu_app% x !install_file! -o!package_path! -y + + for /f "delims=" %%a in ('dir !package_path! /on /ad /b') do @set mongodb_original_directory=%%a + + call print_dashed_seperator + goto:get_mongodb_path + + :get_mongodb_path + call get_local_text install_process_mongodbpath install process mongodbpath + set /p "mongodb_path=!install_process_mongodbpath!: " + if exist "%mongodb_path%" ( + call get_local_text error_path error path + call ask_question "!error_path!" + if "!result!"=="false" ( + call print_dashed_seperator + goto:get_mongodb_path + ) else ( + rmdir /s /q %mongodb_path% + ) + ) + md %mongodb_path% + + %systemroot%\System32\xcopy !package_path!!mongodb_original_directory! !mongodb_path! /r /h /s /e /y + goto:clean_up +) + +call get_local_text install_process_installing install process installing +echo %1 !install_process_installing! +echo. +start /WAIT !install_file! +goto:clean_up + +:clean_up + call get_local_text install_process_cleaning install process cleaning + echo %1 !install_process_cleaning! + rmdir /s /q "!temp_directory!" + goto:exit_installation + +:exit_installation +======= +set "temp_directory=c:\.coco\" +set "curl_app=..\utilities\curl.exe" +set "zu_app=..\utilities\7za.exe" + +if NOT exist "%temp_directory%" ( + md %temp_directory% +) + +call get_local_text install_process_prefix install process prefix +call get_local_text install_process_sufix install process sufix + +call ask_question "!install_process_prefix! %1 !install_process_sufix!" + +if "%result%"=="true" ( + goto:exit_installation +) + +call print_dashed_seperator + +call get_extension %2 download_extension +call get_local_text install_process_downloading install process downloading +echo %1 !install_process_downloading! +set "install_file=!temp_directory!%1.!download_extension!" +start /wait cmd.exe /c "TITLE %1 !install_process_downloading! && %curl_app% -k -m 10800 --retry 100 -o !install_file! %2" + +if "%download_extension%"=="zip" ( + set "package_path=!temp_directory!%1\" + + %zu_app% x !install_file! -o!package_path! -y + + for /f "delims=" %%a in ('dir !package_path! /on /ad /b') do @set mongodb_original_directory=%%a + + call print_dashed_seperator + goto:get_mongodb_path + + :get_mongodb_path + call get_local_text install_process_mongodbpath install process mongodbpath + set /p "mongodb_path=!install_process_mongodbpath!: " + if exist "%mongodb_path%" ( + call get_local_text error_path error path + call ask_question "!error_path!" + if "!result!"=="false" ( + call print_dashed_seperator + goto:get_mongodb_path + ) else ( + rmdir /s /q %mongodb_path% + ) + ) + md %mongodb_path% + + %systemroot%\System32\xcopy !package_path!!mongodb_original_directory! !mongodb_path! /r /h /s /e /y + + call set_environment_var "!mongodb_path!\bin" + + goto:clean_up +) + +call get_local_text install_process_installing install process installing +echo %1 !install_process_installing! +echo. +start /WAIT !install_file! +goto:clean_up + +:clean_up + call get_local_text install_process_cleaning install process cleaning + echo %1 !install_process_cleaning! + rmdir /s /q "!temp_directory!" + goto:exit_installation + +:exit_installation +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 call print_dashed_seperator \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_applications.bat b/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_applications.bat old mode 100755 new mode 100644 index 3c5f798fd..78974d4b2 --- a/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_applications.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/download_and_install_applications.bat @@ -1,53 +1,109 @@ -call print_install_header -call print_dashed_seperator - -call get_local_text install_process_sks install process sks -echo !install_process_sks! - -call get_local_text install_process_skq install process skq -call ask_question "!install_process_skq!" - -call print_dashed_seperator - -if "%result%"=="true" ( - call get_local_text install_process_skc install process skc - echo !install_process_skc! - call print_dashed_seperator - goto:exit_setup -) - -call get_system_information -call print_dashed_seperator - -if %system_info_os% == XP ( - call get_local_text install_system_xp install system xp - echo !install_system_xp! - call print_exit -) - -call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 0 general general -call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 2 %system_info_os% b%system_info_bit% -call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 3 general b%system_info_bit% - -call get_local_text install_process_s1 install process s1 -call get_local_text install_process_s2 install process s2 -call get_local_text install_process_s3 install process s3 -call get_local_text install_process_s4 install process s4 -call get_local_text install_process_winpath install process winpath - -echo !install_process_s1! -echo !install_process_s2! -echo !install_process_s3! -echo !install_process_s4! -echo. -echo !install_process_winpath! - -call print_dashed_seperator - -for /l %%i in (1, 1, !downloads_count!) do ( - call download_and_install_app !download_names[%%i]! !downloads[%%i]! -) - -goto:exit_setup - +<<<<<<< HEAD +call print_install_header +call print_dashed_seperator + +call get_local_text install_process_sks install process sks +echo !install_process_sks! + +call get_local_text install_process_skq install process skq +call ask_question "!install_process_skq!" + +call print_dashed_seperator + +if "%result%"=="true" ( + call get_local_text install_process_skc install process skc + echo !install_process_skc! + call print_dashed_seperator + goto:exit_setup +) + +call get_system_information +call print_dashed_seperator + +if %system_info_os% == XP ( + call get_local_text install_system_xp install system xp + echo !install_system_xp! + call print_exit +) + +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 0 general general +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 2 %system_info_os% b%system_info_bit% +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 3 general b%system_info_bit% + +call get_local_text install_process_s1 install process s1 +call get_local_text install_process_s2 install process s2 +call get_local_text install_process_s3 install process s3 +call get_local_text install_process_s4 install process s4 +call get_local_text install_process_winpath install process winpath + +echo !install_process_s1! +echo !install_process_s2! +echo !install_process_s3! +echo !install_process_s4! +echo. +echo !install_process_winpath! + +call print_dashed_seperator + +for /l %%i in (1, 1, !downloads_count!) do ( + call download_and_install_app !download_names[%%i]! !downloads[%%i]! +) + +goto:exit_setup + +======= +call print_install_header +call print_dashed_seperator + +call get_local_text install_process_sks install process sks +echo !install_process_sks! + +call get_local_text install_process_skq install process skq +call ask_question "!install_process_skq!" + +call print_dashed_seperator + +if "%result%"=="true" ( + call get_local_text install_process_skc install process skc + echo !install_process_skc! + call print_dashed_seperator + goto:exit_setup +) + +call get_system_information +call print_dashed_seperator + +if %system_info_os% == XP ( + call get_local_text install_system_xp install system xp + echo !install_system_xp! + call print_exit +) + +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 0 general general +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 2 %system_info_os% b%system_info_bit% +call get_variables ..\\config\\downloads.coco downloads download_names downloads_count 3 general b%system_info_bit% + +call get_local_text install_process_s1 install process s1 +call get_local_text install_process_s2 install process s2 +call get_local_text install_process_s3 install process s3 +call get_local_text install_process_s4 install process s4 +call get_local_text install_process_winpath install process winpath + +echo !install_process_s1! +echo !install_process_s2! +echo !install_process_s3! +echo. +echo !install_process_s4! +echo. +echo !install_process_winpath! + +call print_dashed_seperator + +for /l %%i in (1, 1, !downloads_count!) do ( + call download_and_install_app !download_names[%%i]! !downloads[%%i]! +) + +goto:exit_setup + +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 :exit_setup \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_array.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_array.bat old mode 100755 new mode 100644 index a699365ad..a11f2375e --- a/scripts/windows/coco-dev-setup/batch/scripts/get_array.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_array.bat @@ -1,6 +1,6 @@ -set "file=%1" -set /a %3=0 -for /F "usebackq delims=" %%a in ("%file%") do ( - set /A %3+=1 - call set %2[%%%3%%]=%%a +set "file=%1" +set /a %3=0 +for /F "usebackq delims=" %%a in ("%file%") do ( + set /A %3+=1 + call set %2[%%%3%%]=%%a ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_config.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_config.bat old mode 100755 new mode 100644 index 21c975aaf..c335263d6 --- a/scripts/windows/coco-dev-setup/batch/scripts/get_config.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_config.bat @@ -1,3 +1,3 @@ -for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\config\\config.coco %1') do ( - set "%1=%%F" +for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\config\\config.coco %1') do ( + set "%1=%%F" ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_download.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_download.bat old mode 100755 new mode 100644 index 2f884b366..1b81e6a0c --- a/scripts/windows/coco-dev-setup/batch/scripts/get_download.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_download.bat @@ -1,3 +1,3 @@ -for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\config\\downloads.coco %2 %3 %4 %5') do ( - set "%1=%%F" +for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\config\\downloads.coco %2 %3 %4 %5') do ( + set "%1=%%F" ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_extension.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_extension.bat old mode 100755 new mode 100644 index bbcd05b5e..71b381ebb --- a/scripts/windows/coco-dev-setup/batch/scripts/get_extension.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_extension.bat @@ -1,3 +1,3 @@ -for /F "delims=" %%F in ('call run_script .\\get_extension.ps1 %1') do ( - set "%2=%%F" +for /F "delims=" %%F in ('call run_script .\\get_extension.ps1 %1') do ( + set "%2=%%F" ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_extension.ps1 b/scripts/windows/coco-dev-setup/batch/scripts/get_extension.ps1 old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_language.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_language.bat old mode 100755 new mode 100644 index fa66aafc8..99e4851af --- a/scripts/windows/coco-dev-setup/batch/scripts/get_language.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_language.bat @@ -1,36 +1,77 @@ -echo Some feedback is sent in your system's language -echo but most feedback is sent and localised by us. -echo Here is a list of languages: -call print_dashed_seperator - -call get_array ..\\localisation\\languages.coco languages language_count -for /l %%i in (1,1,%language_count%) do ( - call get_text !languages[%%i]! global_description global description - echo [%%i] !global_description! -) - -goto:get_localisation_id - -:get_localisation_id - call print_dashed_seperator - set /p "localisation_id=Enter the language ID of your preference and press <ENTER>: " - goto:validation_check - -:validation_check - set "localisation_is_false=" - set /a local_id = %localisation_id% - if !local_id! EQU 0 set localisation_is_false=1 - if !local_id! LSS 1 set localisation_is_false=1 - if !local_id! GTR !language_count! set localisation_is_false=1 - if defined localisation_is_false ( - echo The id you entered is invalid, please try again... - goto:get_localisation_id - ) else ( - set language_id=!languages[%local_id%]! - call get_text !language_id! global_native global native - call print_dashed_seperator - echo You have choosen !global_native! as your language. - call get_text !language_id! global_intro global intro - echo !global_intro! - call print_seperator +<<<<<<< HEAD +echo Some feedback is sent in your system's language +echo but most feedback is sent and localised by us. +echo Here is a list of languages: +call print_dashed_seperator + +call get_array ..\\localisation\\languages.coco languages language_count +for /l %%i in (1,1,%language_count%) do ( + call get_text !languages[%%i]! global_native global native + echo [%%i] !global_native! +) + +goto:get_localisation_id + +:get_localisation_id + call print_dashed_seperator + set /p "localisation_id=Enter the language ID of your preference and press <ENTER>: " + goto:validation_check + +:validation_check + set "localisation_is_false=" + set /a local_id = %localisation_id% + if !local_id! EQU 0 set localisation_is_false=1 + if !local_id! LSS 1 set localisation_is_false=1 + if !local_id! GTR !language_count! set localisation_is_false=1 + if defined localisation_is_false ( + echo The id you entered is invalid, please try again... + goto:get_localisation_id + ) else ( + set language_id=!languages[%local_id%]! + call get_text !language_id! global_native global native + call print_dashed_seperator + echo You have choosen !global_native! as your language. + call get_text !language_id! global_intro global intro + echo !global_intro! + call print_seperator +======= +echo Some feedback is sent in your system's language +echo but most feedback is sent and localised by us. +echo Here is a list of languages: +call print_dashed_seperator + +call get_array ..\\localization\\languages.coco languages language_count +for /l %%i in (1,1,%language_count%) do ( + call get_text !languages[%%i]! global_description global description + echo [%%i] !global_description! +) + +goto:get_localization_id + +:get_localization_id + call print_dashed_seperator + set /p "localization_id=Enter the language ID of your preference and press <ENTER>: " + goto:validation_check + +:validation_check + set "localization_is_false=" + set /a local_id = %localization_id% + if !local_id! EQU 0 set localization_is_false=1 + if !local_id! LSS 1 set localization_is_false=1 + if !local_id! GTR !language_count! set localization_is_false=1 + if defined localization_is_false ( + echo The id you entered is invalid, please try again... + goto:get_localization_id + ) else ( + set language_id=!languages[%local_id%]! + call print_dashed_seperator + + call get_local_text language_choosen language choosen + echo !language_choosen! + + call get_local_text language_feedback language feedback + echo !language_feedback! + + call print_seperator +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_local_text.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_local_text.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_path_safe.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_path_safe.bat old mode 100755 new mode 100644 index 8e2560551..c76707670 --- a/scripts/windows/coco-dev-setup/batch/scripts/get_path_safe.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_path_safe.bat @@ -1,10 +1,10 @@ -goto:get_safe_path - -:get_safe_path - set /p "tmp_safe_path=%1" - if not exist "%tmp_safe_path%" ( - call get_local_text error-exist - echo !error_exist! - call print_dashed_seperator - goto:get_safe_path +goto:get_safe_path + +:get_safe_path + set /p "tmp_safe_path=%1" + if not exist "%tmp_safe_path%" ( + call get_local_text error-exist + echo !error_exist! + call print_dashed_seperator + goto:get_safe_path ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_system_information.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_system_information.bat old mode 100755 new mode 100644 index 908399932..ee68e3274 --- a/scripts/windows/coco-dev-setup/batch/scripts/get_system_information.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_system_information.bat @@ -1,31 +1,63 @@ -if exist "%PROGRAMFILES(X86)%" ( - call:set_bit 64 -) else ( - call:set_bit 32 -) - -for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j -if "%version%" == "5.2" ( call:set_os XP ) -if "%version%" == "6.0" ( call:set_os Vista ) -if "%version%" == "6.1" ( call:set_os Win7 ) -:: we handle win8.0 as win7 -if "%version%" == "6.2" ( call:set_os Win7 ) -:: we handle win8.1 as win7 -if "%version%" == "6.3" ( call:set_os Win7 ) - -goto:end - -:set_bit - call get_local_text install_system_bit install system bit - set system_info_bit=%~1 - echo %system_info_bit%%install_system_bit% -goto:eof - -:set_os - set system_info_os=%~1 - call get_local_text install_system_prefix install system prefix - call get_local_text install_system_sufix install system sufix - echo %install_system_prefix% %system_info_os% %install_system_sufix% -goto:eof - -:end +<<<<<<< HEAD +if exist "%PROGRAMFILES(X86)%" ( + call:set_bit 64 +) else ( + call:set_bit 32 +) + +for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j +if "%version%" == "5.2" ( call:set_os XP ) +if "%version%" == "6.0" ( call:set_os Vista ) +if "%version%" == "6.1" ( call:set_os Win7 ) +:: we handle win8.0 as win7 +if "%version%" == "6.2" ( call:set_os Win7 ) +:: we handle win8.1 as win7 +if "%version%" == "6.3" ( call:set_os Win7 ) + +goto:end + +:set_bit + call get_local_text install_system_bit install system bit + set system_info_bit=%~1 + echo %system_info_bit%%install_system_bit% +goto:eof + +:set_os + set system_info_os=%~1 + call get_local_text install_system_prefix install system prefix + call get_local_text install_system_sufix install system sufix + echo %install_system_prefix% %system_info_os% %install_system_sufix% +goto:eof + +:end +======= +if exist "%PROGRAMFILES(X86)%" ( + call:set_bit 64 +) else ( + call:set_bit 32 +) + +for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j +if "%version%" == "5.2" ( call:set_os XP ) +if "%version%" == "6.0" ( call:set_os Vista ) +if "%version%" == "6.1" ( call:set_os Win7 ) +if "%version%" == "6.2" ( call:set_os Win8 ) +if "%version%" == "6.3" ( call:set_os Win8 ) + +goto:end + +:set_bit + call get_local_text install_system_bit install system bit + set system_info_bit=%~1 + echo %system_info_bit%%install_system_bit% +goto:eof + +:set_os + set system_info_os=%~1 + call get_local_text install_system_prefix install system prefix + call get_local_text install_system_sufix install system sufix + echo %install_system_prefix% %system_info_os% %install_system_sufix% +goto:eof + +:end +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_text.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_text.bat old mode 100755 new mode 100644 index aacdf94f2..c36bd06fb --- a/scripts/windows/coco-dev-setup/batch/scripts/get_text.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_text.bat @@ -1,3 +1,8 @@ -for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\localisation\\%1.coco %3 %4 %5 %6') do ( - set "%2=%%F" +<<<<<<< HEAD +for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\localisation\\%1.coco %3 %4 %5 %6') do ( + set "%2=%%F" +======= +for /F "delims=" %%F in ('call run_script .\\get_var.ps1 ..\\localization\\%1.coco %3 %4 %5 %6') do ( + set "%2=%%F" +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_var.ps1 b/scripts/windows/coco-dev-setup/batch/scripts/get_var.ps1 old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_variables.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_variables.bat old mode 100755 new mode 100644 index a53805fac..f46c187bc --- a/scripts/windows/coco-dev-setup/batch/scripts/get_variables.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_variables.bat @@ -1,4 +1,4 @@ -set count=0 -for /F "delims=" %%F in ('call run_script.bat .\\get_variables.ps1 %*') do ( - %%F +set count=0 +for /F "delims=" %%F in ('call run_script.bat .\\get_variables.ps1 %*') do ( + %%F ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_variables.ps1 b/scripts/windows/coco-dev-setup/batch/scripts/get_variables.ps1 old mode 100755 new mode 100644 index 6d94b4324..38fa11b7c --- a/scripts/windows/coco-dev-setup/batch/scripts/get_variables.ps1 +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_variables.ps1 @@ -1,33 +1,33 @@ -$xml_file = [xml](get-content $args[0]) -$arr_value = $args[1] -$arr_name = $args[2] -$arr_counter = $args[3] -$counter = $args[4] - -if($args.count -eq 6) -{ - $root = $xml_file.variables.($args[5]) -} -elseif($args.count -eq 7) -{ - $root = $xml_file.variables.($args[5]).($args[6]) -} -elseif($args.count -eq 8) -{ - $root = $xml_file.variables.($args[5]).($args[6]).($args[7]) -} -elseif($args.count -eq 9) -{ - $nodes = $xml_file.variables.($args[5]).($args[6]).($args[7]).($args[8]) -} - -foreach ($node in $root.ChildNodes) -{ - $counter += 1 - $value = $node.InnerText - $name = $node.Name - Write-Host set "$arr_value[$counter]=$value" - Write-Host set "$arr_name[$counter]=$name" -} - +$xml_file = [xml](get-content $args[0]) +$arr_value = $args[1] +$arr_name = $args[2] +$arr_counter = $args[3] +$counter = $args[4] + +if($args.count -eq 6) +{ + $root = $xml_file.variables.($args[5]) +} +elseif($args.count -eq 7) +{ + $root = $xml_file.variables.($args[5]).($args[6]) +} +elseif($args.count -eq 8) +{ + $root = $xml_file.variables.($args[5]).($args[6]).($args[7]) +} +elseif($args.count -eq 9) +{ + $nodes = $xml_file.variables.($args[5]).($args[6]).($args[7]).($args[8]) +} + +foreach ($node in $root.ChildNodes) +{ + $counter += 1 + $value = $node.InnerText + $name = $node.Name + Write-Host set "$arr_value[$counter]=$value" + Write-Host set "$arr_name[$counter]=$name" +} + Write-Host set "$arr_counter=$counter" \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/github_setup.bat b/scripts/windows/coco-dev-setup/batch/scripts/github_setup.bat old mode 100755 new mode 100644 index 6436aacb0..2bdf32529 --- a/scripts/windows/coco-dev-setup/batch/scripts/github_setup.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/github_setup.bat @@ -1,149 +1,266 @@ -call print_github_header -call print_dashed_seperator - -call get_local_text github_intro_opensource github intro opensource -call get_local_text github_intro_online github intro online -call get_local_text github_intro_manual github intro manual -call get_local_text github_intro_norec github intro norec - -echo !github_intro_opensource! -echo !github_intro_online! -echo !github_intro_manual! -echo !github_intro_norec! - -call print_dashed_seperator - -call get_local_text github_skip_question github skip question -call ask_question "!github_skip_question!" -call print_dashed_seperator - -if "%result%"=="true" ( - call get_local_text github_skip_consequence github skip consequence - echo !github_skip_consequence! - - call get_local_text github_skip_donotclose github skip donotclose - echo !github_skip_donotclose! - - call get_local_text github_skip_wait github skip wait - set /p "github_skip_wait=!github_skip_wait!" - - call print_dashed_seperator - - call get_local_text github_process_path github process path - call get_path_safe "!github_process_path!" - set "repository_path=!tmp_safe_path!" - - goto:exit_git_setup -) - -goto:get_bash_path - -:get_bash_path - call get_local_text github_process_bashi github process bashi - echo !github_process_bashi! - - if not defined install_system_bit ( - call print_dashed_seperator - call get_system_information - call print_dashed_seperator - ) - - if "%system_info_bit%"=="64" ( - call get_local_text github_process_bashp64 github process bashp64 - echo !github_process_bashp64! - ) else ( - call get_local_text github_process_bashp32 github process bashp32 - echo !github_process_bashp32! - ) - - call get_local_text github_process_bashq github process bashq - set /p "git_bash_path=!github_process_bashq!: " - - if not defined git_bash_path ( - if "%system_info_bit%"=="64" ( - set "git_bash_path=C:\Program Files (x86)\Git" - ) else ( - set "git_bash_path=C:\Program Files\Git" - ) - goto:get_git_path - ) - - if not exist "%git_bash_path%" ( - call get_local_text error_exist error exist - echo !error_exist! - call print_dashed_seperator - goto:get_bash_path - ) else ( - goto:get_git_path - ) -goto:eof - -:get_git_path - call print_dashed_seperator - call get_local_text github_process_checkout github process checkout - set /p "repository_path=!github_process_checkout!: " - if exist !repository_path! ( - call get_local_text error_path error path - call ask_question "!error_path!" - if "!result!"=="false" ( - call print_dashed_seperator - goto:get_git_path - ) else ( - rmdir /s /q %repository_path% - goto:git_checkout - ) - ) else ( - goto:git_checkout - ) -goto:eof - -:git_checkout - md "%repository_path%" - set "repository_path=%repository_path%" - - call print_dashed_seperator - set "git_app_path=%git_bash_path%\bin\git.exe" - - call get_config github_url - "%git_app_path%" clone "!github_url!" "%repository_path%\coco" - - goto:git_configuration -goto:eof - -:git_configuration - call print_dashed_seperator - - call get_local_text github_config_intro github config intro - echo !github_config_intro! - - call get_local_text github_config_info github config info - echo !github_config_info! - - call print_dashed_seperator - - call get_local_text github_config_username github config username - set /p "git_username=!github_config_username!" - - call get_local_text github_config_password github config password - - set /p "git_password=!github_config_password!" - - call print_dashed_seperator - - call get_local_text github_config_process github config process - echo !github_config_process! - - set cur_dir=%CD% - cd !repository_path!\coco - - "%git_app_path%" remote rm origin - "%git_app_path%" remote add origin https://!git_username!:!git_password!@github.com/!git_username!/codecombat.git - - cd !cur_dir! - - goto:exit_git_setup -goto:eof - -:exit_git_setup - call print_dashed_seperator +<<<<<<< HEAD +call print_github_header +call print_dashed_seperator + +call get_local_text github_intro_opensource github intro opensource +call get_local_text github_intro_online github intro online +call get_local_text github_intro_manual github intro manual +call get_local_text github_intro_norec github intro norec + +echo !github_intro_opensource! +echo !github_intro_online! +echo !github_intro_manual! +echo !github_intro_norec! + +call print_dashed_seperator + +call get_local_text github_skip_question github skip question +call ask_question "!github_skip_question!" +call print_dashed_seperator + +if "%result%"=="true" ( + call get_local_text github_skip_consequence github skip consequence + echo !github_skip_consequence! + + call get_local_text github_skip_donotclose github skip donotclose + echo !github_skip_donotclose! + + call get_local_text github_skip_wait github skip wait + set /p "github_skip_wait=!github_skip_wait!" + + call print_dashed_seperator + + call get_local_text github_process_path github process path + call get_path_safe "!github_process_path!" + set "repository_path=!tmp_safe_path!" + + goto:exit_git_setup +) + +goto:get_bash_path + +:get_bash_path + call get_local_text github_process_bashi github process bashi + echo !github_process_bashi! + + if not defined install_system_bit ( + call print_dashed_seperator + call get_system_information + call print_dashed_seperator + ) + + if "%system_info_bit%"=="64" ( + call get_local_text github_process_bashp64 github process bashp64 + echo !github_process_bashp64! + ) else ( + call get_local_text github_process_bashp32 github process bashp32 + echo !github_process_bashp32! + ) + + call get_local_text github_process_bashq github process bashq + set /p "git_bash_path=!github_process_bashq!: " + + if not defined git_bash_path ( + if "%system_info_bit%"=="64" ( + set "git_bash_path=C:\Program Files (x86)\Git" + ) else ( + set "git_bash_path=C:\Program Files\Git" + ) + goto:get_git_path + ) + + if not exist "%git_bash_path%" ( + call get_local_text error_exist error exist + echo !error_exist! + call print_dashed_seperator + goto:get_bash_path + ) else ( + goto:get_git_path + ) +goto:eof + +:get_git_path + call print_dashed_seperator + call get_local_text github_process_checkout github process checkout + set /p "repository_path=!github_process_checkout!: " + if exist !repository_path! ( + call get_local_text error_path error path + call ask_question "!error_path!" + if "!result!"=="false" ( + call print_dashed_seperator + goto:get_git_path + ) else ( + rmdir /s /q %repository_path% + goto:git_checkout + ) + ) else ( + goto:git_checkout + ) +goto:eof + +:git_checkout + md "%repository_path%" + set "repository_path=%repository_path%\coco" + + call print_dashed_seperator + set "git_app_path=%git_bash_path%\bin\git.exe" + + call get_config github_url + "%git_app_path%" clone "!github_url!" "%repository_path%" + + goto:exit_git_setup +goto:eof + +:exit_git_setup + call print_dashed_seperator +======= +call print_github_header +call print_dashed_seperator + +call get_local_text github_intro_opensource github intro opensource +call get_local_text github_intro_online github intro online +call get_local_text github_intro_manual github intro manual +call get_local_text github_intro_norec github intro norec + +echo !github_intro_opensource! +echo !github_intro_online! +echo !github_intro_manual! +echo !github_intro_norec! + +call print_dashed_seperator + +call get_local_text github_skip_question github skip question +call ask_question "!github_skip_question!" +call print_dashed_seperator + +if "%result%"=="true" ( + call get_local_text github_skip_consequence github skip consequence + echo !github_skip_consequence! + + call get_local_text github_skip_donotclose github skip donotclose + echo !github_skip_donotclose! + + call get_local_text github_skip_wait github skip wait + set /p "github_skip_wait=!github_skip_wait!" + + call print_dashed_seperator + + call get_local_text github_process_path github process path + call get_path_safe "!github_process_path!" + set "repository_path=!tmp_safe_path!" + + goto:exit_git_setup +) + +goto:get_bash_path + +:get_bash_path + call get_local_text github_process_bashi github process bashi + echo !github_process_bashi! + + if not defined install_system_bit ( + call print_dashed_seperator + call get_system_information + call print_dashed_seperator + ) + + if "%system_info_bit%"=="64" ( + call get_local_text github_process_bashp64 github process bashp64 + echo !github_process_bashp64! + ) else ( + call get_local_text github_process_bashp32 github process bashp32 + echo !github_process_bashp32! + ) + + call get_local_text github_process_bashq github process bashq + set /p "git_bash_path=!github_process_bashq!: " + + if not defined git_bash_path ( + if "%system_info_bit%"=="64" ( + set "git_bash_path=C:\Program Files (x86)\Git" + ) else ( + set "git_bash_path=C:\Program Files\Git" + ) + goto:get_git_path + ) + + if not exist "%git_bash_path%" ( + call get_local_text error_exist error exist + echo !error_exist! + call print_dashed_seperator + goto:get_bash_path + ) else ( + goto:get_git_path + ) +goto:eof + +:get_git_path + call print_dashed_seperator + call get_local_text github_process_checkout github process checkout + set /p "repository_path=!github_process_checkout!: " + if exist !repository_path! ( + call get_local_text error_path error path + call ask_question "!error_path!" + if "!result!"=="false" ( + call print_dashed_seperator + goto:get_git_path + ) else ( + rmdir /s /q %repository_path% + goto:git_checkout + ) + ) else ( + goto:git_checkout + ) +goto:eof + +:git_checkout + md "%repository_path%" + set "repository_path=%repository_path%" + + call print_dashed_seperator + set "git_app_path=%git_bash_path%\bin\git.exe" + + call get_config github_url + "%git_app_path%" clone "!github_url!" "%repository_path%\coco" + + goto:git_configuration +goto:eof + +:git_configuration + call print_dashed_seperator + + call get_local_text github_config_intro github config intro + echo !github_config_intro! + + call get_local_text github_config_info github config info + echo !github_config_info! + + call print_dashed_seperator + + call get_local_text github_config_username github config username + set /p "git_username=!github_config_username!" + + call get_local_text github_config_password github config password + + set /p "git_password=!github_config_password!" + + call print_dashed_seperator + + call get_local_text github_config_process github config process + echo !github_config_process! + + set cur_dir=%CD% + cd !repository_path!\coco + + "%git_app_path%" remote rm origin + "%git_app_path%" remote add origin https://!git_username!:!git_password!@github.com/!git_username!/codecombat.git + + cd !cur_dir! + + goto:exit_git_setup +goto:eof + +:exit_git_setup + call print_dashed_seperator +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 goto:eof \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/npm_and_brunch_setup.bat b/scripts/windows/coco-dev-setup/batch/scripts/npm_and_brunch_setup.bat old mode 100755 new mode 100644 index f04beaed5..8a3819228 --- a/scripts/windows/coco-dev-setup/batch/scripts/npm_and_brunch_setup.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/npm_and_brunch_setup.bat @@ -1,24 +1,116 @@ -call print_npm_and_brunch_header -call print_dashed_seperator - -set work_directory=%CD% - -set "curl_app=..\utilities\curl.exe" -set "zu_app=..\utilities\7za.exe" - -set coco_root=%repository_path%\coco -set coco_db=%repository_path%\cocodb - -call nab_install_npm %coco_root% - -call nab_install_bower %coco_root% - -call nab_install_sass %coco_root% - -call nab_install_npm_all %coco_root% - -call nab_install_mongodb %coco_db% - -call nab_automatic_script.bat %coco_root% %coco_db% - -call print_dashed_seperator \ No newline at end of file +<<<<<<< HEAD +call print_npm_and_brunch_header +call print_dashed_seperator + +set work_directory=%CD% + +set "curl_app=..\utilities\curl.exe" +set "zu_app=..\utilities\7za.exe" +set "keystuff=..\utilities\keystuff.exe" + +set "coco_root=!repository_path!\coco" + +goto:automatic_script + +call get_local_text npm-install +echo !npm_install! + +cd !coco_root! +start /wait cmd /c "echo !npm_install! & npm install -g bower brunch nodemon sendwithus" +cd !work_directory! + +call print_dashed_seperator +call get_local_text npm-binstall +echo !npm_binstall! + +cd "!coco_root!" +start /wait cmd /c "echo !npm_binstall! & bower install" +cd "!work_directory!" + +call print_dashed_seperator +call get_local_text npm-sass +echo !npm_sass! + +cd "!coco_root!" +start /wait cmd /c "echo !npm_sass! & gem install sass" +cd "!work_directory!" + +call print_dashed_seperator +call get_local_text npm-npm +echo !npm_npm! + +cd "!coco_root!" +start /wait cmd /c "echo !npm_npm! & npm install" +cd "!work_directory!" + +:: --- MONGODB + +:mongodb +call print_dashed_seperator +call get_local_text npm-mongodb +echo !npm_mongodb! + +set "mdb_directory=!repository_path!\cocodb" + +if exist mdb_directory ( + rmdir /s /q "!mdb_directory!" +) + +md !mdb_directory! + +call print_dashed_seperator +call get_local_text npm-db +echo !npm_db! + +call get_config database_backup + +cd !mdb_directory! + +start cmd /c "%work_directory%\%keystuff% Alt-Tab && mongod --setParameter textSearchEnabled=true --dbpath !mdb_directory!" + +%curl_app% -k !database_backup! -o dump.tar.gz + +start /wait cmd /c "%work_directory%\%keystuff% Alt-Tab && %zu_app% e dump.tar.gz && del dump.tar.gz && %zu_app% x dump.tar && del dump.tar" + +start /wait cmd /c "mongorestore dump" + +rmdir /s /q db + +:: --- AUTOMATIC SCRIPT + +::automatic_script +call print_dashed_seperator +call get_local_text npm-script +echo !npm_script! + +:: --- END + +call print_dashed_seperator + +pause +======= +call print_npm_and_brunch_header +call print_dashed_seperator + +set work_directory=%CD% + +set "curl_app=..\utilities\curl.exe" +set "zu_app=..\utilities\7za.exe" + +set coco_root=%repository_path%\coco +set coco_db=%repository_path%\cocodb + +call nab_install_npm %coco_root% + +call nab_install_bower %coco_root% + +call nab_install_sass %coco_root% + +call nab_install_npm_all %coco_root% + +call nab_install_mongodb %coco_db% + +call nab_automatic_script.bat %coco_root% %coco_db% + +call print_dashed_seperator +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/open_localized_text_file.bat b/scripts/windows/coco-dev-setup/batch/scripts/open_localized_text_file.bat new file mode 100755 index 000000000..bee9f5dd6 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/scripts/open_localized_text_file.bat @@ -0,0 +1,6 @@ +set "LFTP=%1-%language_id%.coco" +if not exist "%LFTP%" ( + call open_text_file %1.coco +) else ( + call open_text_file %LFTP% +) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/open_readme.bat b/scripts/windows/coco-dev-setup/batch/scripts/open_readme.bat old mode 100755 new mode 100644 index 484f3dd75..730a3f577 --- a/scripts/windows/coco-dev-setup/batch/scripts/open_readme.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/open_readme.bat @@ -1 +1 @@ -call open_text_file ..\\config\\readme.coco \ No newline at end of file +call open_localized_text_file ..\\config\\localized\\readme \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/open_text_file.bat b/scripts/windows/coco-dev-setup/batch/scripts/open_text_file.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_dashed_seperator.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_dashed_seperator.bat old mode 100755 new mode 100644 index 727d7e61c..b79e5154b --- a/scripts/windows/coco-dev-setup/batch/scripts/print_dashed_seperator.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_dashed_seperator.bat @@ -1,3 +1,8 @@ -echo. -echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +<<<<<<< HEAD +echo. +echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +======= +echo. +echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 echo. \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_exit.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_exit.bat old mode 100755 new mode 100644 index 6f1051cc6..afe7bbf61 --- a/scripts/windows/coco-dev-setup/batch/scripts/print_exit.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_exit.bat @@ -1,2 +1,7 @@ -set /p res="Press any key to exit..." +<<<<<<< HEAD +set /p res="Press any key to exit..." +======= +call get_local_text global_exit global exit +set /p res="%global_exit%" +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 exit \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_file.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_file.bat old mode 100755 new mode 100644 index f40867969..de46b68ee --- a/scripts/windows/coco-dev-setup/batch/scripts/print_file.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_file.bat @@ -1,4 +1,4 @@ -set "file=%1" -for /f "usebackq tokens=* delims=;" %%a in ("%file%") do ( - echo.%%a +set "file=%1" +for /f "usebackq tokens=* delims=;" %%a in ("%file%") do ( + echo.%%a ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_finished_header.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_finished_header.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_github_header.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_github_header.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_header.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_header.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_info.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_info.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_install_header.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_install_header.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_license.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_license.bat old mode 100755 new mode 100644 index a208ca559..3acee4bcc --- a/scripts/windows/coco-dev-setup/batch/scripts/print_license.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_license.bat @@ -1 +1 @@ -print_file ..\\config\\license.coco \ No newline at end of file +call print_localized_file ..\\config\\localized\\license \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_localized_file.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_localized_file.bat new file mode 100755 index 000000000..e71fe3364 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_localized_file.bat @@ -0,0 +1,6 @@ +set "LFTP=%1-%language_id%.coco" +if not exist "%LFTP%" ( + call print_file %1.coco +) else ( + call print_file %LFTP% +) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_npm_and_brunch_header.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_npm_and_brunch_header.bat old mode 100755 new mode 100644 diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_seperator.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_seperator.bat old mode 100755 new mode 100644 index c68792d46..aae85a7d8 --- a/scripts/windows/coco-dev-setup/batch/scripts/print_seperator.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_seperator.bat @@ -1,3 +1,8 @@ -echo. -echo ----------------------------------------------------------------------------- +<<<<<<< HEAD +echo. +echo ----------------------------------------------------------------------------- +======= +echo. +echo ------------------------------------------------------------------------------- +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 echo. \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/print_tips.bat b/scripts/windows/coco-dev-setup/batch/scripts/print_tips.bat old mode 100755 new mode 100644 index c00833574..0a2e3033a --- a/scripts/windows/coco-dev-setup/batch/scripts/print_tips.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/print_tips.bat @@ -1 +1 @@ -print_file ..\\config\\tips.coco \ No newline at end of file +call print_localized_file ..\\config\\localized\\tips \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/run_script.bat b/scripts/windows/coco-dev-setup/batch/scripts/run_script.bat old mode 100755 new mode 100644 index 1e4797008..c18af72b7 --- a/scripts/windows/coco-dev-setup/batch/scripts/run_script.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/run_script.bat @@ -1,2 +1,2 @@ -@echo off +@echo off PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& "%*" \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/setup.bat b/scripts/windows/coco-dev-setup/batch/scripts/setup.bat old mode 100755 new mode 100644 index 9ac1c55df..0fb896ea7 --- a/scripts/windows/coco-dev-setup/batch/scripts/setup.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/setup.bat @@ -1,28 +1,98 @@ -@echo off -setlocal EnableDelayedExpansion - -call configuration_cmd - -call print_header -call print_dashed_seperator - -call get_config.bat version -call get_config.bat author -call get_config.bat copyright -echo Welcome to the automated Installation of the CodeCombat Dev. Environment! -echo v%version% authored by %author% and published by %copyright%. -call print_seperator - -echo Before we start the installation, here are some tips: -call print_tips -call print_seperator - -call sign_license - -call get_language - -call download_and_install_applications - -start cmd /c "setup_p2.bat" - +<<<<<<< HEAD +@echo off +setlocal EnableDelayedExpansion + +Color 0A +mode con: cols=79 lines=55 + +call print_header +call print_dashed_seperator + +call get_config.bat version +call get_config.bat author +call get_config.bat copyright +echo Welcome to the automated Installation of the CodeCombat Dev. Environment! +echo v%version% authored by %author% and published by %copyright%. +call print_seperator + +echo Before we start the installation, here are some tips: +call print_tips +call print_seperator + +call sign_license + +call get_language + +call download_and_install_applications + +call github_setup + +:: This will be available in v2.0 +::call npm_and_brunch_setup + +call print_finished_header +call print_dashed_seperator + +call get_local_text end_succesfull end succesfull +call get_local_text end_thankyou end thankyou +echo %end_succesfull% +echo %end_thankyou% + +call print_dashed_seperator + +call get_local_text start_s1 start s1 +call get_local_text start_s2 start s2 +call get_local_text start_s3 start s3 +call get_local_text start_s4 start s4 +call get_local_text start_s5 start s5 +call get_local_text start_s6 start s6 + +echo !start_s1! +echo !start_s2! +echo. +echo !start_s3! '!repository_path!\coco\SCOCODE.bat' +echo !start_s4! +echo !start_s5! +echo. +echo !start_s6! + +call print_dashed_seperator + +call get_local_text end_readme end readme +call ask_question "!end_readme!" + +if "%result%"=="true" ( + call open_readme +) + +======= +@echo off +setlocal EnableDelayedExpansion + +call configuration_cmd + +call print_header +call print_dashed_seperator + +call get_config.bat version +call get_config.bat author +call get_config.bat copyright +echo Welcome to the automated Installation of the CodeCombat Dev. Environment! +echo v%version% authored by %author% and published by %copyright%. +call print_seperator + +call get_language + +call get_local_text global_tips global tips +echo !global_tips! +call print_tips +call print_seperator + +call sign_license + +call download_and_install_applications + +start cmd /c "setup_p2.bat" + +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 endlocal \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/scripts/sign_license.bat b/scripts/windows/coco-dev-setup/batch/scripts/sign_license.bat old mode 100755 new mode 100644 index 139ddfd80..db0b51e4b --- a/scripts/windows/coco-dev-setup/batch/scripts/sign_license.bat +++ b/scripts/windows/coco-dev-setup/batch/scripts/sign_license.bat @@ -1,15 +1,44 @@ -echo In order to continue the installation of the developers environment -echo you will have to read and agree with the following license: -call print_dashed_seperator - -call print_license -call print_dashed_seperator - -call ask_question "Have you read the license and do you agree with it?" -call print_dashed_seperator - -if "%result%"=="false" ( - echo This setup can't happen without an agreement. - echo Installation and Setup of the CodeCombat environment is cancelled. - call print_exit +<<<<<<< HEAD +echo In order to continue the installation of the developers environment +echo you will have to read and agree with the following license: +call print_dashed_seperator + +call print_license +call print_dashed_seperator + +call ask_question "Have you read the license and do you agree with it?" +call print_dashed_seperator + +if "%result%"=="false" ( + echo This setup can't happen without an agreement. + echo Installation and Setup of the CodeCombat environment is cancelled. + call print_exit +======= +call get_local_text license_s1 license s1 +echo !license_s1! + +call get_local_text license_s2 license s2 +echo !license_s2! + +call print_dashed_seperator + +call print_license +call print_dashed_seperator + +call get_local_text license_q1 license q1 +call ask_question "%license_q1%" + +call print_dashed_seperator + +if "%result%"=="false" ( + call get_local_text license_a1 license a1 + echo !license_a1! + + call get_local_text license_a2 license a2 + echo !license_a2! + + echo. + + call print_exit +>>>>>>> 072729acc34123c42250d361955438cfd8c210d7 ) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/batch/setup.bat b/scripts/windows/coco-dev-setup/batch/setup.bat new file mode 100644 index 000000000..1246a77c1 --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/setup.bat @@ -0,0 +1,2 @@ +cd scripts +setup.bat \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/recycle_bin/dev-setup.bat b/scripts/windows/coco-dev-setup/recycle_bin/dev-setup.bat new file mode 100644 index 000000000..c7447cade --- /dev/null +++ b/scripts/windows/coco-dev-setup/recycle_bin/dev-setup.bat @@ -0,0 +1,533 @@ +@echo off +setlocal EnableDelayedExpansion + +Color 0A + +mode con: cols=78 lines=60 + +:: Global Variables +set "temp-dir=C:\Coco-Temp" +set install-log=%temp-dir%\coco-dev-install-log.txt + +:: set correct curl app +IF EXIST "%PROGRAMFILES(X86)%" ( + (set "curl-app=utilities\curl\64bit\curl.exe") +) ELSE ( + set "curl-app=utilities\curl\32bit\curl.exe" +) + +set "ZU-app=utilities\7za.exe" + +:: BUGS: + :: + DEBUG ALL STEPS UNTILL NOW DONE + + +:: TODO: +:: + Write code to install vs if it's not yet installed on users pc + +:: + Configuraton and installation checklist: +:: 1) cd codecombat +:: 2) npm install -g bower brunch nodemon sendwithus +:: 3) bower install +:: 4) gem install sass +:: 5) npm install +:: 6) brunch -w +:: Extra... @ Fail run npm install + +:: + Copy the automated dev batch file to root folder +:: => Let user define mongo-db directory +:: + Start the dev environment + +:: Create The Temporary Directory +IF EXIST %temp-dir% rmdir %temp-dir% /s /q +mkdir %temp-dir% + +:: Create Log File +copy /y nul %install-log% > nul + +call:parse_aa_and_draw "config\header" +call:draw_dss + +call:parse_file_new "config\config" cnfg n + +call:log "Welcome to the automated Installation of the CodeCombat Dev. Environment!" +call:log_sse "v%%cnfg[1]%% authored by %%cnfg[2]%% and published by %%cnfg[3]%%." + +:: Language Agreement Stuff + +call:log "In order to continue the installation of the developers environment" +call:log "you will have to read and agree with the following license: +call:draw_dss +echo. +call:parse_aa_and_draw "license.txt" +echo. +call:draw_dss +call:strict_user_yn_question "Have you read the license and do you agree with it?" + +if "%res%"=="false" ( + call:log "Sorry to hear that, have a good day..." + call:log_sse "Installation and Setup of the CodeCombat environment is cancelled." + GOTO:END +) + +:: Tips +call:log "Before we start the installation, here are some tips:" +echo. + +call:parse_aa_and_draw "config\tips" + +call:draw_ss + +:: Read Language Index +call:parse_file_new "localisation\languages" lang lang_c + +:: Read Download URLs +call:parse_file_new "config\downloads" downloads n +call:parse_file_new "config\downloads_32" downloads_32 n +call:parse_file_new "config\downloads_64" downloads_64 n +call:parse_file_new "config\downloads_vista_32" downloads_vista_32 n +call:parse_file_new "config\downloads_vista_64" downloads_vista_64 n +call:parse_file_new "config\downloads_7_32" downloads_7_32 n +call:parse_file_new "config\downloads_7_64" downloads_7_64 n + +:: Parse all Localisation Files +for /L %%i in (1,1,%lang_c%) do ( + call:parse_file "localisation\%%lang[%%i]%%" languages languages_c +) + +set /A "wc = %languages_c% / %lang_c%" + +:: Start install with language question (Localisation) +call:log "Which language do you prefer?" + +set /A c=0 +for /L %%i in (1,%wc%,%languages_c%) do ( + set /A "n = %%i - 1" + call:log " [%%c%%] %%languages[%%i]%%" + set /A c+=1 +) + +set "lang_id=-1" +call:user_enter_language_id +goto:user_pick_language + +:user_enter_language_id + set /p lang_id= "Enter the language ID and press <ENTER>: " +goto:eof + +:user_pick_language + set res=false + if %lang_id% LSS 0 set res=true + if %lang_id% GEQ %lang_c% set res=true + if "%res%"=="true" ( + call:log "Invalid id! Please enter a correct id from the numbers listed above..." + call:draw_dss + call:user_enter_language_id + goto:user_pick_language + ) + +call:get_lw word 0 +call:log_ds "You choose '%word%', from now on all feedback will be logged in it." + +call:log_lw 1 +call:log_lw_sse 2 + +:: downloads for all version... + +:: [TODO] The choice between Cygwin && Git ?! Is => HAVE EXTERNAL GIT APPLICATION LIST!!! + +call:log_lw_sse 3 + +call:log_lw 6 +call:log_lw 7 +call:log_lw 8 +call:install_software_o "git" "%%downloads[1]%%" exe 9 +call:draw_dss +call:get_lw word 11 + +:: [TODO] Add downloads for windows visual studio ?! + +call:user_set_git_path + +:user_set_git_path_fail + if not exist "%git_exe_path%" ( + call:log_lw 27 + call:draw_dss + call:user_set_git_path + ) + :: architecture specific downloads... + IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT) +goto:eof + +:user_set_git_path + set /p git_exe_path="%word%: " + call:user_set_git_path_fail +goto:eof + +:go_to_platform + call:log_ds "Windows %~1 detected..." + GOTO %~2 +goto:eof + +:64BIT + call:log_ds "64-bit computer detected..." + + call:install_software_o "node-js" "%%downloads_64[1]%%" msi 12 + call:draw_dss + + call:get_path_from_user 41 42 + set "node_js_path=%user_tmp_path%" + Call:draw_dss + + call:install_software_o "ruby" "%%downloads_64[2]%%" exe 13 + call:draw_dss + call:install_software_o "python" "%%downloads_64[3]%%" msi 26 + + :: Some installations require specific windows versions + for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j + if "%version%" == "5.2" ( call:go_to_platform "XP" ver_XP_64 ) + if "%version%" == "6.0" ( call:go_to_platform "Vista" ver_Vista_64 ) + if "%version%" == "6.1" ( call:go_to_platform "7" ver_Win7_8_64 ) + if "%version%" == "6.2" ( call:go_to_platform "8.0" ver_Win7_8_64 ) + if "%version%" == "6.3" ( call:go_to_platform "8.1" ver_Win7_8_64 ) + GOTO warn_and_exit +GOTO END + +:32BIT + call:log_ds "32-bit computer detected..." + + call:install_software_o "node-js" "%%downloads_32[1]%%" msi 12 + call:draw_dss + + call:get_path_from_user 41 42 + set "node_js_path=%user_tmp_path%" + Call:draw_dss + + call:install_software_o "ruby" "%%downloads_32[2]%%" exe 13 + call:draw_dss + call:install_software_o "python" "%%downloads_32[3]%%" msi 26 + + :: Some installations require specific windows versions + for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j + if "%version%" == "5.2" ( call:go_to_platform "XP" ver_XP_32 ) + if "%version%" == "6.0" ( call:go_to_platform "Vista" ver_Vista_32 ) + if "%version%" == "6.1" ( call:go_to_platform "7" ver_Win7_8_32 ) + if "%version%" == "6.2" ( call:go_to_platform "8.0" ver_Win7_8_32 ) + if "%version%" == "6.3" ( call:go_to_platform "8.1" ver_Win7_8_32 ) + GOTO warn_and_exit +GOTO END + +:ver_Win7_8_32 + call:install_packed_software_o "mongo-db" "%%downloads_7_32[1]%%" 25 14 + set "mong-db-path = %packed_software_path%" +goto git_rep_checkout + +:ver_Vista_32 + call:install_packed_software_o "mongo-db" "%%downloads_vista_32[1]%%" 25 14 + set "mong-db-path = %packed_software_path%" +goto git_rep_checkout + +:ver_XP_32 + call:log_lw_ds 15 +goto END + +:ver_Win7_8_64 + call:install_packed_software_o "mongo-db" "%%downloads_7_64[1]%%" 25 14 + set "mong-db-path = %packed_software_path%" +goto git_rep_checkout + +:ver_Vista_64 + call:install_packed_software_o "mongo-db" "%%downloads_vista_64[1]%%" 25 14 + set "mong-db-path = %packed_software_path%" +goto git_rep_checkout + +:ver_XP_64 + call:log_lw_ds 15 +goto END + +:git_rep_checkout + call:log_lw_ss 16 + call:log_lw_sse 17 + + set "PATH=%PATH%;%git_exe_path%\bin;%git_exe_path%\cmd" /M + + call:log_lw 36 + call:log_lw 37 + call:log_lw 38 + + call:draw_dss + + call:get_lw word 39 + set /p git_username="%word% " + + call:draw_dss + + call:get_empty_path_from_user 32 + set "git_repository_path=%user_tmp_path%" + +goto:git_rep_checkout_auto + +:git_rep_checkout_auto + git clone https://github.com/%git_username%/codecombat.git "%git_repository_path%" +goto:git_repo_configuration + +:git_repo_configuration + call:log_lw_ss 35 + call:log_lw_sse 36 + + SET "PATH=%PATH%;%node_js_path%" /M + setx -m git "%git_exe_path%\bin" + + call:log_lw 40 + start cmd /k "npm install -g bower brunch nodemon sendwithus & exit" + +goto report_ok + +:report_ok + call:log_lw 18 + call:log_lw_sse 19 + + :: Open README file + call:open_readme + +goto clean_up + +:open_readme + call:open_txt_file "config/info" +goto:eof + +:warn_and_exit + call:log_lw_ss 20 + call:log_lw_sse 21 +goto error_report + +:error_report + call:log_lw_ds 22 +goto END + +:clean_up + call:log_lw_sse 23 + rmdir %temp-dir% /s /q +goto END + +:: ============================ INSTALL SOFTWARE FUNCTIONS ====================== + +:download_software + call:get_lw word 4 + call:log "%word% %~1..." + %curl-app% -sS -k %~2 -o %temp-dir%\%~1-setup.%~3 +goto:eof + +:install_software + call:download_software %~1 %~2 %~3 + call:get_lw word 5 + call:log "%word% %~1..." + START /WAIT %temp-dir%\%~1-setup.%~3 +goto:eof + +:install_software_o + call:get_lw word %~4 + call:user_yn_question "%word%" + if "%res%"=="true" ( + call:install_software %~1 %~2 %~3 + ) else ( + call:log_lw 10 + ) +goto:eof + +:install_packed_software + call:download_software %~1 %~2 zip + + call:draw_dss + + call:get_lw word %~3 + + set /p packed_software_path="%word% " + + :: remove chosen directory of user if it already exists (to prevent a window from popping up) + IF EXIST %packed_software_path% rmdir %packed_software_path% /s /q + + %ZU-app% x %temp-dir%\%~1-setup.zip -o%packed_software_path% + + call:draw_dss + + for /f "delims=" %%a in ('dir "%packed_software_path%\" /on /ad /b') do @set temp_dir=%%a + for /f "delims=" %%a in ('dir "%packed_software_path%\%temp_dir%\" /on /ad /b') do ( + xcopy %packed_software_path%\%temp_dir% %packed_software_path%\ /S /E + ) + + call:draw_dss + rmdir %packed_software_path%\%temp_dir%\ /s /q +goto:eof + +:user_yn_question + set /p result="%~1 [Y/N]: " + call:draw_dss + set "res=false" + if "%result%"=="N" (set "res=true") + if "%result%"=="n" (set "res=true") +goto:eof + +:strict_user_yn_question + set /p result="%~1 [Y/N]: " + call:draw_dss + set "res=unset" + if "%result%"=="N" (set "res=false") + if "%result%"=="n" (set "res=false") + if "%result%"=="Y" (set "res=true") + if "%result%"=="y" (set "res=true") + + if "%res%"=="unset" ( + call:log "Please answer the question with either Y or N..." + call:draw_dss + call:strict_user_yn_question "%~1" + ) +goto:eof + +:install_packed_software_o + call:get_lw word %~4 + call:user_yn_question "%word%" + if "%res%"=="true" ( + call:install_packed_software %~1 %~2 %~3 + ) else ( + call:log_lw 10 + ) +goto:eof + +:: ===================== USER - INTERACTION - FUNCTIONS ======================== + +:get_path_from_user + call:get_lw word %~1 + set /p user_tmp_path="%word% " + if not exist "%user_tmp_path%" ( + call:log_lw 43 + call:draw_dss + call:get_path_from_user %~1 %~2 + ) +goto:eof + +:get_empty_path_from_user + call:get_lw word %~1 + set /p user_tmp_path="%word% " + if exist "%user_tmp_path%" ( + call:log_lw 33 + call:draw_dss + call:get_path_from_user %~1 + ) +goto:eof + +:: ============================== FUNCTIONS ==================================== + +:log + echo %~1 + echo %~1 >> %install-log% +goto:eof + +:draw_ss + echo. + call:log "-----------------------------------------------------------------------------" + echo. +goto:eof + +:draw_dss + echo. + call:log "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" + echo. +goto:eof + +:draw_seperator + echo. + echo + + + + + + + + + echo. +goto:eof + +:log_ss + call:draw_ss + call:log "%~1" +goto:eof + +:log_sse + call:log "%~1" + call:draw_ss +goto:eof + +:log_ds + call:log_ss "%~1" + call:draw_ss +goto:eof + +:: ============================== IO FUNCTIONS ==================================== + +:open_txt_file + start "" notepad.exe %~1 +goto:eof + +:parse_aa_and_draw + set "file=%~1" + for /f "usebackq tokens=* delims=;" %%a in ("%file%") do ( + echo.%%a + ) +goto:eof + +:parse_file + set "file=%~1" + for /F "usebackq delims=" %%a in ("%file%") do ( + set /A %~3+=1 + call set %~2[%%%~3%%]=%%a + ) +goto:eof + +:parse_file_new + set /A %~3=0 + call:parse_file %~1 %~2 %~3 +goto:eof + +:: ============================== LOCALISATION FUNCTIONS ================ + +:get_lw + call:get_lw_id %~1 %lang_id% %~2 +goto:eof + +:get_lw_id + set /A count = %~2 * %wc% + %~3 + 1 + set "%~1=!languages[%count%]!" +goto:eof + +:log_lw + call:get_lw str %~1 + call:log "%str%" +goto:eof + +:log_lw_prfx + call:get_lw str %~1 + call:log "%~2%str%" +goto:eof + +:log_lw_ss + call:get_lw str %~1 + call:log_ss "%str%" +goto:eof + +:log_lw_ds + call:get_lw str %~1 + call:log_ds "%str%" +goto:eof + +:log_lw_sse + call:get_lw str %~1 + call:log_sse "%str%" +goto:eof + +:: ============================== WINDOWS FUNCTIONS ====================== + +:set_env_var + setx -m %~1 %~2 +goto:eof + +:: ============================== EOF ==================================== + +:END + exit +goto:eof + +endlocal \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/recycle_bin/git-test.bat b/scripts/windows/coco-dev-setup/recycle_bin/git-test.bat new file mode 100644 index 000000000..4fc84019c --- /dev/null +++ b/scripts/windows/coco-dev-setup/recycle_bin/git-test.bat @@ -0,0 +1,50 @@ +@echo off +setlocal EnableDelayedExpansion + +:: + Configuraton and installation checklist: +:: 1) cd codecombat +:: 2) npm install -g bower brunch nodemon sendwithus +:: 3) bower install +:: 4) gem install sass +:: 5) npm install +:: 6) brunch -w +:: Extra... @ Fail run npm install + +echo "Moving to your git repository..." +C: +cd C:\CodeCombat + +PAUSE + +SET "PATH=%PATH%;C:\Program Files\Nodejs" /M +setx -m git "C:\Program Files (x86)\Git\bin" +SET "PATH=%PATH%;C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Git\cmd" /M + +PAUSE + +echo "Installing bower, brunch, nodemon and sendwithus..." +start cmd /k "npm install -g bower brunch nodemon sendwithus & exit" + +PAUSE + +echo "running npm install..." +start cmd /k "npm install & exit" + +PAUSE + +echo "Activating bower install..." +start cmd /k "bower install & PAUSE & exit" + +PAUSE + +echo "Installing sass via gem..." +start cmd /k "install sass & PAUSE & exit" + +PAUSE + +echo "comping repository via brunch..." +start cmd /k "brunch -w & exit" + +PAUSE + +endlocal \ No newline at end of file diff --git a/server/articles/Article.coffee b/server/articles/Article.coffee index 19a1e3253..626fc779c 100644 --- a/server/articles/Article.coffee +++ b/server/articles/Article.coffee @@ -1,12 +1,11 @@ mongoose = require('mongoose') plugins = require('../plugins/plugins') -ArticleSchema = new mongoose.Schema( - body: String, -) +ArticleSchema = new mongoose.Schema(body: String, {strict:false}) ArticleSchema.plugin(plugins.NamedPlugin) ArticleSchema.plugin(plugins.VersionedPlugin) ArticleSchema.plugin(plugins.SearchablePlugin, {searchable: ['body', 'name']}) +ArticleSchema.plugin(plugins.PatchablePlugin) module.exports = mongoose.model('article', ArticleSchema) diff --git a/server/articles/article_handler.coffee b/server/articles/article_handler.coffee index b519b8b9f..8aa2d26dc 100644 --- a/server/articles/article_handler.coffee +++ b/server/articles/article_handler.coffee @@ -4,8 +4,13 @@ Handler = require('../commons/Handler') ArticleHandler = class ArticleHandler extends Handler modelClass: Article editableProperties: ['body', 'name', 'i18n'] + jsonSchema: require '../../app/schemas/models/article' hasAccess: (req) -> req.method is 'GET' or req.user?.isAdmin() + hasAccessToDocument: (req, document, method=null) -> + return true if req.method is 'GET' or method is 'get' or req.user?.isAdmin() + return false + module.exports = new ArticleHandler() diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee index f38885fd9..23909b6a2 100644 --- a/server/commons/Handler.coffee +++ b/server/commons/Handler.coffee @@ -3,6 +3,7 @@ mongoose = require('mongoose') Grid = require 'gridfs-stream' errors = require './errors' log = require 'winston' +Patch = require '../patches/Patch' PROJECT = {original:1, name:1, version:1, description: 1, slug:1, kind: 1} FETCH_LIMIT = 200 @@ -27,8 +28,7 @@ module.exports = class Handler getEditableProperties: (req, document) -> props = @editableProperties.slice() isBrandNew = req.method is 'POST' and not req.body.original - if isBrandNew - props = props.concat @postEditableProperties + props = props.concat @postEditableProperties if isBrandNew if @modelClass.schema.uses_coco_permissions # can only edit permissions if this is a brand new property, @@ -37,8 +37,8 @@ module.exports = class Handler if isBrandNew or isOwner or req.user?.isAdmin() props.push 'permissions' - if @modelClass.schema.uses_coco_versions - props.push 'commitMessage' + props.push 'commitMessage' if @modelClass.schema.uses_coco_versions + props.push 'allowPatches' if @modelClass.schema.is_patchable props @@ -48,6 +48,7 @@ module.exports = class Handler sendMethodNotAllowed: (res) -> errors.badMethod(res) sendBadInputError: (res, message) -> errors.badInput(res, message) sendDatabaseError: (res, err) -> + return @sendError(res, err.code, err.response) if err.response and err.code log.error "Database error, #{err}" errors.serverError(res, 'Database error, ' + err) @@ -92,8 +93,32 @@ module.exports = class Handler getByRelationship: (req, res, args...) -> # this handler should be overwritten by subclasses + if @modelClass.schema.is_patchable + return @getPatchesFor(req, res, args[0]) if req.route.method is 'get' and args[1] is 'patches' + return @setListening(req, res, args[0]) if req.route.method is 'put' and args[1] is 'listen' return @sendNotFoundError(res) + getPatchesFor: (req, res, id) -> + query = { 'target.original': mongoose.Types.ObjectId(id), status: req.query.status or 'pending' } + Patch.find(query).sort('-created').exec (err, patches) => + return @sendDatabaseError(res, err) if err + patches = (patch.toObject() for patch in patches) + @sendSuccess(res, patches) + + setListening: (req, res, id) -> + @getDocumentForIdOrSlug id, (err, document) => + return @sendUnauthorizedError(res) unless @hasAccessToDocument(req, document, 'get') + return @sendDatabaseError(res, err) if err + return @sendNotFoundError(res) unless document? + listeners = document.get('listeners') or [] + me = req.user.get('_id') + listeners = (l for l in listeners when not l.equals(me)) + listeners.push me if req.body.on + document.set 'listeners', listeners + document.save (err, document) => + return @sendDatabaseError(res, err) if err + @sendSuccess(res, @formatEntity(req, document)) + search: (req, res) -> unless @modelClass.schema.uses_coco_search return @sendNotFoundError(res) @@ -203,10 +228,9 @@ module.exports = class Handler return @sendBadInputError(res, 'No input.') if _.isEmpty(req.body) return @sendBadInputError(res, 'id should not be included.') if req.body._id return @sendUnauthorizedError(res) unless @hasAccess(req) - validation = @validateDocumentInput(req.body) - return @sendBadInputError(res, validation.errors) unless validation.valid document = @makeNewInstance(req) @saveChangesToDocument req, document, (err) => + return @sendBadInputError(res, err.errors) if err?.valid is false return @sendDatabaseError(res, err) if err @sendSuccess(res, @formatEntity(req, document)) @@ -220,13 +244,12 @@ module.exports = class Handler return @sendBadInputError(res, 'No input.') if _.isEmpty(req.body) return @sendBadInputError(res, 'id should not be included.') if req.body._id return @sendUnauthorizedError(res) unless @hasAccess(req) - validation = @validateDocumentInput(req.body) - return @sendBadInputError(res, validation.errors) unless validation.valid document = @makeNewInstance(req) document.set('original', document._id) document.set('creator', req.user._id) @saveChangesToDocument req, document, (err) => - return @sendBadInputError(res, err.response) if err?.response + console.log 'saved new version', document.toObject() + return @sendBadInputError(res, err.errors) if err?.valid is false return @sendDatabaseError(res, err) if err @sendSuccess(res, @formatEntity(req, document)) @@ -245,8 +268,6 @@ module.exports = class Handler return @sendBadInputError(res, 'This entity is not versioned') unless @modelClass.schema.uses_coco_versions return @sendBadInputError(res, 'No input.') if _.isEmpty(req.body) return @sendUnauthorizedError(res) unless @hasAccess(req) - validation = @validateDocumentInput(req.body) - return @sendBadInputError(res, validation.errors) unless validation.valid @getDocumentForIdOrSlug req.body._id, (err, parentDocument) => return @sendBadInputError(res, 'Bad id.') if err and err.name is 'CastError' return @sendDatabaseError(res, err) if err @@ -261,6 +282,8 @@ module.exports = class Handler delete updatedObject[prop] delete updatedObject._id major = req.body.version?.major + validation = @validateDocumentInput(updatedObject) + return @sendBadInputError(res, validation.errors) unless validation.valid done = (err, newDocument) => return @sendDatabaseError(res, err) if err diff --git a/server/commons/mapping.coffee b/server/commons/mapping.coffee index 2f659811b..3cfcc2164 100644 --- a/server/commons/mapping.coffee +++ b/server/commons/mapping.coffee @@ -6,23 +6,10 @@ module.exports.handlers = 'level_feedback': 'levels/feedbacks/level_feedback_handler' 'level_session': 'levels/sessions/level_session_handler' 'level_system': 'levels/systems/level_system_handler' + 'patch': 'patches/patch_handler' 'thang_type': 'levels/thangs/thang_type_handler' 'user': 'users/user_handler' -module.exports.schemas = - 'article': 'articles/article_schema' - 'common': 'commons/schemas' - 'i18n': 'commons/i18n_schema' - 'level': 'levels/level_schema' - 'level_component': 'levels/components/level_component_schema' - 'level_feedback': 'levels/feedbacks/level_feedback_schema' - 'level_session': 'levels/sessions/level_session_schema' - 'level_system': 'levels/systems/level_system_schema' - 'metaschema': 'commons/metaschema' - 'thang_component': 'levels/thangs/thang_component_schema' - 'thang_type': 'levels/thangs/thang_type_schema' - 'user': 'users/user_schema' - module.exports.routes = [ 'routes/auth' diff --git a/server/levels/Level.coffee b/server/levels/Level.coffee index c61245ed5..9cadeac7b 100644 --- a/server/levels/Level.coffee +++ b/server/levels/Level.coffee @@ -1,6 +1,6 @@ mongoose = require('mongoose') plugins = require('../plugins/plugins') -jsonschema = require('./level_schema') +jsonschema = require('../../app/schemas/models/level') LevelSchema = new mongoose.Schema({ description: String @@ -10,6 +10,7 @@ LevelSchema.plugin(plugins.NamedPlugin) LevelSchema.plugin(plugins.PermissionsPlugin) LevelSchema.plugin(plugins.VersionedPlugin) LevelSchema.plugin(plugins.SearchablePlugin, {searchable: ['name', 'description']}) +LevelSchema.plugin(plugins.PatchablePlugin) LevelSchema.pre 'init', (next) -> return next() unless jsonschema.properties? diff --git a/server/levels/components/LevelComponent.coffee b/server/levels/components/LevelComponent.coffee index 3dc373be1..6c1a58370 100644 --- a/server/levels/components/LevelComponent.coffee +++ b/server/levels/components/LevelComponent.coffee @@ -1,16 +1,17 @@ mongoose = require('mongoose') plugins = require('../../plugins/plugins') -jsonschema = require('./level_component_schema') +jsonschema = require('../../../app/schemas/models/level_component') LevelComponentSchema = new mongoose.Schema { description: String system: String }, {strict: false} -LevelComponentSchema.plugin(plugins.NamedPlugin) -LevelComponentSchema.plugin(plugins.PermissionsPlugin) -LevelComponentSchema.plugin(plugins.VersionedPlugin) -LevelComponentSchema.plugin(plugins.SearchablePlugin, {searchable: ['name', 'description', 'system']}) +LevelComponentSchema.plugin plugins.NamedPlugin +LevelComponentSchema.plugin plugins.PermissionsPlugin +LevelComponentSchema.plugin plugins.VersionedPlugin +LevelComponentSchema.plugin plugins.SearchablePlugin, {searchable: ['name', 'description', 'system']} +LevelComponentSchema.plugin plugins.PatchablePlugin LevelComponentSchema.pre 'init', (next) -> return next() unless jsonschema.properties? diff --git a/server/levels/components/level_component_handler.coffee b/server/levels/components/level_component_handler.coffee index 89a3ea21c..3bcc572d0 100644 --- a/server/levels/components/level_component_handler.coffee +++ b/server/levels/components/level_component_handler.coffee @@ -3,6 +3,7 @@ Handler = require('../../commons/Handler') LevelComponentHandler = class LevelComponentHandler extends Handler modelClass: LevelComponent + jsonSchema: require '../../../app/schemas/models/level_component' editableProperties: [ 'system' 'description' diff --git a/server/levels/feedbacks/LevelFeedback.coffee b/server/levels/feedbacks/LevelFeedback.coffee index 0eecdec32..5fef6a567 100644 --- a/server/levels/feedbacks/LevelFeedback.coffee +++ b/server/levels/feedbacks/LevelFeedback.coffee @@ -2,7 +2,7 @@ mongoose = require('mongoose') plugins = require('../../plugins/plugins') -jsonschema = require('./level_feedback_schema') +jsonschema = require('../../../app/schemas/models/level_feedback') LevelFeedbackSchema = new mongoose.Schema({ created: diff --git a/server/levels/feedbacks/level_feedback_handler.coffee b/server/levels/feedbacks/level_feedback_handler.coffee index 5cb8be50b..58d268db1 100644 --- a/server/levels/feedbacks/level_feedback_handler.coffee +++ b/server/levels/feedbacks/level_feedback_handler.coffee @@ -4,6 +4,7 @@ Handler = require('../../commons/Handler') class LevelFeedbackHandler extends Handler modelClass: LevelFeedback editableProperties: ['rating', 'review', 'level', 'levelID', 'levelName'] + jsonSchema: require '../../../app/schemas/models/level_feedback' makeNewInstance: (req) -> feedback = super(req) diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee index abf3dfe07..f0c6d225b 100644 --- a/server/levels/level_handler.coffee +++ b/server/levels/level_handler.coffee @@ -8,6 +8,7 @@ mongoose = require('mongoose') LevelHandler = class LevelHandler extends Handler modelClass: Level + jsonSchema: require '../../app/schemas/models/level' editableProperties: [ 'description' 'documentation' @@ -38,7 +39,7 @@ LevelHandler = class LevelHandler extends Handler return @getLeaderboardGPlusFriends(req, res, args[0]) if args[1] is 'leaderboard_gplus_friends' return @getHistogramData(req, res, args[0]) if args[1] is 'histogram_data' return @checkExistence(req, res, args[0]) if args[1] is 'exists' - return @sendNotFoundError(res) + super(arguments...) fetchLevelByIDAndHandleErrors: (id, req, res, callback) -> @getDocumentForIdOrSlug id, (err, level) => @@ -240,9 +241,6 @@ LevelHandler = class LevelHandler extends Handler original: level.original.toString() majorVersion: level.version.major submitted:true - - console.log sessionsQueryParameters - query = Session .find(sessionsQueryParameters) @@ -253,7 +251,6 @@ LevelHandler = class LevelHandler extends Handler return @sendDatabaseError res, err if err? or not resultSessions teamSessions = _.groupBy resultSessions, 'team' - console.log teamSessions sessions = [] numberOfTeams = 0 for team of teamSessions diff --git a/server/levels/sessions/LevelSession.coffee b/server/levels/sessions/LevelSession.coffee index 952782f1b..c30519ba0 100644 --- a/server/levels/sessions/LevelSession.coffee +++ b/server/levels/sessions/LevelSession.coffee @@ -2,7 +2,7 @@ mongoose = require('mongoose') plugins = require('../../plugins/plugins') -jsonschema = require('./level_session_schema') +jsonschema = require('../../../app/schemas/models/level_session') LevelSessionSchema = new mongoose.Schema({ created: diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee index ca8680a17..5771711f2 100644 --- a/server/levels/sessions/level_session_handler.coffee +++ b/server/levels/sessions/level_session_handler.coffee @@ -9,10 +9,11 @@ class LevelSessionHandler extends Handler editableProperties: ['multiplayer', 'players', 'code', 'completed', 'state', 'levelName', 'creatorName', 'levelID', 'screenshot', 'chat', 'teamSpells', 'submitted', 'unsubscribed'] + jsonSchema: require '../../../app/schemas/models/level_session' getByRelationship: (req, res, args...) -> return @getActiveSessions req, res if args.length is 2 and args[1] is 'active' - return @sendNotFoundError(res) + super(arguments...) getActiveSessions: (req, res) -> return @sendUnauthorizedError(res) unless req.user.isAdmin() diff --git a/server/levels/systems/LevelSystem.coffee b/server/levels/systems/LevelSystem.coffee index cf21f7355..f945aaa95 100644 --- a/server/levels/systems/LevelSystem.coffee +++ b/server/levels/systems/LevelSystem.coffee @@ -1,6 +1,6 @@ mongoose = require('mongoose') plugins = require('../../plugins/plugins') -jsonschema = require('./level_system_schema') +jsonschema = require('../../../app/schemas/models/level_system') LevelSystemSchema = new mongoose.Schema { description: String @@ -10,6 +10,7 @@ LevelSystemSchema.plugin(plugins.NamedPlugin) LevelSystemSchema.plugin(plugins.PermissionsPlugin) LevelSystemSchema.plugin(plugins.VersionedPlugin) LevelSystemSchema.plugin(plugins.SearchablePlugin, {searchable: ['name', 'description']}) +LevelSystemSchema.plugin(plugins.PatchablePlugin) LevelSystemSchema.pre 'init', (next) -> return next() unless jsonschema.properties? diff --git a/server/levels/systems/level_system_handler.coffee b/server/levels/systems/level_system_handler.coffee index 1b1e511c1..bf1bb39d5 100644 --- a/server/levels/systems/level_system_handler.coffee +++ b/server/levels/systems/level_system_handler.coffee @@ -13,6 +13,7 @@ LevelSystemHandler = class LevelSystemHandler extends Handler 'configSchema' ] postEditableProperties: ['name'] + jsonSchema: require '../../../app/schemas/models/level_system' getEditableProperties: (req, document) -> props = super(req, document) diff --git a/server/levels/thangs/ThangType.coffee b/server/levels/thangs/ThangType.coffee index 92915e8d0..292597719 100644 --- a/server/levels/thangs/ThangType.coffee +++ b/server/levels/thangs/ThangType.coffee @@ -5,8 +5,9 @@ ThangTypeSchema = new mongoose.Schema({ body: String, }, {strict: false}) -ThangTypeSchema.plugin(plugins.NamedPlugin) -ThangTypeSchema.plugin(plugins.VersionedPlugin) -ThangTypeSchema.plugin(plugins.SearchablePlugin, {searchable: ['name']}) +ThangTypeSchema.plugin plugins.NamedPlugin +ThangTypeSchema.plugin plugins.VersionedPlugin +ThangTypeSchema.plugin plugins.SearchablePlugin, {searchable: ['name']} +ThangTypeSchema.plugin plugins.PatchablePlugin module.exports = mongoose.model('thang.type', ThangTypeSchema) diff --git a/server/levels/thangs/thang_type_handler.coffee b/server/levels/thangs/thang_type_handler.coffee index a446b56be..abdecd529 100644 --- a/server/levels/thangs/thang_type_handler.coffee +++ b/server/levels/thangs/thang_type_handler.coffee @@ -3,6 +3,7 @@ Handler = require('../../commons/Handler') ThangTypeHandler = class ThangTypeHandler extends Handler modelClass: ThangType + jsonSchema: require '../../../app/schemas/models/thang_type' editableProperties: [ 'name', 'raw', diff --git a/server/patches/Patch.coffee b/server/patches/Patch.coffee new file mode 100644 index 000000000..df621f2a4 --- /dev/null +++ b/server/patches/Patch.coffee @@ -0,0 +1,46 @@ +mongoose = require('mongoose') +{handlers} = require '../commons/mapping' + +PatchSchema = new mongoose.Schema({}, {strict: false}) + +PatchSchema.pre 'save', (next) -> + return next() unless @isNew # patch can't be altered after creation, so only need to check data once + target = @get('target') + targetID = target.id + Handler = require '../commons/Handler' + if not Handler.isID(targetID) + err = new Error('Invalid input.') + err.response = {message:"isn't a MongoDB id.", property:'target.id'} + err.code = 422 + return next(err) + + collection = target.collection + handler = require('../' + handlers[collection]) + handler.getDocumentForIdOrSlug targetID, (err, document) => + if err + err = new Error('Server error.') + err.response = {message:'', property:'target.id'} + err.code = 500 + return next(err) + + if not document + err = new Error('Target of patch not found.') + err.response = {message:'was not found.', property:'target.id'} + err.code = 404 + return next(err) + + target.id = document.get('_id') + if handler.modelClass.schema.uses_coco_versions + target.original = document.get('original') + version = document.get('version') + target.version = _.pick document.get('version'), 'major', 'minor' + @set('target', target) + else + target.original = targetID + + patches = document.get('patches') or [] + patches.push @_id + document.set 'patches', patches + document.save (err) -> next(err) + +module.exports = mongoose.model('patch', PatchSchema) diff --git a/server/patches/patch_handler.coffee b/server/patches/patch_handler.coffee new file mode 100644 index 000000000..12a68ed9a --- /dev/null +++ b/server/patches/patch_handler.coffee @@ -0,0 +1,55 @@ +Patch = require('./Patch') +Handler = require('../commons/Handler') +schema = require '../../app/schemas/models/patch' +{handlers} = require '../commons/mapping' +mongoose = require('mongoose') + +PatchHandler = class PatchHandler extends Handler + modelClass: Patch + editableProperties: [] + postEditableProperties: ['delta', 'target', 'commitMessage'] + jsonSchema: require '../../app/schemas/models/patch' + + makeNewInstance: (req) -> + patch = super(req) + patch.set 'creator', req.user._id + patch.set 'created', new Date().toISOString() + patch.set 'status', 'pending' + patch + + getByRelationship: (req, res, args...) -> + return @setStatus(req, res, args[0]) if req.route.method is 'put' and args[1] is 'status' + super(arguments...) + + setStatus: (req, res, id) -> + newStatus = req.body.status + unless newStatus in ['rejected', 'accepted', 'withdrawn'] + return @sendBadInputError(res, "Status must be 'rejected', 'accepted', or 'withdrawn'") + + @getDocumentForIdOrSlug id, (err, patch) => + return @sendDatabaseError(res, err) if err + return @sendNotFoundError(res) unless patch? + targetInfo = patch.get('target') + targetHandler = require('../' + handlers[targetInfo.collection]) + targetModel = targetHandler.modelClass + + query = { 'original': targetInfo.original } + sort = { 'version.major': -1, 'version.minor': -1 } + targetModel.findOne(query).sort(sort).exec (err, target) => + return @sendDatabaseError(res, err) if err + return @sendNotFoundError(res) unless target? + return @sendUnauthorizedError(res) unless targetHandler.hasAccessToDocument(req, target, 'get') + + if newStatus in ['rejected', 'accepted'] + return @sendUnauthorizedError(res) unless targetHandler.hasAccessToDocument(req, target, 'put') + + if newStatus is 'withdrawn' + return @sendUnauthorizedError(res) unless req.user.get('_id').equals patch.get('creator') + + # these require callbacks + patch.update {$set:{status:newStatus}}, {}, -> + target.update {$pull:{patches:patch.get('_id')}}, {}, -> + @sendSuccess(res, null) + + +module.exports = new PatchHandler() diff --git a/server/plugins/plugins.coffee b/server/plugins/plugins.coffee index f1f224b82..5e2e9d3c5 100644 --- a/server/plugins/plugins.coffee +++ b/server/plugins/plugins.coffee @@ -2,6 +2,10 @@ mongoose = require('mongoose') User = require('../users/User') textSearch = require('mongoose-text-search') +module.exports.PatchablePlugin = (schema) -> + schema.is_patchable = true + schema.index({'target.original':1, 'status':'1', 'created':-1}) + module.exports.NamedPlugin = (schema) -> schema.add({name: String, slug: String}) schema.index({'slug': 1}, {unique: true, sparse: true, name: 'slug index'}) @@ -22,13 +26,11 @@ module.exports.NamedPlugin = (schema) -> schema.methods.checkSlugConflicts = (done) -> slug = @get('slug') - try - id = mongoose.Types.ObjectId.createFromHexString(slug) + if slug.length is 24 and slug.match(/[a-f0-9]/gi)?.length is 24 err = new Error('Bad name.') - err.response = {message:'cannot be like a MondoDB id, Mr Hacker.', property:'name'} + err.response = {message: 'cannot be like a MongoDB ID, Mr. Hacker.', property: 'name'} err.code = 422 done(err) - catch e query = { slug:slug } diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee index cd4670708..db4dd1609 100644 --- a/server/queues/scoring.coffee +++ b/server/queues/scoring.coffee @@ -36,7 +36,7 @@ module.exports.messagesInQueueCount = (req, res) -> module.exports.addPairwiseTaskToQueueFromRequest = (req, res) -> taskPair = req.body.sessions - addPairwiseTaskToQueue req.body.sessions (err, success) -> + addPairwiseTaskToQueue req.body.sessions, (err, success) -> if err? then return errors.serverError res, "There was an error adding pairwise tasks: #{err}" sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"} @@ -113,7 +113,6 @@ module.exports.createNewTask = (req, res) -> updateSessionToSubmit fetchInitialSessionsToRankAgainst.bind(@, requestLevelMajorVersion, originalLevelID) generateAndSendTaskPairsToTheQueue - ], (err, successMessageObject) -> if err? then return errors.serverError res, "There was an error submitting the game to the queue:#{err}" sendResponseObject req, res, successMessageObject @@ -188,15 +187,16 @@ fetchInitialSessionsToRankAgainst = (levelMajorVersion, levelID, submittedSessio submittedCode: $exists: true team: opposingTeam - + sortParameters = totalScore: 1 limitNumber = 1 - - query = LevelSession.find(findParameters) - .sort(sortParameters) - .limit(limitNumber) + query = LevelSession.aggregate [ + {$match: findParameters} + {$sort: sortParameters} + {$limit: limitNumber} + ] query.exec (err, sessionToRankAgainst) -> callback err, sessionToRankAgainst, submittedSession @@ -206,6 +206,8 @@ generateAndSendTaskPairsToTheQueue = (sessionToRankAgainst,submittedSession, cal taskPairs = generateTaskPairs(sessionToRankAgainst, submittedSession) sendEachTaskPairToTheQueue taskPairs, (taskPairError) -> if taskPairError? then return callback taskPairError + console.log "Sent task pairs to the queue!" + console.log taskPairs callback null, {"message": "All task pairs were succesfully sent to the queue"} @@ -580,7 +582,8 @@ sendEachTaskPairToTheQueue = (taskPairs, callback) -> async.each taskPairs, send generateTaskPairs = (submittedSessions, sessionToScore) -> taskPairs = [] for session in submittedSessions - session = session.toObject() + if session.toObject? + session = session.toObject() teams = ['ogres','humans'] opposingTeams = _.pull teams, sessionToScore.team if String(session._id) isnt String(sessionToScore._id) and session.team in opposingTeams diff --git a/server/routes/db.coffee b/server/routes/db.coffee index 723e15b90..beb120573 100644 --- a/server/routes/db.coffee +++ b/server/routes/db.coffee @@ -1,7 +1,6 @@ log = require 'winston' errors = require '../commons/errors' handlers = require('../commons/mapping').handlers -schemas = require('../commons/mapping').schemas mongoose = require 'mongoose' module.exports.setup = (app) -> @@ -42,14 +41,15 @@ module.exports.setup = (app) -> catch error log.error("Error trying db method #{req.route.method} route #{parts} from #{name}: #{error}") log.error(error) + log.error(error.stack) errors.notFound(res, "Route #{req.path} not found.") getSchema = (req, res, moduleName) -> try - name = schemas[moduleName.replace '.', '_'] - schema = require('../' + name) + name = moduleName.replace '.', '_' + schema = require('../../app/schemas/models/' + name) - res.send(schema) + res.send(JSON.stringify(schema, null, '\t')) res.end() catch error diff --git a/server/routes/file.coffee b/server/routes/file.coffee index 7a16c3709..f01f635e3 100644 --- a/server/routes/file.coffee +++ b/server/routes/file.coffee @@ -19,7 +19,7 @@ fileGet = (req, res) -> objectId = mongoose.Types.ObjectId(path) query = objectId catch e - path = path.split('/') + path = path.split('/') filename = path[path.length-1] path = path[...path.length-1].join('/') query = @@ -34,7 +34,7 @@ fileGet = (req, res) -> res.setHeader('Content-Type', 'text/json') res.send(results) res.end() - + else Grid.gfs.collection('media').findOne query, (err, filedata) => return errors.notFound(res) if not filedata @@ -42,7 +42,7 @@ fileGet = (req, res) -> if req.headers['if-modified-since'] is filedata.uploadDate res.status(304) return res.end() - + res.setHeader('Content-Type', filedata.contentType) res.setHeader('Last-Modified', filedata.uploadDate) res.setHeader('Cache-Control', 'public') @@ -70,7 +70,7 @@ postFileSchema = required: ['filename', 'mimetype', 'path'] filePost = (req, res) -> - return errors.forbidden(res) unless req.user?.isAdmin() + return errors.forbidden(res) unless req.user options = req.body tv4 = require('tv4').tv4 valid = tv4.validate(options, postFileSchema) @@ -83,7 +83,8 @@ filePost = (req, res) -> saveURL = (req, res) -> options = createPostOptions(req) - checkExistence options, res, req.body.force, (err) -> + force = req.user.isAdmin() and req.body.force + checkExistence options, res, force, (err) -> return errors.serverError(res) if err writestream = Grid.gfs.createWriteStream(options) request(req.body.url).pipe(writestream) @@ -91,7 +92,8 @@ saveURL = (req, res) -> saveFile = (req, res) -> options = createPostOptions(req) - checkExistence options, res, req.body.force, (err) -> + force = req.user.isAdmin() and req.body.force + checkExistence options, res, force, (err) -> return if err writestream = Grid.gfs.createWriteStream(options) f = req.files[req.body.postName] @@ -101,7 +103,8 @@ saveFile = (req, res) -> savePNG = (req, res) -> options = createPostOptions(req) - checkExistence options, res, req.body.force, (err) -> + force = req.user.isAdmin() and req.body.force + checkExistence options, res, force, (err) -> return errors.serverError(res) if err writestream = Grid.gfs.createWriteStream(options) img = new Buffer(req.body.b64png, 'base64') @@ -143,11 +146,11 @@ createPostOptions = (req) -> unless req.body.name name = req.body.filename.split('.')[0] req.body.name = _.str.humanize(name) - + path = req.body.path or '' path = path[1...] if path and path[0] is '/' path = path[...path.length-2] if path and path[path.length-1] is '/' - + options = mode: 'w' filename: req.body.filename @@ -158,6 +161,6 @@ createPostOptions = (req) -> name: req.body.name path: path creator: ''+req.user._id - options.metadata.description = req.body.description if req.body.description? + options.metadata.description = req.body.description if req.body.description? options diff --git a/server/sendwithus.coffee b/server/sendwithus.coffee index ad7a07500..bda58d896 100644 --- a/server/sendwithus.coffee +++ b/server/sendwithus.coffee @@ -9,6 +9,8 @@ module.exports.setupRoutes = (app) -> debug = not config.isProduction module.exports.api = new sendwithusAPI swuAPIKey, debug +if config.unittest + module.exports.api.send = -> module.exports.templates = welcome_email: 'utnGaBHuSU4Hmsi7qrAypU' ladder_update_email: 'JzaZxf39A4cKMxpPZUfWy4' diff --git a/server/users/User.coffee b/server/users/User.coffee index 28009e610..0d3c42a92 100644 --- a/server/users/User.coffee +++ b/server/users/User.coffee @@ -1,5 +1,5 @@ mongoose = require('mongoose') -jsonschema = require('./user_schema') +jsonschema = require('../../app/schemas/models/user') crypto = require('crypto') {salt, isProduction} = require('../../server_config') mail = require '../commons/mail' diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee index cd78dad9e..9023e3d94 100644 --- a/server/users/user_handler.coffee +++ b/server/users/user_handler.coffee @@ -1,4 +1,4 @@ -schema = require './user_schema' +schema = require '../../app/schemas/models/user' crypto = require 'crypto' request = require 'request' User = require './User' @@ -175,6 +175,7 @@ UserHandler = class UserHandler extends Handler return @getLevelSessions(req, res, args[0]) if args[1] is 'level.sessions' return @getCandidates(req, res) if args[1] is 'candidates' return @sendNotFoundError(res) + super(arguments...) agreeToCLA: (req, res) -> return @sendUnauthorizedError(res) unless req.user @@ -232,9 +233,9 @@ UserHandler = class UserHandler extends Handler obj = _.pick document.toObject(), fields obj.photoURL ||= obj.jobProfile.photoURL if authorized obj.photoURL ||= @buildGravatarURL document if authorized - subfields = ['country', 'city', 'lookingFor', 'skills', 'experience', 'updated'] + subfields = ['country', 'city', 'lookingFor', 'jobTitle', 'skills', 'experience', 'updated'] if authorized - subfields = subfields.concat ['name', 'work'] + subfields = subfields.concat ['name'] obj.jobProfile = _.pick obj.jobProfile, subfields obj diff --git a/test/server/common.coffee b/test/server/common.coffee index d88fa21e8..e68c27b72 100644 --- a/test/server/common.coffee +++ b/test/server/common.coffee @@ -10,6 +10,7 @@ _.mixin(_.str.exports()) GLOBAL.mongoose = require 'mongoose' mongoose.connect('mongodb://localhost/coco_unittest') path = require('path') +GLOBAL.testing = true models_path = [ '../../server/articles/Article' @@ -19,6 +20,7 @@ models_path = [ '../../server/levels/sessions/LevelSession' '../../server/levels/thangs/LevelThangType' '../../server/users/User' + '../../server/patches/Patch' ] for m in models_path @@ -78,11 +80,8 @@ unittest.getUser = (email, password, done, force) -> req = request.post(getURL('/db/user'), (err, response, body) -> throw err if err User.findOne({email:email}).exec((err, user) -> - if password is '80yqxpb38j' - user.set('permissions', [ 'admin' ]) - user.save (err) -> - wrapUpGetUser(email, user, done) - else + user.set('permissions', if password is '80yqxpb38j' then [ 'admin' ] else []) + user.save (err) -> wrapUpGetUser(email, user, done) ) ) diff --git a/test/server/functional/auth.spec.coffee b/test/server/functional/auth.spec.coffee index 18c3c7fc8..750f4997e 100644 --- a/test/server/functional/auth.spec.coffee +++ b/test/server/functional/auth.spec.coffee @@ -55,7 +55,7 @@ describe '/auth/login', -> it 'rejects wrong passwords', (done) -> req = request.post(urlLogin, (error, response) -> expect(response.statusCode).toBe(401) - expect(response.body.indexOf("wrong, wrong")).toBeGreaterThan(-1) + expect(response.body.indexOf("wrong")).toBeGreaterThan(-1) done() ) form = req.form() @@ -96,7 +96,6 @@ describe '/auth/reset', -> it 'resets user password', (done) -> req = request.post(urlReset, (error, response) -> expect(response).toBeDefined() - console.log 'status code is', response.statusCode expect(response.statusCode).toBe(200) expect(response.body).toBeDefined() passwordReset = response.body diff --git a/test/server/functional/level.spec.coffee b/test/server/functional/level.spec.coffee index 13dc6425a..edd163d0d 100644 --- a/test/server/functional/level.spec.coffee +++ b/test/server/functional/level.spec.coffee @@ -6,6 +6,9 @@ describe 'Level', -> name: "King's Peak 3" description: 'Climb a mountain.' permissions: simplePermissions + scripts: [] + thangs: [] + documentation: {specificArticles:[], generalArticles:[]} urlLevel = '/db/level' diff --git a/test/server/functional/level_component.spec.coffee b/test/server/functional/level_component.spec.coffee index 4850d834c..9127ccefd 100644 --- a/test/server/functional/level_component.spec.coffee +++ b/test/server/functional/level_component.spec.coffee @@ -3,11 +3,14 @@ require '../common' describe 'LevelComponent', -> component = - name:'Bashes Everything' + name:'BashesEverything' description:'Makes the unit uncontrollably bash anything bashable, using the bash system.' code: 'bash();' - language: 'javascript' + language: 'coffeescript' permissions:simplePermissions + propertyDocumentation: [] + system: 'ai' + dependencies: [] components = {} @@ -45,7 +48,7 @@ describe 'LevelComponent', -> it 'have a unique name.', (done) -> loginAdmin -> request.post {uri:url, json:component}, (err, res, body) -> - expect(res.statusCode).toBe(422) + expect(res.statusCode).toBe(409) done() it 'can be read by an admin.', (done) -> diff --git a/test/server/functional/level_system.spec.coffee b/test/server/functional/level_system.spec.coffee index 32ca61df1..229c3a39d 100644 --- a/test/server/functional/level_system.spec.coffee +++ b/test/server/functional/level_system.spec.coffee @@ -11,6 +11,8 @@ describe 'LevelSystem', -> """ language: 'coffeescript' permissions:simplePermissions + dependencies: [] + propertyDocumentation: [] systems = {} @@ -48,7 +50,7 @@ describe 'LevelSystem', -> it 'have a unique name.', (done) -> loginAdmin -> request.post {uri:url, json:system}, (err, res, body) -> - expect(res.statusCode).toBe(422) + expect(res.statusCode).toBe(409) done() it 'can be read by an admin.', (done) -> diff --git a/test/server/functional/patch.spec.coffee b/test/server/functional/patch.spec.coffee new file mode 100644 index 000000000..d8694baf0 --- /dev/null +++ b/test/server/functional/patch.spec.coffee @@ -0,0 +1,118 @@ +require '../common' + +describe '/db/patch', -> + request = require 'request' + it 'clears the db first', (done) -> + clearModels [User, Article, Patch], (err) -> + throw err if err + done() + + article = {name: 'Yo', body:'yo ma'} + articleURL = getURL('/db/article') + articles = {} + + patchURL = getURL('/db/patch') + patches = {} + patch = + commitMessage: 'Accept this patch!' + delta: {name:['test']} + target: + id:null + collection: 'article' + + it 'creates an Article to patch', (done) -> + loginAdmin -> + request.post {uri:articleURL, json:patch}, (err, res, body) -> + articles[0] = body + patch.target.id = articles[0]._id + done() + + it "allows someone to submit a patch to something they don't control", (done) -> + loginJoe (joe) -> + request.post {uri: patchURL, json: patch}, (err, res, body) -> + expect(res.statusCode).toBe(200) + expect(body.target.original).toBeDefined() + expect(body.target.version.major).toBeDefined() + expect(body.target.version.minor).toBeDefined() + expect(body.status).toBe('pending') + expect(body.created).toBeDefined() + expect(body.creator).toBe(joe.id) + patches[0] = body + done() + + it 'adds a patch to the target document', (done) -> + Article.findOne({}).exec (err, article) -> + expect(article.toObject().patches[0]).toBeDefined() + done() + + it 'shows up in patch requests', (done) -> + patchesURL = getURL("/db/article/#{articles[0]._id}/patches") + request.get {uri: patchesURL}, (err, res, body) -> + body = JSON.parse(body) + expect(res.statusCode).toBe(200) + expect(body.length).toBe(1) + done() + + it 'allows you to set yourself as listening', (done) -> + listeningURL = getURL("/db/article/#{articles[0]._id}/listen") + request.put {uri: listeningURL, json: {on:true}}, (err, res, body) -> + expect(body.listeners[0]).toBeDefined() + done() + + it 'added the listener to the target document', (done) -> + Article.findOne({}).exec (err, article) -> + expect(article.toObject().listeners[0]).toBeDefined() + done() + + it 'does not add duplicate listeners', (done) -> + listeningURL = getURL("/db/article/#{articles[0]._id}/listen") + request.put {uri: listeningURL, json: {on:true}}, (err, res, body) -> + expect(body.listeners.length).toBe(1) + done() + + it 'allows removing yourself', (done) -> + listeningURL = getURL("/db/article/#{articles[0]._id}/listen") + request.put {uri: listeningURL, json: {on:false}}, (err, res, body) -> + expect(body.listeners.length).toBe(0) + done() + + it 'allows the submitter to withdraw the pull request', (done) -> + statusURL = getURL("/db/patch/#{patches[0]._id}/status") + request.put {uri: statusURL, json: {status:'withdrawn'}}, (err, res, body) -> + expect(res.statusCode).toBe(200) + Patch.findOne({}).exec (err, article) -> + expect(article.get('status')).toBe 'withdrawn' + Article.findOne({}).exec (err, article) -> + expect(article.toObject().patches.length).toBe(0) + done() + + it 'does not allow the submitter to reject or accept the pull request', (done) -> + statusURL = getURL("/db/patch/#{patches[0]._id}/status") + request.put {uri: statusURL, json: {status:'rejected'}}, (err, res, body) -> + expect(res.statusCode).toBe(403) + request.put {uri: statusURL, json: {status:'accepted'}}, (err, res, body) -> + expect(res.statusCode).toBe(403) + Patch.findOne({}).exec (err, article) -> + expect(article.get('status')).toBe 'withdrawn' + done() + + it 'allows the recipient to accept or reject the pull request', (done) -> + statusURL = getURL("/db/patch/#{patches[0]._id}/status") + loginAdmin -> + request.put {uri: statusURL, json: {status:'rejected'}}, (err, res, body) -> + expect(res.statusCode).toBe(200) + Patch.findOne({}).exec (err, article) -> + expect(article.get('status')).toBe 'rejected' + request.put {uri: statusURL, json: {status:'accepted'}}, (err, res, body) -> + expect(res.statusCode).toBe(200) + Patch.findOne({}).exec (err, article) -> + expect(article.get('status')).toBe 'accepted' + done() + + it 'does not allow the recipient to withdraw the pull request', (done) -> + statusURL = getURL("/db/patch/#{patches[0]._id}/status") + request.put {uri: statusURL, json: {status:'withdrawn'}}, (err, res, body) -> + expect(res.statusCode).toBe(403) + Patch.findOne({}).exec (err, article) -> + expect(article.get('status')).toBe 'accepted' + done() \ No newline at end of file diff --git a/vendor/scripts/backbone-mediator.js b/vendor/scripts/backbone-mediator.js deleted file mode 100644 index 8e216e5f6..000000000 --- a/vendor/scripts/backbone-mediator.js +++ /dev/null @@ -1,203 +0,0 @@ -/** - * |-------------------| - * | Backbone-Mediator | - * |-------------------| - * Backbone-Mediator is freely distributable under the MIT license. - * - * <a href="https://github.com/chalbert/Backbone-Mediator">More details & documentation</a> - * - * @author Nicolas Gilbert - * - * @requires _ - * @requires Backbone - */ -(function(factory){ - 'use strict'; - - if (typeof define === 'function' && define.amd) { - define(['underscore', 'backbone'], factory); - } else { - factory(_, Backbone); - } - -})(function (_, Backbone){ - 'use strict'; - - /** - * @static - */ - var channels = {}, - Subscriber, - /** @borrows Backbone.View#delegateEvents */ - delegateEvents = Backbone.View.prototype.delegateEvents, - /** @borrows Backbone.View#delegateEvents */ - undelegateEvents = Backbone.View.prototype.undelegateEvents; - - /** - * @class - */ - Backbone.Mediator = { - - /** - * Subscribe to a channel - * - * @param channel - */ - subscribe: function(channel, subscription, context, once) { - if (!channels[channel]) channels[channel] = []; - channels[channel].push({fn: subscription, context: context || this, once: once}); - }, - - /** - * Trigger all callbacks for a channel - * - * @param channel - * @params N Extra parametter to pass to handler - */ - publish: function(channel) { - if (!channels[channel]) return; - - var args = [].slice.call(arguments, 1), - subscription; - - for (var i = 0; i < channels[channel].length; i++) { - subscription = channels[channel][i]; - subscription.fn.apply(subscription.context, args); - if (subscription.once) { - Backbone.Mediator.unsubscribe(channel, subscription.fn, subscription.context); - i--; - } - } - }, - - /** - * Cancel subscription - * - * @param channel - * @param fn - * @param context - */ - - unsubscribe: function(channel, fn, context){ - if (!channels[channel]) return; - - var subscription; - for (var i = 0; i < channels[channel].length; i++) { - subscription = channels[channel][i]; - if (subscription.fn === fn && subscription.context === context) { - channels[channel].splice(i, 1); - i--; - } - } - }, - - /** - * Subscribing to one event only - * - * @param channel - * @param subscription - * @param context - */ - subscribeOnce: function (channel, subscription, context) { - Backbone.Mediator.subscribe(channel, subscription, context, true); - } - - }; - - Backbone.Mediator.channels = channels; - - /** - * Allow to define convention-based subscriptions - * as an 'subscriptions' hash on a view. Subscriptions - * can then be easily setup and cleaned. - * - * @class - */ - - - Subscriber = { - - /** - * Extend delegateEvents() to set subscriptions - */ - delegateEvents: function(){ - delegateEvents.apply(this, arguments); - this.setSubscriptions(); - }, - - /** - * Extend undelegateEvents() to unset subscriptions - */ - undelegateEvents: function(){ - undelegateEvents.apply(this, arguments); - this.unsetSubscriptions(); - }, - - /** @property {Object} List of subscriptions, to be defined */ - subscriptions: {}, - - /** - * Subscribe to each subscription - * @param {Object} [subscriptions] An optional hash of subscription to add - */ - - setSubscriptions: function(subscriptions){ - if (subscriptions) _.extend(this.subscriptions || {}, subscriptions); - subscriptions = subscriptions || this.subscriptions; - if (!subscriptions || _.isEmpty(subscriptions)) return; - // Just to be sure we don't set duplicate - this.unsetSubscriptions(subscriptions); - - _.each(subscriptions, function(subscription, channel){ - var once; - if (subscription.$once) { - subscription = subscription.$once; - once = true; - } - if (_.isString(subscription)) { - subscription = this[subscription]; - } - Backbone.Mediator.subscribe(channel, subscription, this, once); - }, this); - }, - - /** - * Unsubscribe to each subscription - * @param {Object} [subscriptions] An optional hash of subscription to remove - */ - unsetSubscriptions: function(subscriptions){ - subscriptions = subscriptions || this.subscriptions; - if (!subscriptions || _.isEmpty(subscriptions)) return; - _.each(subscriptions, function(subscription, channel){ - if (_.isString(subscription)) { - subscription = this[subscription]; - } - Backbone.Mediator.unsubscribe(channel, subscription.$once || subscription, this); - }, this); - } - }; - - /** - * @lends Backbone.View.prototype - */ - _.extend(Backbone.View.prototype, Subscriber); - - /** - * @lends Backbone.Mediator - */ - _.extend(Backbone.Mediator, { - /** - * Shortcut for publish - * @function - */ - pub: Backbone.Mediator.publish, - /** - * Shortcut for subscribe - * @function - */ - sub: Backbone.Mediator.subscribe - }); - - return Backbone; - -}); \ No newline at end of file diff --git a/vendor/scripts/difflib.js b/vendor/scripts/difflib.js new file mode 100644 index 000000000..191fe4563 --- /dev/null +++ b/vendor/scripts/difflib.js @@ -0,0 +1,413 @@ +/*** +This is part of jsdifflib v1.0. <http://snowtide.com/jsdifflib> + +Copyright (c) 2007, Snowtide Informatics Systems, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Snowtide Informatics Systems nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +***/ +/* Author: Chas Emerick <cemerick@snowtide.com> */ +var __whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true}; + +var difflib = { + defaultJunkFunction: function (c) { + return __whitespace.hasOwnProperty(c); + }, + + stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); }, + + stringAsLines: function (str) { + var lfpos = str.indexOf("\n"); + var crpos = str.indexOf("\r"); + var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r"; + + var lines = str.split(linebreak); + for (var i = 0; i < lines.length; i++) { + lines[i] = difflib.stripLinebreaks(lines[i]); + } + + return lines; + }, + + // iteration-based reduce implementation + __reduce: function (func, list, initial) { + if (initial != null) { + var value = initial; + var idx = 0; + } else if (list) { + var value = list[0]; + var idx = 1; + } else { + return null; + } + + for (; idx < list.length; idx++) { + value = func(value, list[idx]); + } + + return value; + }, + + // comparison function for sorting lists of numeric tuples + __ntuplecomp: function (a, b) { + var mlen = Math.max(a.length, b.length); + for (var i = 0; i < mlen; i++) { + if (a[i] < b[i]) return -1; + if (a[i] > b[i]) return 1; + } + + return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1); + }, + + __calculate_ratio: function (matches, length) { + return length ? 2.0 * matches / length : 1.0; + }, + + // returns a function that returns true if a key passed to the returned function + // is in the dict (js object) provided to this function; replaces being able to + // carry around dict.has_key in python... + __isindict: function (dict) { + return function (key) { return dict.hasOwnProperty(key); }; + }, + + // replacement for python's dict.get function -- need easy default values + __dictget: function (dict, key, defaultValue) { + return dict.hasOwnProperty(key) ? dict[key] : defaultValue; + }, + + SequenceMatcher: function (a, b, isjunk) { + this.set_seqs = function (a, b) { + this.set_seq1(a); + this.set_seq2(b); + } + + this.set_seq1 = function (a) { + if (a == this.a) return; + this.a = a; + this.matching_blocks = this.opcodes = null; + } + + this.set_seq2 = function (b) { + if (b == this.b) return; + this.b = b; + this.matching_blocks = this.opcodes = this.fullbcount = null; + this.__chain_b(); + } + + this.__chain_b = function () { + var b = this.b; + var n = b.length; + var b2j = this.b2j = {}; + var populardict = {}; + for (var i = 0; i < b.length; i++) { + var elt = b[i]; + if (b2j.hasOwnProperty(elt)) { + var indices = b2j[elt]; + if (n >= 200 && indices.length * 100 > n) { + populardict[elt] = 1; + delete b2j[elt]; + } else { + indices.push(i); + } + } else { + b2j[elt] = [i]; + } + } + + for (var elt in populardict) { + if (populardict.hasOwnProperty(elt)) { + delete b2j[elt]; + } + } + + var isjunk = this.isjunk; + var junkdict = {}; + if (isjunk) { + for (var elt in populardict) { + if (populardict.hasOwnProperty(elt) && isjunk(elt)) { + junkdict[elt] = 1; + delete populardict[elt]; + } + } + for (var elt in b2j) { + if (b2j.hasOwnProperty(elt) && isjunk(elt)) { + junkdict[elt] = 1; + delete b2j[elt]; + } + } + } + + this.isbjunk = difflib.__isindict(junkdict); + this.isbpopular = difflib.__isindict(populardict); + } + + this.find_longest_match = function (alo, ahi, blo, bhi) { + var a = this.a; + var b = this.b; + var b2j = this.b2j; + var isbjunk = this.isbjunk; + var besti = alo; + var bestj = blo; + var bestsize = 0; + var j = null; + var k; + + var j2len = {}; + var nothing = []; + for (var i = alo; i < ahi; i++) { + var newj2len = {}; + var jdict = difflib.__dictget(b2j, a[i], nothing); + for (var jkey in jdict) { + if (jdict.hasOwnProperty(jkey)) { + j = jdict[jkey]; + if (j < blo) continue; + if (j >= bhi) break; + newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1; + if (k > bestsize) { + besti = i - k + 1; + bestj = j - k + 1; + bestsize = k; + } + } + } + j2len = newj2len; + } + + while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { + besti--; + bestj--; + bestsize++; + } + + while (besti + bestsize < ahi && bestj + bestsize < bhi && + !isbjunk(b[bestj + bestsize]) && + a[besti + bestsize] == b[bestj + bestsize]) { + bestsize++; + } + + while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { + besti--; + bestj--; + bestsize++; + } + + while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) && + a[besti + bestsize] == b[bestj + bestsize]) { + bestsize++; + } + + return [besti, bestj, bestsize]; + } + + this.get_matching_blocks = function () { + if (this.matching_blocks != null) return this.matching_blocks; + var la = this.a.length; + var lb = this.b.length; + + var queue = [[0, la, 0, lb]]; + var matching_blocks = []; + var alo, ahi, blo, bhi, qi, i, j, k, x; + while (queue.length) { + qi = queue.pop(); + alo = qi[0]; + ahi = qi[1]; + blo = qi[2]; + bhi = qi[3]; + x = this.find_longest_match(alo, ahi, blo, bhi); + i = x[0]; + j = x[1]; + k = x[2]; + + if (k) { + matching_blocks.push(x); + if (alo < i && blo < j) + queue.push([alo, i, blo, j]); + if (i+k < ahi && j+k < bhi) + queue.push([i + k, ahi, j + k, bhi]); + } + } + + matching_blocks.sort(difflib.__ntuplecomp); + + var i1 = 0, j1 = 0, k1 = 0, block = 0; + var i2, j2, k2; + var non_adjacent = []; + for (var idx in matching_blocks) { + if (matching_blocks.hasOwnProperty(idx)) { + block = matching_blocks[idx]; + i2 = block[0]; + j2 = block[1]; + k2 = block[2]; + if (i1 + k1 == i2 && j1 + k1 == j2) { + k1 += k2; + } else { + if (k1) non_adjacent.push([i1, j1, k1]); + i1 = i2; + j1 = j2; + k1 = k2; + } + } + } + + if (k1) non_adjacent.push([i1, j1, k1]); + + non_adjacent.push([la, lb, 0]); + this.matching_blocks = non_adjacent; + return this.matching_blocks; + } + + this.get_opcodes = function () { + if (this.opcodes != null) return this.opcodes; + var i = 0; + var j = 0; + var answer = []; + this.opcodes = answer; + var block, ai, bj, size, tag; + var blocks = this.get_matching_blocks(); + for (var idx in blocks) { + if (blocks.hasOwnProperty(idx)) { + block = blocks[idx]; + ai = block[0]; + bj = block[1]; + size = block[2]; + tag = ''; + if (i < ai && j < bj) { + tag = 'replace'; + } else if (i < ai) { + tag = 'delete'; + } else if (j < bj) { + tag = 'insert'; + } + if (tag) answer.push([tag, i, ai, j, bj]); + i = ai + size; + j = bj + size; + + if (size) answer.push(['equal', ai, i, bj, j]); + } + } + + return answer; + } + + // this is a generator function in the python lib, which of course is not supported in javascript + // the reimplementation builds up the grouped opcodes into a list in their entirety and returns that. + this.get_grouped_opcodes = function (n) { + if (!n) n = 3; + var codes = this.get_opcodes(); + if (!codes) codes = [["equal", 0, 1, 0, 1]]; + var code, tag, i1, i2, j1, j2; + if (codes[0][0] == 'equal') { + code = codes[0]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2]; + } + if (codes[codes.length - 1][0] == 'equal') { + code = codes[codes.length - 1]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]; + } + + var nn = n + n; + var group = []; + var groups = []; + for (var idx in codes) { + if (codes.hasOwnProperty(idx)) { + code = codes[idx]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + if (tag == 'equal' && i2 - i1 > nn) { + group.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]); + groups.push(group); + group = []; + i1 = Math.max(i1, i2-n); + j1 = Math.max(j1, j2-n); + } + + group.push([tag, i1, i2, j1, j2]); + } + } + + if (group && !(group.length == 1 && group[0][0] == 'equal')) groups.push(group) + + return groups; + } + + this.ratio = function () { + matches = difflib.__reduce( + function (sum, triple) { return sum + triple[triple.length - 1]; }, + this.get_matching_blocks(), 0); + return difflib.__calculate_ratio(matches, this.a.length + this.b.length); + } + + this.quick_ratio = function () { + var fullbcount, elt; + if (this.fullbcount == null) { + this.fullbcount = fullbcount = {}; + for (var i = 0; i < this.b.length; i++) { + elt = this.b[i]; + fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1; + } + } + fullbcount = this.fullbcount; + + var avail = {}; + var availhas = difflib.__isindict(avail); + var matches = numb = 0; + for (var i = 0; i < this.a.length; i++) { + elt = this.a[i]; + if (availhas(elt)) { + numb = avail[elt]; + } else { + numb = difflib.__dictget(fullbcount, elt, 0); + } + avail[elt] = numb - 1; + if (numb > 0) matches++; + } + + return difflib.__calculate_ratio(matches, this.a.length + this.b.length); + } + + this.real_quick_ratio = function () { + var la = this.a.length; + var lb = this.b.length; + return _calculate_ratio(Math.min(la, lb), la + lb); + } + + this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction; + this.a = this.b = null; + this.set_seqs(a, b); + } +}; + diff --git a/vendor/scripts/diffview.js b/vendor/scripts/diffview.js new file mode 100644 index 000000000..372753d84 --- /dev/null +++ b/vendor/scripts/diffview.js @@ -0,0 +1,198 @@ +/* +This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib> + +Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Chas Emerick. +*/ +diffview = { + /** + * Builds and returns a visual diff view. The single parameter, `params', should contain + * the following values: + * + * - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher + * - newTextLines: the array of strings that was used as the new text input to SequenceMatcher + * - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes() + * - baseTextName: the title to be displayed above the base text listing in the diff view; defaults + * to "Base Text" + * - newTextName: the title to be displayed above the new text listing in the diff view; defaults + * to "New Text" + * - contextSize: the number of lines of context to show around differences; by default, all lines + * are shown + * - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is + * generated + */ + buildView: function (params) { + var baseTextLines = params.baseTextLines; + var newTextLines = params.newTextLines; + var opcodes = params.opcodes; + var baseTextName = params.baseTextName ? params.baseTextName : "Base Text"; + var newTextName = params.newTextName ? params.newTextName : "New Text"; + var contextSize = params.contextSize; + var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0; + + if (baseTextLines == null) + throw "Cannot build diff view; baseTextLines is not defined."; + if (newTextLines == null) + throw "Cannot build diff view; newTextLines is not defined."; + if (!opcodes) + throw "Canno build diff view; opcodes is not defined."; + + function celt (name, clazz) { + var e = document.createElement(name); + e.className = clazz; + return e; + } + + function telt (name, text) { + var e = document.createElement(name); + e.appendChild(document.createTextNode(text)); + return e; + } + + function ctelt (name, clazz, text) { + var e = document.createElement(name); + e.className = clazz; + e.appendChild(document.createTextNode(text)); + return e; + } + + var tdata = document.createElement("thead"); + var node = document.createElement("tr"); + tdata.appendChild(node); + if (inline) { + node.appendChild(document.createElement("th")); + node.appendChild(document.createElement("th")); + node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName)); + } else { + node.appendChild(document.createElement("th")); + node.appendChild(ctelt("th", "texttitle", baseTextName)); + node.appendChild(document.createElement("th")); + node.appendChild(ctelt("th", "texttitle", newTextName)); + } + tdata = [tdata]; + + var rows = []; + var node2; + + /** + * Adds two cells to the given row; if the given row corresponds to a real + * line number (based on the line index tidx and the endpoint of the + * range in question tend), then the cells will contain the line number + * and the line of text from textLines at position tidx (with the class of + * the second cell set to the name of the change represented), and tidx + 1 will + * be returned. Otherwise, tidx is returned, and two empty cells are added + * to the given row. + */ + function addCells (row, tidx, tend, textLines, change) { + if (tidx < tend) { + row.appendChild(telt("th", (tidx + 1).toString())); + row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); + return tidx + 1; + } else { + row.appendChild(document.createElement("th")); + row.appendChild(celt("td", "empty")); + return tidx; + } + } + + function addCellsInline (row, tidx, tidx2, textLines, change) { + row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString())); + row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString())); + row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); + } + + for (var idx = 0; idx < opcodes.length; idx++) { + code = opcodes[idx]; + change = code[0]; + var b = code[1]; + var be = code[2]; + var n = code[3]; + var ne = code[4]; + var rowcnt = Math.max(be - b, ne - n); + var toprows = []; + var botrows = []; + for (var i = 0; i < rowcnt; i++) { + // jump ahead if we've alredy provided leading context or if this is the first range + if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") { + var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize); + if (jump > 1) { + toprows.push(node = document.createElement("tr")); + + b += jump; + n += jump; + i += jump - 1; + node.appendChild(telt("th", "...")); + if (!inline) node.appendChild(ctelt("td", "skip", "")); + node.appendChild(telt("th", "...")); + node.appendChild(ctelt("td", "skip", "")); + + // skip last lines if they're all equal + if (idx + 1 == opcodes.length) { + break; + } else { + continue; + } + } + } + + toprows.push(node = document.createElement("tr")); + if (inline) { + if (change == "insert") { + addCellsInline(node, null, n++, newTextLines, change); + } else if (change == "replace") { + botrows.push(node2 = document.createElement("tr")); + if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete"); + if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert"); + } else if (change == "delete") { + addCellsInline(node, b++, null, baseTextLines, change); + } else { + // equal + addCellsInline(node, b++, n++, baseTextLines, change); + } + } else { + b = addCells(node, b, be, baseTextLines, change); + n = addCells(node, n, ne, newTextLines, change); + } + } + + for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]); + for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]); + } + + rows.push(node = ctelt("th", "author", "diff view generated by ")); + node.setAttribute("colspan", inline ? 3 : 4); + node.appendChild(node2 = telt("a", "jsdifflib")); + node2.setAttribute("href", "http://github.com/cemerick/jsdifflib"); + + tdata.push(node = document.createElement("tbody")); + for (var idx in rows) rows.hasOwnProperty(idx) && node.appendChild(rows[idx]); + + node = celt("table", "diff" + (inline ? " inlinediff" : "")); + for (var idx in tdata) tdata.hasOwnProperty(idx) && node.appendChild(tdata[idx]); + return node; + } +}; + diff --git a/vendor/scripts/jquery-ui-1.10.3.custom.js b/vendor/scripts/jquery-ui-1.10.4.custom.js similarity index 98% rename from vendor/scripts/jquery-ui-1.10.3.custom.js rename to vendor/scripts/jquery-ui-1.10.4.custom.js index 991276d15..0aa0374c8 100644 --- a/vendor/scripts/jquery-ui-1.10.3.custom.js +++ b/vendor/scripts/jquery-ui-1.10.4.custom.js @@ -1,7 +1,7 @@ -/*! jQuery UI - v1.10.3 - 2013-09-04 +/*! jQuery UI - v1.10.4 - 2014-04-11 * http://jqueryui.com * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.resizable.js, jquery.ui.sortable.js, jquery.ui.autocomplete.js, jquery.ui.menu.js, jquery.ui.slider.js, jquery.ui.effect.js, jquery.ui.effect-bounce.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-shake.js, jquery.ui.effect-transfer.js -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ (function( $, undefined ) { @@ -12,7 +12,7 @@ var uuid = 0, $.ui = $.ui || {}; $.extend( $.ui, { - version: "1.10.3", + version: "1.10.4", keyCode: { BACKSPACE: 8, @@ -411,7 +411,7 @@ $.widget = function( name, base, prototype ) { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, @@ -620,12 +620,12 @@ $.Widget.prototype = { curOption = curOption[ parts[ i ] ]; } key = parts.pop(); - if ( value === undefined ) { + if ( arguments.length === 1 ) { return curOption[ key ] === undefined ? null : curOption[ key ]; } curOption[ key ] = value; } else { - if ( value === undefined ) { + if ( arguments.length === 1 ) { return this.options[ key ] === undefined ? null : this.options[ key ]; } options[ key ] = value; @@ -832,7 +832,7 @@ $( document ).mouseup( function() { }); $.widget("ui.mouse", { - version: "1.10.3", + version: "1.10.4", options: { cancel: "input,textarea,button,select,option", distance: 1, @@ -1042,7 +1042,7 @@ $.position = { return cachedScrollbarWidth; } var w1, w2, - div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), + div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), innerDiv = div.children()[0]; $( "body" ).append( div ); @@ -1060,8 +1060,10 @@ $.position = { return (cachedScrollbarWidth = w1 - w2); }, getScrollInfo: function( within ) { - var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ), - overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ), + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), hasOverflowX = overflowX === "scroll" || ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), hasOverflowY = overflowY === "scroll" || @@ -1073,10 +1075,12 @@ $.position = { }, getWithinInfo: function( element ) { var withinElement = $( element || window ), - isWindow = $.isWindow( withinElement[0] ); + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; return { element: withinElement, isWindow: isWindow, + isDocument: isDocument, offset: withinElement.offset() || { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), @@ -1408,7 +1412,7 @@ $.ui.position = { } } else if ( overBottom > 0 ) { - newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { position.top += myOffset + atOffset + offset; } @@ -1478,7 +1482,7 @@ function isNumber(value) { } $.widget("ui.resizable", $.ui.mouse, { - version: "1.10.3", + version: "1.10.4", widgetEventPrefix: "resize", options: { alsoResize: false, @@ -1747,7 +1751,7 @@ $.widget("ui.resizable", $.ui.mouse, { //Store needed variables this.offset = this.helper.offset(); this.position = { left: curleft, top: curtop }; - this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.size = this._helper ? { width: this.helper.width(), height: this.helper.height() } : { width: el.width(), height: el.height() }; this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; this.originalPosition = { left: curleft, top: curtop }; this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; @@ -2228,8 +2232,8 @@ $.ui.plugin.add("resizable", "containment", { isParent = that.containerElement.get(0) === that.element.parent().get(0); isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position")); - if(isParent && isOffsetRelative) { - woset -= that.parentData.left; + if ( isParent && isOffsetRelative ) { + woset -= Math.abs( that.parentData.left ); } if (woset + that.size.width >= that.parentData.width) { @@ -2410,10 +2414,20 @@ $.ui.plugin.add("resizable", "grid", { that.size.height = newHeight; that.position.left = op.left - ox; } else { - that.size.width = newWidth; - that.size.height = newHeight; - that.position.top = op.top - oy; - that.position.left = op.left - ox; + if ( newHeight - gridY > 0 ) { + that.size.height = newHeight; + that.position.top = op.top - oy; + } else { + that.size.height = gridY; + that.position.top = op.top + os.height - gridY; + } + if ( newWidth - gridX > 0 ) { + that.size.width = newWidth; + that.position.left = op.left - ox; + } else { + that.size.width = gridX; + that.position.left = op.left + os.width - gridX; + } } } @@ -2422,8 +2436,6 @@ $.ui.plugin.add("resizable", "grid", { })(jQuery); (function( $, undefined ) { -/*jshint loopfunc: true */ - function isOverAxis( x, reference, size ) { return ( x > reference ) && ( x < ( reference + size ) ); } @@ -2433,7 +2445,7 @@ function isFloating(item) { } $.widget("ui.sortable", $.ui.mouse, { - version: "1.10.3", + version: "1.10.4", widgetEventPrefix: "sort", ready: false, options: { @@ -2774,12 +2786,12 @@ $.widget("ui.sortable", $.ui.mouse, { } // Only put the placeholder inside the current Container, skip all - // items form other containers. This works because when moving + // items from other containers. This works because when moving // an item from one container to another the // currentContainer is switched before the placeholder is moved. // - // Without this moving items in "sub-sortables" can cause the placeholder to jitter - // beetween the outer and inner container. + // Without this, moving items in "sub-sortables" can cause + // the placeholder to jitter beetween the outer and inner container. if (item.instance !== this.currentContainer) { continue; } @@ -3047,10 +3059,11 @@ $.widget("ui.sortable", $.ui.mouse, { queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]); + function addItems() { + items.push( this ); + } for (i = queries.length - 1; i >= 0; i--){ - queries[i][0].each(function() { - items.push(this); - }); + queries[i][0].each( addItems ); } return $(items); @@ -3608,12 +3621,17 @@ $.widget("ui.sortable", $.ui.mouse, { //Post events to containers + function delayEvent( type, instance, container ) { + return function( event ) { + container._trigger( type, event, instance._uiHash( instance ) ); + }; + } for (i = this.containers.length - 1; i >= 0; i--){ - if(!noPropagation) { - delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + if (!noPropagation) { + delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); } if(this.containers[i].containerCache.over) { - delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); this.containers[i].containerCache.over = 0; } } @@ -3692,11 +3710,8 @@ $.widget("ui.sortable", $.ui.mouse, { })(jQuery); (function( $, undefined ) { -// used to prevent race conditions with remote data sources -var requestIndex = 0; - $.widget( "ui.autocomplete", { - version: "1.10.3", + version: "1.10.4", defaultElement: "<input>", options: { appendTo: null, @@ -3720,6 +3735,7 @@ $.widget( "ui.autocomplete", { select: null }, + requestIndex: 0, pending: 0, _create: function() { @@ -3753,7 +3769,6 @@ $.widget( "ui.autocomplete", { this._on( this.element, { keydown: function( event ) { - /*jshint maxcomplexity:15*/ if ( this.element.prop( "readOnly" ) ) { suppressKeyPress = true; suppressInput = true; @@ -4096,19 +4111,18 @@ $.widget( "ui.autocomplete", { }, _response: function() { - var that = this, - index = ++requestIndex; + var index = ++this.requestIndex; - return function( content ) { - if ( index === requestIndex ) { - that.__response( content ); + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); } - that.pending--; - if ( !that.pending ) { - that.element.removeClass( "ui-autocomplete-loading" ); + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); } - }; + }, this ); }, __response: function( content ) { @@ -4287,7 +4301,7 @@ $.widget( "ui.autocomplete", $.ui.autocomplete, { (function( $, undefined ) { $.widget( "ui.menu", { - version: "1.10.3", + version: "1.10.4", defaultElement: "<ul>", delay: 300, options: { @@ -4346,13 +4360,18 @@ $.widget( "ui.menu", { "click .ui-menu-item:has(a)": function( event ) { var target = $( event.target ).closest( ".ui-menu-item" ); if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { - this.mouseHandled = true; - this.select( event ); + + // Only set the mouseHandled flag if the event will bubble, see #9469. + if ( !event.isPropagationStopped() ) { + this.mouseHandled = true; + } + // Open submenu on click if ( target.has( ".ui-menu" ).length ) { this.expand( event ); - } else if ( !this.element.is( ":focus" ) ) { + } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { + // Redirect focus to the menu this.element.trigger( "focus", [ true ] ); @@ -4445,7 +4464,6 @@ $.widget( "ui.menu", { }, _keydown: function( event ) { - /*jshint maxcomplexity:20*/ var match, prev, character, skip, regex, preventDefault = true; @@ -4554,6 +4572,8 @@ $.widget( "ui.menu", { icon = this.options.icons.submenu, submenus = this.element.find( this.options.menus ); + this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ); + // Initialize nested menus submenus.filter( ":not(.ui-menu)" ) .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) @@ -4654,7 +4674,7 @@ $.widget( "ui.menu", { } nested = item.children( ".ui-menu" ); - if ( nested.length && ( /^mouse/.test( event.type ) ) ) { + if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { this._startOpening(nested); } this.activeMenu = item.parent(); @@ -4897,7 +4917,7 @@ $.widget( "ui.menu", { var numPages = 5; $.widget( "ui.slider", $.ui.mouse, { - version: "1.10.3", + version: "1.10.4", widgetEventPrefix: "slide", options: { @@ -5008,7 +5028,10 @@ $.widget( "ui.slider", $.ui.mouse, { this.range.addClass( classes + ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) ); } else { - this.range = $([]); + if ( this.range ) { + this.range.remove(); + } + this.range = null; } }, @@ -5022,7 +5045,9 @@ $.widget( "ui.slider", $.ui.mouse, { _destroy: function() { this.handles.remove(); - this.range.remove(); + if ( this.range ) { + this.range.remove(); + } this.element .removeClass( "ui-slider" + @@ -5194,7 +5219,7 @@ $.widget( "ui.slider", $.ui.mouse, { } ); otherVal = this.values( index ? 0 : 1 ); if ( allowed !== false ) { - this.values( index, newVal, true ); + this.values( index, newVal ); } } } else { @@ -5466,7 +5491,6 @@ $.widget( "ui.slider", $.ui.mouse, { _handleEvents: { keydown: function( event ) { - /*jshint maxcomplexity:25*/ var allowed, curVal, newVal, step, index = $( event.target ).data( "ui-slider-handle-index" ); @@ -6432,7 +6456,7 @@ $.fn.extend({ (function() { $.extend( $.effects, { - version: "1.10.3", + version: "1.10.4", // Saves a set of properties in a data storage save: function( element, set ) { diff --git a/vendor/scripts/notify-combined.min.js b/vendor/scripts/notify-combined.min.js new file mode 100644 index 000000000..bafa7af50 --- /dev/null +++ b/vendor/scripts/notify-combined.min.js @@ -0,0 +1,5 @@ +/** Notify.js - v0.3.1 - 2014/02/06 + * http://notifyjs.com/ + * Copyright (c) 2014 Jaime Pillora - MIT + */ +(function(t,i,n,e){"use strict";var o,r,s,a,l,h,c,p,u,d,f,A,m,w,g,y,b,v,x,C,S,E,M,k,H,D,F,T=[].indexOf||function(t){for(var i=0,n=this.length;n>i;i++)if(i in this&&this[i]===t)return i;return-1};S="notify",C=S+"js",s=S+"!blank",M={t:"top",m:"middle",b:"bottom",l:"left",c:"center",r:"right"},m=["l","c","r"],F=["t","m","b"],b=["t","b","l","r"],v={t:"b",m:null,b:"t",l:"r",c:null,r:"l"},x=function(t){var i;return i=[],n.each(t.split(/\W+/),function(t,n){var o;return o=n.toLowerCase().charAt(0),M[o]?i.push(o):e}),i},D={},a={name:"core",html:'<div class="'+C+'-wrapper">\n <div class="'+C+'-arrow"></div>\n <div class="'+C+'-container"></div>\n</div>',css:"."+C+"-corner {\n position: fixed;\n margin: 5px;\n z-index: 1050;\n}\n\n."+C+"-corner ."+C+"-wrapper,\n."+C+"-corner ."+C+"-container {\n position: relative;\n display: block;\n height: inherit;\n width: inherit;\n margin: 3px;\n}\n\n."+C+"-wrapper {\n z-index: 1;\n position: absolute;\n display: inline-block;\n height: 0;\n width: 0;\n}\n\n."+C+"-container {\n display: none;\n z-index: 1;\n position: absolute;\n cursor: pointer;\n}\n\n[data-notify-text],[data-notify-html] {\n position: relative;\n}\n\n."+C+"-arrow {\n position: absolute;\n z-index: 2;\n width: 0;\n height: 0;\n}"},H={"border-radius":["-webkit-","-moz-"]},f=function(t){return D[t]},r=function(i,e){var o,r,s,a;if(!i)throw"Missing Style name";if(!e)throw"Missing Style definition";if(!e.html)throw"Missing Style HTML";return(null!=(a=D[i])?a.cssElem:void 0)&&(t.console&&console.warn(""+S+": overwriting style '"+i+"'"),D[i].cssElem.remove()),e.name=i,D[i]=e,o="",e.classes&&n.each(e.classes,function(t,i){return o+="."+C+"-"+e.name+"-"+t+" {\n",n.each(i,function(t,i){return H[t]&&n.each(H[t],function(n,e){return o+=" "+e+t+": "+i+";\n"}),o+=" "+t+": "+i+";\n"}),o+="}\n"}),e.css&&(o+="/* styles for "+e.name+" */\n"+e.css),o&&(e.cssElem=y(o),e.cssElem.attr("id","notify-"+e.name)),s={},r=n(e.html),u("html",r,s),u("text",r,s),e.fields=s},y=function(t){var i;i=l("style"),i.attr("type","text/css"),n("head").append(i);try{i.html(t)}catch(e){i[0].styleSheet.cssText=t}return i},u=function(t,i,e){var o;return"html"!==t&&(t="text"),o="data-notify-"+t,p(i,"["+o+"]").each(function(){var i;return i=n(this).attr(o),i||(i=s),e[i]=t})},p=function(t,i){return t.is(i)?t:t.find(i)},E={clickToHide:!0,autoHide:!0,autoHideDelay:5e3,arrowShow:!0,arrowSize:5,breakNewLines:!0,elementPosition:"bottom",globalPosition:"top right",style:"bootstrap",className:"error",showAnimation:"slideDown",showDuration:400,hideAnimation:"slideUp",hideDuration:200,gap:5},g=function(t,i){var e;return e=function(){},e.prototype=t,n.extend(!0,new e,i)},h=function(t){return n.extend(E,t)},l=function(t){return n("<"+t+"></"+t+">")},A={},d=function(t){var i;return t.is("[type=radio]")&&(i=t.parents("form:first").find("[type=radio]").filter(function(i,e){return n(e).attr("name")===t.attr("name")}),t=i.first()),t},w=function(t,i,n){var o,r;if("string"==typeof n)n=parseInt(n,10);else if("number"!=typeof n)return;if(!isNaN(n))return o=M[v[i.charAt(0)]],r=i,t[o]!==e&&(i=M[o.charAt(0)],n=-n),t[i]===e?t[i]=n:t[i]+=n,null},k=function(t,i,n){if("l"===t||"t"===t)return 0;if("c"===t||"m"===t)return n/2-i/2;if("r"===t||"b"===t)return n-i;throw"Invalid alignment"},c=function(t){return c.e=c.e||l("div"),c.e.text(t).html()},o=function(){function t(t,i,e){"string"==typeof e&&(e={className:e}),this.options=g(E,n.isPlainObject(e)?e:{}),this.loadHTML(),this.wrapper=n(a.html),this.wrapper.data(C,this),this.arrow=this.wrapper.find("."+C+"-arrow"),this.container=this.wrapper.find("."+C+"-container"),this.container.append(this.userContainer),t&&t.length&&(this.elementType=t.attr("type"),this.originalElement=t,this.elem=d(t),this.elem.data(C,this),this.elem.before(this.wrapper)),this.container.hide(),this.run(i)}return t.prototype.loadHTML=function(){var t;return t=this.getStyle(),this.userContainer=n(t.html),this.userFields=t.fields},t.prototype.show=function(t,i){var n,o,r,s,a,l=this;if(o=function(){return t||l.elem||l.destroy(),i?i():e},a=this.container.parent().parents(":hidden").length>0,r=this.container.add(this.arrow),n=[],a&&t)s="show";else if(a&&!t)s="hide";else if(!a&&t)s=this.options.showAnimation,n.push(this.options.showDuration);else{if(a||t)return o();s=this.options.hideAnimation,n.push(this.options.hideDuration)}return n.push(o),r[s].apply(r,n)},t.prototype.setGlobalPosition=function(){var t,i,e,o,r,s,a,h;return h=this.getPosition(),a=h[0],s=h[1],r=M[a],t=M[s],o=a+"|"+s,i=A[o],i||(i=A[o]=l("div"),e={},e[r]=0,"middle"===t?e.top="45%":"center"===t?e.left="45%":e[t]=0,i.css(e).addClass(""+C+"-corner"),n("body").append(i)),i.prepend(this.wrapper)},t.prototype.setElementPosition=function(){var t,i,o,r,s,a,l,h,c,p,u,d,f,A,g,y,x,C,S,E,H,D,z,Q,B,R,N,P,U;for(z=this.getPosition(),E=z[0],C=z[1],S=z[2],u=this.elem.position(),h=this.elem.outerHeight(),d=this.elem.outerWidth(),c=this.elem.innerHeight(),p=this.elem.innerWidth(),Q=this.wrapper.position(),s=this.container.height(),a=this.container.width(),A=M[E],y=v[E],x=M[y],l={},l[x]="b"===E?h:"r"===E?d:0,w(l,"top",u.top-Q.top),w(l,"left",u.left-Q.left),U=["top","left"],B=0,N=U.length;N>B;B++)H=U[B],g=parseInt(this.elem.css("margin-"+H),10),g&&w(l,H,g);if(f=Math.max(0,this.options.gap-(this.options.arrowShow?o:0)),w(l,x,f),this.options.arrowShow){for(o=this.options.arrowSize,i=n.extend({},l),t=this.userContainer.css("border-color")||this.userContainer.css("background-color")||"white",R=0,P=b.length;P>R;R++)H=b[R],D=M[H],H!==y&&(r=D===A?t:"transparent",i["border-"+D]=""+o+"px solid "+r);w(l,M[y],o),T.call(b,C)>=0&&w(i,M[C],2*o)}else this.arrow.hide();return T.call(F,E)>=0?(w(l,"left",k(C,a,d)),i&&w(i,"left",k(C,o,p))):T.call(m,E)>=0&&(w(l,"top",k(C,s,h)),i&&w(i,"top",k(C,o,c))),this.container.is(":visible")&&(l.display="block"),this.container.removeAttr("style").css(l),i?this.arrow.removeAttr("style").css(i):e},t.prototype.getPosition=function(){var t,i,n,e,o,r,s,a;if(i=this.options.position||(this.elem?this.options.elementPosition:this.options.globalPosition),t=x(i),0===t.length&&(t[0]="b"),n=t[0],0>T.call(b,n))throw"Must be one of ["+b+"]";return(1===t.length||(e=t[0],T.call(F,e)>=0&&(o=t[1],0>T.call(m,o)))||(r=t[0],T.call(m,r)>=0&&(s=t[1],0>T.call(F,s))))&&(t[1]=(a=t[0],T.call(m,a)>=0?"m":"l")),2===t.length&&(t[2]=t[1]),t},t.prototype.getStyle=function(t){var i;if(t||(t=this.options.style),t||(t="default"),i=D[t],!i)throw"Missing style: "+t;return i},t.prototype.updateClasses=function(){var t,i;return t=["base"],n.isArray(this.options.className)?t=t.concat(this.options.className):this.options.className&&t.push(this.options.className),i=this.getStyle(),t=n.map(t,function(t){return""+C+"-"+i.name+"-"+t}).join(" "),this.userContainer.attr("class",t)},t.prototype.run=function(t,i){var o,r,a,l,h,u=this;if(n.isPlainObject(i)?n.extend(this.options,i):"string"===n.type(i)&&(this.options.className=i),this.container&&!t)return this.show(!1),e;if(this.container||t){r={},n.isPlainObject(t)?r=t:r[s]=t;for(a in r)o=r[a],l=this.userFields[a],l&&("text"===l&&(o=c(o),this.options.breakNewLines&&(o=o.replace(/\n/g,"<br/>"))),h=a===s?"":"="+a,p(this.userContainer,"[data-notify-"+l+h+"]").html(o));return this.updateClasses(),this.elem?this.setElementPosition():this.setGlobalPosition(),this.show(!0),this.options.autoHide?(clearTimeout(this.autohideTimer),this.autohideTimer=setTimeout(function(){return u.show(!1)},this.options.autoHideDelay)):e}},t.prototype.destroy=function(){return this.wrapper.remove()},t}(),n[S]=function(t,i,e){return t&&t.nodeName||t.jquery?n(t)[S](i,e):(e=i,i=t,new o(null,i,e)),t},n.fn[S]=function(t,i){return n(this).each(function(){var e;return e=d(n(this)).data(C),e?e.run(t,i):new o(n(this),t,i)}),this},n.extend(n[S],{defaults:h,addStyle:r,pluginOptions:E,getStyle:f,insertCSS:y}),n(function(){return y(a.css).attr("id","core-notify"),n(i).on("click notify-hide","."+C+"-wrapper",function(t){var i;return i=n(this).data(C),i&&(i.options.clickToHide||"notify-hide"===t.type)?i.show(!1):e})})})(window,document,jQuery),$.notify.addStyle("bootstrap",{html:"<div>\n<span data-notify-text></span>\n</div>",classes:{base:{"font-weight":"bold",padding:"8px 15px 8px 14px","text-shadow":"0 1px 0 rgba(255, 255, 255, 0.5)","background-color":"#fcf8e3",border:"1px solid #fbeed5","border-radius":"4px","white-space":"nowrap","padding-left":"25px","background-repeat":"no-repeat","background-position":"3px 7px"},error:{color:"#B94A48","background-color":"#F2DEDE","border-color":"#EED3D7","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtRJREFUeNqkVc1u00AQHq+dOD+0poIQfkIjalW0SEGqRMuRnHos3DjwAH0ArlyQeANOOSMeAA5VjyBxKBQhgSpVUKKQNGloFdw4cWw2jtfMOna6JOUArDTazXi/b3dm55socPqQhFka++aHBsI8GsopRJERNFlY88FCEk9Yiwf8RhgRyaHFQpPHCDmZG5oX2ui2yilkcTT1AcDsbYC1NMAyOi7zTX2Agx7A9luAl88BauiiQ/cJaZQfIpAlngDcvZZMrl8vFPK5+XktrWlx3/ehZ5r9+t6e+WVnp1pxnNIjgBe4/6dAysQc8dsmHwPcW9C0h3fW1hans1ltwJhy0GxK7XZbUlMp5Ww2eyan6+ft/f2FAqXGK4CvQk5HueFz7D6GOZtIrK+srupdx1GRBBqNBtzc2AiMr7nPplRdKhb1q6q6zjFhrklEFOUutoQ50xcX86ZlqaZpQrfbBdu2R6/G19zX6XSgh6RX5ubyHCM8nqSID6ICrGiZjGYYxojEsiw4PDwMSL5VKsC8Yf4VRYFzMzMaxwjlJSlCyAQ9l0CW44PBADzXhe7xMdi9HtTrdYjFYkDQL0cn4Xdq2/EAE+InCnvADTf2eah4Sx9vExQjkqXT6aAERICMewd/UAp/IeYANM2joxt+q5VI+ieq2i0Wg3l6DNzHwTERPgo1ko7XBXj3vdlsT2F+UuhIhYkp7u7CarkcrFOCtR3H5JiwbAIeImjT/YQKKBtGjRFCU5IUgFRe7fF4cCNVIPMYo3VKqxwjyNAXNepuopyqnld602qVsfRpEkkz+GFL1wPj6ySXBpJtWVa5xlhpcyhBNwpZHmtX8AGgfIExo0ZpzkWVTBGiXCSEaHh62/PoR0p/vHaczxXGnj4bSo+G78lELU80h1uogBwWLf5YlsPmgDEd4M236xjm+8nm4IuE/9u+/PH2JXZfbwz4zw1WbO+SQPpXfwG/BBgAhCNZiSb/pOQAAAAASUVORK5CYII=)"},success:{color:"#468847","background-color":"#DFF0D8","border-color":"#D6E9C6","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAutJREFUeNq0lctPE0Ecx38zu/RFS1EryqtgJFA08YCiMZIAQQ4eRG8eDGdPJiYeTIwHTfwPiAcvXIwXLwoXPaDxkWgQ6islKlJLSQWLUraPLTv7Gme32zoF9KSTfLO7v53vZ3d/M7/fIth+IO6INt2jjoA7bjHCJoAlzCRw59YwHYjBnfMPqAKWQYKjGkfCJqAF0xwZjipQtA3MxeSG87VhOOYegVrUCy7UZM9S6TLIdAamySTclZdYhFhRHloGYg7mgZv1Zzztvgud7V1tbQ2twYA34LJmF4p5dXF1KTufnE+SxeJtuCZNsLDCQU0+RyKTF27Unw101l8e6hns3u0PBalORVVVkcaEKBJDgV3+cGM4tKKmI+ohlIGnygKX00rSBfszz/n2uXv81wd6+rt1orsZCHRdr1Imk2F2Kob3hutSxW8thsd8AXNaln9D7CTfA6O+0UgkMuwVvEFFUbbAcrkcTA8+AtOk8E6KiQiDmMFSDqZItAzEVQviRkdDdaFgPp8HSZKAEAL5Qh7Sq2lIJBJwv2scUqkUnKoZgNhcDKhKg5aH+1IkcouCAdFGAQsuWZYhOjwFHQ96oagWgRoUov1T9kRBEODAwxM2QtEUl+Wp+Ln9VRo6BcMw4ErHRYjH4/B26AlQoQQTRdHWwcd9AH57+UAXddvDD37DmrBBV34WfqiXPl61g+vr6xA9zsGeM9gOdsNXkgpEtTwVvwOklXLKm6+/p5ezwk4B+j6droBs2CsGa/gNs6RIxazl4Tc25mpTgw/apPR1LYlNRFAzgsOxkyXYLIM1V8NMwyAkJSctD1eGVKiq5wWjSPdjmeTkiKvVW4f2YPHWl3GAVq6ymcyCTgovM3FzyRiDe2TaKcEKsLpJvNHjZgPNqEtyi6mZIm4SRFyLMUsONSSdkPeFtY1n0mczoY3BHTLhwPRy9/lzcziCw9ACI+yql0VLzcGAZbYSM5CCSZg1/9oc/nn7+i8N9p/8An4JMADxhH+xHfuiKwAAAABJRU5ErkJggg==)"},info:{color:"#3A87AD","background-color":"#D9EDF7","border-color":"#BCE8F1","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYFAhkSsdes/QAAA8dJREFUOMvVlGtMW2UYx//POaWHXg6lLaW0ypAtw1UCgbniNOLcVOLmAjHZolOYlxmTGXVZdAnRfXQm+7SoU4mXaOaiZsEpC9FkiQs6Z6bdCnNYruM6KNBw6YWewzl9z+sHImEWv+vz7XmT95f/+3/+7wP814v+efDOV3/SoX3lHAA+6ODeUFfMfjOWMADgdk+eEKz0pF7aQdMAcOKLLjrcVMVX3xdWN29/GhYP7SvnP0cWfS8caSkfHZsPE9Fgnt02JNutQ0QYHB2dDz9/pKX8QjjuO9xUxd/66HdxTeCHZ3rojQObGQBcuNjfplkD3b19Y/6MrimSaKgSMmpGU5WevmE/swa6Oy73tQHA0Rdr2Mmv/6A1n9w9suQ7097Z9lM4FlTgTDrzZTu4StXVfpiI48rVcUDM5cmEksrFnHxfpTtU/3BFQzCQF/2bYVoNbH7zmItbSoMj40JSzmMyX5qDvriA7QdrIIpA+3cdsMpu0nXI8cV0MtKXCPZev+gCEM1S2NHPvWfP/hL+7FSr3+0p5RBEyhEN5JCKYr8XnASMT0xBNyzQGQeI8fjsGD39RMPk7se2bd5ZtTyoFYXftF6y37gx7NeUtJJOTFlAHDZLDuILU3j3+H5oOrD3yWbIztugaAzgnBKJuBLpGfQrS8wO4FZgV+c1IxaLgWVU0tMLEETCos4xMzEIv9cJXQcyagIwigDGwJgOAtHAwAhisQUjy0ORGERiELgG4iakkzo4MYAxcM5hAMi1WWG1yYCJIcMUaBkVRLdGeSU2995TLWzcUAzONJ7J6FBVBYIggMzmFbvdBV44Corg8vjhzC+EJEl8U1kJtgYrhCzgc/vvTwXKSib1paRFVRVORDAJAsw5FuTaJEhWM2SHB3mOAlhkNxwuLzeJsGwqWzf5TFNdKgtY5qHp6ZFf67Y/sAVadCaVY5YACDDb3Oi4NIjLnWMw2QthCBIsVhsUTU9tvXsjeq9+X1d75/KEs4LNOfcdf/+HthMnvwxOD0wmHaXr7ZItn2wuH2SnBzbZAbPJwpPx+VQuzcm7dgRCB57a1uBzUDRL4bfnI0RE0eaXd9W89mpjqHZnUI5Hh2l2dkZZUhOqpi2qSmpOmZ64Tuu9qlz/SEXo6MEHa3wOip46F1n7633eekV8ds8Wxjn37Wl63VVa+ej5oeEZ/82ZBETJjpJ1Rbij2D3Z/1trXUvLsblCK0XfOx0SX2kMsn9dX+d+7Kf6h8o4AIykuffjT8L20LU+w4AZd5VvEPY+XpWqLV327HR7DzXuDnD8r+ovkBehJ8i+y8YAAAAASUVORK5CYII=)"},warn:{color:"#C09853","background-color":"#FCF8E3","border-color":"#FBEED5","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAABJlBMVEXr6eb/2oD/wi7/xjr/0mP/ykf/tQD/vBj/3o7/uQ//vyL/twebhgD/4pzX1K3z8e349vK6tHCilCWbiQymn0jGworr6dXQza3HxcKkn1vWvV/5uRfk4dXZ1bD18+/52YebiAmyr5S9mhCzrWq5t6ufjRH54aLs0oS+qD751XqPhAybhwXsujG3sm+Zk0PTwG6Shg+PhhObhwOPgQL4zV2nlyrf27uLfgCPhRHu7OmLgAafkyiWkD3l49ibiAfTs0C+lgCniwD4sgDJxqOilzDWowWFfAH08uebig6qpFHBvH/aw26FfQTQzsvy8OyEfz20r3jAvaKbhgG9q0nc2LbZxXanoUu/u5WSggCtp1anpJKdmFz/zlX/1nGJiYmuq5Dx7+sAAADoPUZSAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdBgUBGhh4aah5AAAAlklEQVQY02NgoBIIE8EUcwn1FkIXM1Tj5dDUQhPU502Mi7XXQxGz5uVIjGOJUUUW81HnYEyMi2HVcUOICQZzMMYmxrEyMylJwgUt5BljWRLjmJm4pI1hYp5SQLGYxDgmLnZOVxuooClIDKgXKMbN5ggV1ACLJcaBxNgcoiGCBiZwdWxOETBDrTyEFey0jYJ4eHjMGWgEAIpRFRCUt08qAAAAAElFTkSuQmCC)"}}}); \ No newline at end of file diff --git a/vendor/scripts/tv4.js b/vendor/scripts/tv4.js deleted file mode 100644 index bae299f94..000000000 --- a/vendor/scripts/tv4.js +++ /dev/null @@ -1,1150 +0,0 @@ -/* -Author: Geraint Luff and others -Year: 2013 - -This code is released into the "public domain" by its author(s). Anybody may use, alter and distribute the code without restriction. The author makes no guarantees, and takes no liability of any kind for use of this code. - -If you find a bug or make an improvement, it would be courteous to let the author know, but it is not compulsory. -*/ -(function (global) { -'use strict'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fkeys -if (!Object.keys) { - Object.keys = (function () { - var hasOwnProperty = Object.prototype.hasOwnProperty, - hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), - dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ], - dontEnumsLength = dontEnums.length; - - return function (obj) { - if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) { - throw new TypeError('Object.keys called on non-object'); - } - - var result = []; - - for (var prop in obj) { - if (hasOwnProperty.call(obj, prop)) { - result.push(prop); - } - } - - if (hasDontEnumBug) { - for (var i=0; i < dontEnumsLength; i++) { - if (hasOwnProperty.call(obj, dontEnums[i])) { - result.push(dontEnums[i]); - } - } - } - return result; - }; - })(); -} -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create -if (!Object.create) { - Object.create = (function(){ - function F(){} - - return function(o){ - if (arguments.length !== 1) { - throw new Error('Object.create implementation only accepts one parameter.'); - } - F.prototype = o; - return new F(); - }; - })(); -} -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FisArray -if(!Array.isArray) { - Array.isArray = function (vArg) { - return Object.prototype.toString.call(vArg) === "[object Array]"; - }; -} -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf -if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { - if (this === null) { - throw new TypeError(); - } - var t = Object(this); - var len = t.length >>> 0; - - if (len === 0) { - return -1; - } - var n = 0; - if (arguments.length > 1) { - n = Number(arguments[1]); - if (n !== n) { // shortcut for verifying if it's NaN - n = 0; - } else if (n !== 0 && n !== Infinity && n !== -Infinity) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - } - if (n >= len) { - return -1; - } - var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); - for (; k < len; k++) { - if (k in t && t[k] === searchElement) { - return k; - } - } - return -1; - }; -} - -// Grungey Object.isFrozen hack -if (!Object.isFrozen) { - Object.isFrozen = function (obj) { - var key = "tv4_test_frozen_key"; - while (obj.hasOwnProperty(key)) { - key += Math.random(); - } - try { - obj[key] = true; - delete obj[key]; - return false; - } catch (e) { - return true; - } - }; -} -var ValidatorContext = function ValidatorContext(parent, collectMultiple, errorMessages, checkRecursive) { - this.missing = []; - this.missingMap = {}; - this.formatValidators = parent ? Object.create(parent.formatValidators) : {}; - this.schemas = parent ? Object.create(parent.schemas) : {}; - this.collectMultiple = collectMultiple; - this.errors = []; - this.handleError = collectMultiple ? this.collectError : this.returnError; - if (checkRecursive) { - this.checkRecursive = true; - this.scanned = []; - this.scannedFrozen = []; - this.scannedFrozenSchemas = []; - this.key = 'tv4_validation_id'; - } - this.errorMessages = errorMessages; -}; -ValidatorContext.prototype.createError = function (code, messageParams, dataPath, schemaPath, subErrors) { - var messageTemplate = this.errorMessages[code] || ErrorMessagesDefault[code]; - if (typeof messageTemplate !== 'string') { - return new ValidationError(code, "Unknown error code " + code + ": " + JSON.stringify(messageParams), dataPath, schemaPath, subErrors); - } - // Adapted from Crockford's supplant() - var message = messageTemplate.replace(/\{([^{}]*)\}/g, function (whole, varName) { - var subValue = messageParams[varName]; - return typeof subValue === 'string' || typeof subValue === 'number' ? subValue : whole; - }); - return new ValidationError(code, message, dataPath, schemaPath, subErrors); -}; -ValidatorContext.prototype.returnError = function (error) { - return error; -}; -ValidatorContext.prototype.collectError = function (error) { - if (error) { - this.errors.push(error); - } - return null; -}; -ValidatorContext.prototype.prefixErrors = function (startIndex, dataPath, schemaPath) { - for (var i = startIndex; i < this.errors.length; i++) { - this.errors[i] = this.errors[i].prefixWith(dataPath, schemaPath); - } - return this; -}; - -ValidatorContext.prototype.addFormat = function (format, validator) { - if (typeof format === 'object') { - for (var key in format) { - this.addFormat(key, format[key]); - } - return this; - } - this.formatValidators[format] = validator; -}; -ValidatorContext.prototype.getSchema = function (url) { - var schema; - if (this.schemas[url] !== undefined) { - schema = this.schemas[url]; - return schema; - } - var baseUrl = url; - var fragment = ""; - if (url.indexOf('#') !== -1) { - fragment = url.substring(url.indexOf("#") + 1); - baseUrl = url.substring(0, url.indexOf("#")); - } - if (typeof this.schemas[baseUrl] === 'object') { - schema = this.schemas[baseUrl]; - var pointerPath = decodeURIComponent(fragment); - if (pointerPath === "") { - return schema; - } else if (pointerPath.charAt(0) !== "/") { - return undefined; - } - var parts = pointerPath.split("/").slice(1); - for (var i = 0; i < parts.length; i++) { - var component = parts[i].replace("~1", "/").replace("~0", "~"); - if (schema[component] === undefined) { - schema = undefined; - break; - } - schema = schema[component]; - } - if (schema !== undefined) { - return schema; - } - } - if (this.missing[baseUrl] === undefined) { - this.missing.push(baseUrl); - this.missing[baseUrl] = baseUrl; - this.missingMap[baseUrl] = baseUrl; - } -}; -ValidatorContext.prototype.searchSchemas = function (schema, url) { - if (schema === undefined || schema === null) { return; } - if (typeof schema.id === "string") { - if (isTrustedUrl(url, schema.id)) { - if (this.schemas[schema.id] === undefined) { - this.schemas[schema.id] = schema; - } - } - } - if (typeof schema === "object") { - for (var key in schema) { - if (key !== "enum") { - if (typeof schema[key] === "object") { - this.searchSchemas(schema[key], url); - } else if (key === "$ref") { - var uri = getDocumentUri(schema[key]); - if (uri && this.schemas[uri] === undefined && this.missingMap[uri] === undefined) { - this.missingMap[uri] = uri; - } - } - } - } - } -}; -ValidatorContext.prototype.addSchema = function (url, schema) { - //overload - if (typeof schema === 'undefined') { - if (typeof url === 'object' && typeof url.id === 'string') { - schema = url; - url = schema.id; - } - else { - return; - } - } - if (url = getDocumentUri(url) + "#") { - // Remove empty fragment - url = getDocumentUri(url); - } - this.schemas[url] = schema; - delete this.missingMap[url]; - normSchema(schema, url); - this.searchSchemas(schema, url); -}; - -ValidatorContext.prototype.getSchemaMap = function () { - var map = {}; - for (var key in this.schemas) { - map[key] = this.schemas[key]; - } - return map; -}; - -ValidatorContext.prototype.getSchemaUris = function (filterRegExp) { - var list = []; - for (var key in this.schemas) { - if (!filterRegExp || filterRegExp.test(key)) { - list.push(key); - } - } - return list; -}; - -ValidatorContext.prototype.getMissingUris = function (filterRegExp) { - var list = []; - for (var key in this.missingMap) { - if (!filterRegExp || filterRegExp.test(key)) { - list.push(key); - } - } - return list; -}; - -ValidatorContext.prototype.dropSchemas = function () { - this.schemas = {}; - this.reset(); -}; -ValidatorContext.prototype.reset = function () { - this.missing = []; - this.missingMap = {}; - this.errors = []; -}; - -ValidatorContext.prototype.validateAll = function (data, schema, dataPathParts, schemaPathParts) { - var topLevel; - if (schema['$ref'] !== undefined) { - schema = this.getSchema(schema['$ref']); - if (!schema) { - return null; - } - } - - if (this.checkRecursive && (typeof data) === 'object') { - topLevel = !this.scanned.length; - if (data[this.key] && data[this.key].indexOf(schema) !== -1) { return null; } - var frozenIndex; - if (Object.isFrozen(data)) { - frozenIndex = this.scannedFrozen.indexOf(data); - if (frozenIndex !== -1 && this.scannedFrozenSchemas[frozenIndex].indexOf(schema) !== -1) { return null; } - } - this.scanned.push(data); - if (Object.isFrozen(data)) { - if (frozenIndex === -1) { - frozenIndex = this.scannedFrozen.length; - this.scannedFrozen.push(data); - this.scannedFrozenSchemas.push([]); - } - this.scannedFrozenSchemas[frozenIndex].push(schema); - } else { - if (!data[this.key]) { - try { - Object.defineProperty(data, this.key, { - value: [], - configurable: true - }); - } catch (e) { - //IE 7/8 workaround - data[this.key] = []; - } - } - data[this.key].push(schema); - } - } - - var errorCount = this.errors.length; - var error = this.validateBasic(data, schema) - || this.validateNumeric(data, schema) - || this.validateString(data, schema) - || this.validateArray(data, schema) - || this.validateObject(data, schema) - || this.validateCombinations(data, schema) - || this.validateFormat(data, schema) - || null; - - if (topLevel) { - while (this.scanned.length) { - var item = this.scanned.pop(); - delete item[this.key]; - } - this.scannedFrozen = []; - this.scannedFrozenSchemas = []; - } - - if (error || errorCount !== this.errors.length) { - while ((dataPathParts && dataPathParts.length) || (schemaPathParts && schemaPathParts.length)) { - var dataPart = (dataPathParts && dataPathParts.length) ? "" + dataPathParts.pop() : null; - var schemaPart = (schemaPathParts && schemaPathParts.length) ? "" + schemaPathParts.pop() : null; - if (error) { - error = error.prefixWith(dataPart, schemaPart); - } - this.prefixErrors(errorCount, dataPart, schemaPart); - } - } - - return this.handleError(error); -}; -ValidatorContext.prototype.validateFormat = function (data, schema) { - if (typeof schema.format !== 'string' || !this.formatValidators[schema.format]) { - return null; - } - var errorMessage = this.formatValidators[schema.format].call(null, data, schema); - if (typeof errorMessage === 'string' || typeof errorMessage === 'number') { - return this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage}).prefixWith(null, "format"); - } else if (errorMessage && typeof errorMessage === 'object') { - return this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage.message || "?"}, errorMessage.dataPath || null, errorMessage.schemaPath || "/format"); - } - return null; -}; - -function recursiveCompare(A, B) { - if (A === B) { - return true; - } - if (typeof A === "object" && typeof B === "object") { - if (Array.isArray(A) !== Array.isArray(B)) { - return false; - } else if (Array.isArray(A)) { - if (A.length !== B.length) { - return false; - } - for (var i = 0; i < A.length; i++) { - if (!recursiveCompare(A[i], B[i])) { - return false; - } - } - } else { - var key; - for (key in A) { - if (B[key] === undefined && A[key] !== undefined) { - return false; - } - } - for (key in B) { - if (A[key] === undefined && B[key] !== undefined) { - return false; - } - } - for (key in A) { - if (!recursiveCompare(A[key], B[key])) { - return false; - } - } - } - return true; - } - return false; -} - -ValidatorContext.prototype.validateBasic = function validateBasic(data, schema) { - var error; - if (error = this.validateType(data, schema)) { - return error.prefixWith(null, "type"); - } - if (error = this.validateEnum(data, schema)) { - return error.prefixWith(null, "type"); - } - return null; -}; - -ValidatorContext.prototype.validateType = function validateType(data, schema) { - if (schema.type === undefined) { - return null; - } - var dataType = typeof data; - if (data === null) { - dataType = "null"; - } else if (Array.isArray(data)) { - dataType = "array"; - } - var allowedTypes = schema.type; - if (typeof allowedTypes !== "object") { - allowedTypes = [allowedTypes]; - } - - for (var i = 0; i < allowedTypes.length; i++) { - var type = allowedTypes[i]; - if (type === dataType || (type === "integer" && dataType === "number" && (data % 1 === 0))) { - return null; - } - } - return this.createError(ErrorCodes.INVALID_TYPE, {type: dataType, expected: allowedTypes.join("/")}); -}; - -ValidatorContext.prototype.validateEnum = function validateEnum(data, schema) { - if (schema["enum"] === undefined) { - return null; - } - for (var i = 0; i < schema["enum"].length; i++) { - var enumVal = schema["enum"][i]; - if (recursiveCompare(data, enumVal)) { - return null; - } - } - return this.createError(ErrorCodes.ENUM_MISMATCH, {value: (typeof JSON !== 'undefined') ? JSON.stringify(data) : data}); -}; - -ValidatorContext.prototype.validateNumeric = function validateNumeric(data, schema) { - return this.validateMultipleOf(data, schema) - || this.validateMinMax(data, schema) - || null; -}; - -ValidatorContext.prototype.validateMultipleOf = function validateMultipleOf(data, schema) { - var multipleOf = schema.multipleOf || schema.divisibleBy; - if (multipleOf === undefined) { - return null; - } - if (typeof data === "number") { - if (data % multipleOf !== 0) { - return this.createError(ErrorCodes.NUMBER_MULTIPLE_OF, {value: data, multipleOf: multipleOf}); - } - } - return null; -}; - -ValidatorContext.prototype.validateMinMax = function validateMinMax(data, schema) { - if (typeof data !== "number") { - return null; - } - if (schema.minimum !== undefined) { - if (data < schema.minimum) { - return this.createError(ErrorCodes.NUMBER_MINIMUM, {value: data, minimum: schema.minimum}).prefixWith(null, "minimum"); - } - if (schema.exclusiveMinimum && data === schema.minimum) { - return this.createError(ErrorCodes.NUMBER_MINIMUM_EXCLUSIVE, {value: data, minimum: schema.minimum}).prefixWith(null, "exclusiveMinimum"); - } - } - if (schema.maximum !== undefined) { - if (data > schema.maximum) { - return this.createError(ErrorCodes.NUMBER_MAXIMUM, {value: data, maximum: schema.maximum}).prefixWith(null, "maximum"); - } - if (schema.exclusiveMaximum && data === schema.maximum) { - return this.createError(ErrorCodes.NUMBER_MAXIMUM_EXCLUSIVE, {value: data, maximum: schema.maximum}).prefixWith(null, "exclusiveMaximum"); - } - } - return null; -}; - -ValidatorContext.prototype.validateString = function validateString(data, schema) { - return this.validateStringLength(data, schema) - || this.validateStringPattern(data, schema) - || null; -}; - -ValidatorContext.prototype.validateStringLength = function validateStringLength(data, schema) { - if (typeof data !== "string") { - return null; - } - if (schema.minLength !== undefined) { - if (data.length < schema.minLength) { - return this.createError(ErrorCodes.STRING_LENGTH_SHORT, {length: data.length, minimum: schema.minLength}).prefixWith(null, "minLength"); - } - } - if (schema.maxLength !== undefined) { - if (data.length > schema.maxLength) { - return this.createError(ErrorCodes.STRING_LENGTH_LONG, {length: data.length, maximum: schema.maxLength}).prefixWith(null, "maxLength"); - } - } - return null; -}; - -ValidatorContext.prototype.validateStringPattern = function validateStringPattern(data, schema) { - if (typeof data !== "string" || schema.pattern === undefined) { - return null; - } - var regexp = new RegExp(schema.pattern); - if (!regexp.test(data)) { - return this.createError(ErrorCodes.STRING_PATTERN, {pattern: schema.pattern}).prefixWith(null, "pattern"); - } - return null; -}; -ValidatorContext.prototype.validateArray = function validateArray(data, schema) { - if (!Array.isArray(data)) { - return null; - } - return this.validateArrayLength(data, schema) - || this.validateArrayUniqueItems(data, schema) - || this.validateArrayItems(data, schema) - || null; -}; - -ValidatorContext.prototype.validateArrayLength = function validateArrayLength(data, schema) { - var error; - if (schema.minItems !== undefined) { - if (data.length < schema.minItems) { - error = (this.createError(ErrorCodes.ARRAY_LENGTH_SHORT, {length: data.length, minimum: schema.minItems})).prefixWith(null, "minItems"); - if (this.handleError(error)) { - return error; - } - } - } - if (schema.maxItems !== undefined) { - if (data.length > schema.maxItems) { - error = (this.createError(ErrorCodes.ARRAY_LENGTH_LONG, {length: data.length, maximum: schema.maxItems})).prefixWith(null, "maxItems"); - if (this.handleError(error)) { - return error; - } - } - } - return null; -}; - -ValidatorContext.prototype.validateArrayUniqueItems = function validateArrayUniqueItems(data, schema) { - if (schema.uniqueItems) { - for (var i = 0; i < data.length; i++) { - for (var j = i + 1; j < data.length; j++) { - if (recursiveCompare(data[i], data[j])) { - var error = (this.createError(ErrorCodes.ARRAY_UNIQUE, {match1: i, match2: j})).prefixWith(null, "uniqueItems"); - if (this.handleError(error)) { - return error; - } - } - } - } - } - return null; -}; - -ValidatorContext.prototype.validateArrayItems = function validateArrayItems(data, schema) { - if (schema.items === undefined) { - return null; - } - var error, i; - if (Array.isArray(schema.items)) { - for (i = 0; i < data.length; i++) { - if (i < schema.items.length) { - if (error = this.validateAll(data[i], schema.items[i], [i], ["items", i])) { - return error; - } - } else if (schema.additionalItems !== undefined) { - if (typeof schema.additionalItems === "boolean") { - if (!schema.additionalItems) { - error = (this.createError(ErrorCodes.ARRAY_ADDITIONAL_ITEMS, {})).prefixWith("" + i, "additionalItems"); - if (this.handleError(error)) { - return error; - } - } - } else if (error = this.validateAll(data[i], schema.additionalItems, [i], ["additionalItems"])) { - return error; - } - } - } - } else { - for (i = 0; i < data.length; i++) { - if (error = this.validateAll(data[i], schema.items, [i], ["items"])) { - return error; - } - } - } - return null; -}; - -ValidatorContext.prototype.validateObject = function validateObject(data, schema) { - if (typeof data !== "object" || data === null || Array.isArray(data)) { - return null; - } - return this.validateObjectMinMaxProperties(data, schema) - || this.validateObjectRequiredProperties(data, schema) - || this.validateObjectProperties(data, schema) - || this.validateObjectDependencies(data, schema) - || null; -}; - -ValidatorContext.prototype.validateObjectMinMaxProperties = function validateObjectMinMaxProperties(data, schema) { - var keys = Object.keys(data); - var error; - if (schema.minProperties !== undefined) { - if (keys.length < schema.minProperties) { - error = this.createError(ErrorCodes.OBJECT_PROPERTIES_MINIMUM, {propertyCount: keys.length, minimum: schema.minProperties}).prefixWith(null, "minProperties"); - if (this.handleError(error)) { - return error; - } - } - } - if (schema.maxProperties !== undefined) { - if (keys.length > schema.maxProperties) { - error = this.createError(ErrorCodes.OBJECT_PROPERTIES_MAXIMUM, {propertyCount: keys.length, maximum: schema.maxProperties}).prefixWith(null, "maxProperties"); - if (this.handleError(error)) { - return error; - } - } - } - return null; -}; - -ValidatorContext.prototype.validateObjectRequiredProperties = function validateObjectRequiredProperties(data, schema) { - if (schema.required !== undefined) { - for (var i = 0; i < schema.required.length; i++) { - var key = schema.required[i]; - if (data[key] === undefined) { - var error = this.createError(ErrorCodes.OBJECT_REQUIRED, {key: key}).prefixWith(null, "" + i).prefixWith(null, "required"); - if (this.handleError(error)) { - return error; - } - } - } - } - return null; -}; - -ValidatorContext.prototype.validateObjectProperties = function validateObjectProperties(data, schema) { - var error; - for (var key in data) { - var foundMatch = false; - if (schema.properties !== undefined && schema.properties[key] !== undefined) { - foundMatch = true; - if (error = this.validateAll(data[key], schema.properties[key], [key], ["properties", key])) { - return error; - } - } - if (schema.patternProperties !== undefined) { - for (var patternKey in schema.patternProperties) { - var regexp = new RegExp(patternKey); - if (regexp.test(key)) { - foundMatch = true; - if (error = this.validateAll(data[key], schema.patternProperties[patternKey], [key], ["patternProperties", patternKey])) { - return error; - } - } - } - } - if (!foundMatch && schema.additionalProperties !== undefined) { - if (typeof schema.additionalProperties === "boolean") { - if (!schema.additionalProperties) { - error = this.createError(ErrorCodes.OBJECT_ADDITIONAL_PROPERTIES, {}).prefixWith(key, "additionalProperties"); - if (this.handleError(error)) { - return error; - } - } - } else { - if (error = this.validateAll(data[key], schema.additionalProperties, [key], ["additionalProperties"])) { - return error; - } - } - } - } - return null; -}; - -ValidatorContext.prototype.validateObjectDependencies = function validateObjectDependencies(data, schema) { - var error; - if (schema.dependencies !== undefined) { - for (var depKey in schema.dependencies) { - if (data[depKey] !== undefined) { - var dep = schema.dependencies[depKey]; - if (typeof dep === "string") { - if (data[dep] === undefined) { - error = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: dep}).prefixWith(null, depKey).prefixWith(null, "dependencies"); - if (this.handleError(error)) { - return error; - } - } - } else if (Array.isArray(dep)) { - for (var i = 0; i < dep.length; i++) { - var requiredKey = dep[i]; - if (data[requiredKey] === undefined) { - error = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: requiredKey}).prefixWith(null, "" + i).prefixWith(null, depKey).prefixWith(null, "dependencies"); - if (this.handleError(error)) { - return error; - } - } - } - } else { - if (error = this.validateAll(data, dep, [], ["dependencies", depKey])) { - return error; - } - } - } - } - } - return null; -}; - -ValidatorContext.prototype.validateCombinations = function validateCombinations(data, schema) { - return this.validateAllOf(data, schema) - || this.validateAnyOf(data, schema) - || this.validateOneOf(data, schema) - || this.validateNot(data, schema) - || null; -}; - -ValidatorContext.prototype.validateAllOf = function validateAllOf(data, schema) { - if (schema.allOf === undefined) { - return null; - } - var error; - for (var i = 0; i < schema.allOf.length; i++) { - var subSchema = schema.allOf[i]; - if (error = this.validateAll(data, subSchema, [], ["allOf", i])) { - return error; - } - } - return null; -}; - -ValidatorContext.prototype.validateAnyOf = function validateAnyOf(data, schema) { - if (schema.anyOf === undefined) { - return null; - } - var errors = []; - var startErrorCount = this.errors.length; - for (var i = 0; i < schema.anyOf.length; i++) { - var subSchema = schema.anyOf[i]; - - var errorCount = this.errors.length; - var error = this.validateAll(data, subSchema, [], ["anyOf", i]); - - if (error === null && errorCount === this.errors.length) { - this.errors = this.errors.slice(0, startErrorCount); - return null; - } - if (error) { - errors.push(error.prefixWith(null, "" + i).prefixWith(null, "anyOf")); - } - } - errors = errors.concat(this.errors.slice(startErrorCount)); - this.errors = this.errors.slice(0, startErrorCount); - return this.createError(ErrorCodes.ANY_OF_MISSING, {}, "", "/anyOf", errors); -}; - -ValidatorContext.prototype.validateOneOf = function validateOneOf(data, schema) { - if (schema.oneOf === undefined) { - return null; - } - var validIndex = null; - var errors = []; - var startErrorCount = this.errors.length; - for (var i = 0; i < schema.oneOf.length; i++) { - var subSchema = schema.oneOf[i]; - - var errorCount = this.errors.length; - var error = this.validateAll(data, subSchema, [], ["oneOf", i]); - - if (error === null && errorCount === this.errors.length) { - if (validIndex === null) { - validIndex = i; - } else { - this.errors = this.errors.slice(0, startErrorCount); - return this.createError(ErrorCodes.ONE_OF_MULTIPLE, {index1: validIndex, index2: i}, "", "/oneOf"); - } - } else if (error) { - errors.push(error.prefixWith(null, "" + i).prefixWith(null, "oneOf")); - } - } - if (validIndex === null) { - errors = errors.concat(this.errors.slice(startErrorCount)); - this.errors = this.errors.slice(0, startErrorCount); - return this.createError(ErrorCodes.ONE_OF_MISSING, {}, "", "/oneOf", errors); - } else { - this.errors = this.errors.slice(0, startErrorCount); - } - return null; -}; - -ValidatorContext.prototype.validateNot = function validateNot(data, schema) { - if (schema.not === undefined) { - return null; - } - var oldErrorCount = this.errors.length; - var error = this.validateAll(data, schema.not); - var notErrors = this.errors.slice(oldErrorCount); - this.errors = this.errors.slice(0, oldErrorCount); - if (error === null && notErrors.length === 0) { - return this.createError(ErrorCodes.NOT_PASSED, {}, "", "/not"); - } - return null; -}; - -// parseURI() and resolveUrl() are from https://gist.github.com/1088850 -// - released as public domain by author ("Yaffle") - see comments on gist - -function parseURI(url) { - var m = String(url).replace(/^\s+|\s+$/g, '').match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/); - // authority = '//' + user + ':' + pass '@' + hostname + ':' port - return (m ? { - href : m[0] || '', - protocol : m[1] || '', - authority: m[2] || '', - host : m[3] || '', - hostname : m[4] || '', - port : m[5] || '', - pathname : m[6] || '', - search : m[7] || '', - hash : m[8] || '' - } : null); -} - -function resolveUrl(base, href) {// RFC 3986 - - function removeDotSegments(input) { - var output = []; - input.replace(/^(\.\.?(\/|$))+/, '') - .replace(/\/(\.(\/|$))+/g, '/') - .replace(/\/\.\.$/, '/../') - .replace(/\/?[^\/]*/g, function (p) { - if (p === '/..') { - output.pop(); - } else { - output.push(p); - } - }); - return output.join('').replace(/^\//, input.charAt(0) === '/' ? '/' : ''); - } - - href = parseURI(href || ''); - base = parseURI(base || ''); - - return !href || !base ? null : (href.protocol || base.protocol) + - (href.protocol || href.authority ? href.authority : base.authority) + - removeDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === '/' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? '/' : '') + base.pathname.slice(0, base.pathname.lastIndexOf('/') + 1) + href.pathname) : base.pathname)) + - (href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) + - href.hash; -} - -function getDocumentUri(uri) { - return uri.split('#')[0]; -} -function normSchema(schema, baseUri) { - if (schema === undefined || schema === null) { return; } - if (baseUri === undefined) { - baseUri = schema.id; - } else if (typeof schema.id === "string") { - baseUri = resolveUrl(baseUri, schema.id); - schema.id = baseUri; - } - if (typeof schema === "object") { - if (Array.isArray(schema)) { - for (var i = 0; i < schema.length; i++) { - normSchema(schema[i], baseUri); - } - } else if (typeof schema['$ref'] === "string") { - schema['$ref'] = resolveUrl(baseUri, schema['$ref']); - } else { - for (var key in schema) { - if (key !== "enum") { - normSchema(schema[key], baseUri); - } - } - } - } -} - -var ErrorCodes = { - INVALID_TYPE: 0, - ENUM_MISMATCH: 1, - ANY_OF_MISSING: 10, - ONE_OF_MISSING: 11, - ONE_OF_MULTIPLE: 12, - NOT_PASSED: 13, - // Numeric errors - NUMBER_MULTIPLE_OF: 100, - NUMBER_MINIMUM: 101, - NUMBER_MINIMUM_EXCLUSIVE: 102, - NUMBER_MAXIMUM: 103, - NUMBER_MAXIMUM_EXCLUSIVE: 104, - // String errors - STRING_LENGTH_SHORT: 200, - STRING_LENGTH_LONG: 201, - STRING_PATTERN: 202, - // Object errors - OBJECT_PROPERTIES_MINIMUM: 300, - OBJECT_PROPERTIES_MAXIMUM: 301, - OBJECT_REQUIRED: 302, - OBJECT_ADDITIONAL_PROPERTIES: 303, - OBJECT_DEPENDENCY_KEY: 304, - // Array errors - ARRAY_LENGTH_SHORT: 400, - ARRAY_LENGTH_LONG: 401, - ARRAY_UNIQUE: 402, - ARRAY_ADDITIONAL_ITEMS: 403, - // Format errors - FORMAT_CUSTOM: 500 -}; -var ErrorMessagesDefault = { - INVALID_TYPE: "invalid type: {type} (expected {expected})", - ENUM_MISMATCH: "No enum match for: {value}", - ANY_OF_MISSING: "Data does not match any schemas from \"anyOf\"", - ONE_OF_MISSING: "Data does not match any schemas from \"oneOf\"", - ONE_OF_MULTIPLE: "Data is valid against more than one schema from \"oneOf\": indices {index1} and {index2}", - NOT_PASSED: "Data matches schema from \"not\"", - // Numeric errors - NUMBER_MULTIPLE_OF: "Value {value} is not a multiple of {multipleOf}", - NUMBER_MINIMUM: "Value {value} is less than minimum {minimum}", - NUMBER_MINIMUM_EXCLUSIVE: "Value {value} is equal to exclusive minimum {minimum}", - NUMBER_MAXIMUM: "Value {value} is greater than maximum {maximum}", - NUMBER_MAXIMUM_EXCLUSIVE: "Value {value} is equal to exclusive maximum {maximum}", - // String errors - STRING_LENGTH_SHORT: "String is too short ({length} chars), minimum {minimum}", - STRING_LENGTH_LONG: "String is too long ({length} chars), maximum {maximum}", - STRING_PATTERN: "String does not match pattern: {pattern}", - // Object errors - OBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({propertyCount}), minimum {minimum}", - OBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({propertyCount}), maximum {maximum}", - OBJECT_REQUIRED: "Missing required property: {key}", - OBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed", - OBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {missing} (due to key: {key})", - // Array errors - ARRAY_LENGTH_SHORT: "Array is too short ({length}), minimum {minimum}", - ARRAY_LENGTH_LONG: "Array is too long ({length}), maximum {maximum}", - ARRAY_UNIQUE: "Array items are not unique (indices {match1} and {match2})", - ARRAY_ADDITIONAL_ITEMS: "Additional items not allowed", - // Format errors - FORMAT_CUSTOM: "Format validation failed ({message})" -}; - -function ValidationError(code, message, dataPath, schemaPath, subErrors) { - if (code === undefined) { - throw new Error ("No code supplied for error: "+ message); - } - this.code = code; - this.message = message; - this.dataPath = dataPath || ""; - this.schemaPath = schemaPath || ""; - this.subErrors = subErrors || null; -} -ValidationError.prototype = new Error(); -ValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) { - if (dataPrefix !== null) { - dataPrefix = dataPrefix.replace("~", "~0").replace("/", "~1"); - this.dataPath = "/" + dataPrefix + this.dataPath; - } - if (schemaPrefix !== null) { - schemaPrefix = schemaPrefix.replace("~", "~0").replace("/", "~1"); - this.schemaPath = "/" + schemaPrefix + this.schemaPath; - } - if (this.subErrors !== null) { - for (var i = 0; i < this.subErrors.length; i++) { - this.subErrors[i].prefixWith(dataPrefix, schemaPrefix); - } - } - return this; -}; - -function isTrustedUrl(baseUrl, testUrl) { - if(testUrl.substring(0, baseUrl.length) === baseUrl){ - var remainder = testUrl.substring(baseUrl.length); - if ((testUrl.length > 0 && testUrl.charAt(baseUrl.length - 1) === "/") - || remainder.charAt(0) === "#" - || remainder.charAt(0) === "?") { - return true; - } - } - return false; -} - -var languages = {}; -function createApi(language) { - var globalContext = new ValidatorContext(); - var currentLanguage = language || 'en'; - var api = { - addFormat: function () { - globalContext.addFormat.apply(globalContext, arguments); - }, - language: function (code) { - if (!code) { - return currentLanguage; - } - if (!languages[code]) { - code = code.split('-')[0]; // fall back to base language - } - if (languages[code]) { - currentLanguage = code; - return code; // so you can tell if fall-back has happened - } - return false; - }, - addLanguage: function (code, messageMap) { - var key; - for (key in ErrorCodes) { - if (messageMap[key] && !messageMap[ErrorCodes[key]]) { - messageMap[ErrorCodes[key]] = messageMap[key]; - } - } - var rootCode = code.split('-')[0]; - if (!languages[rootCode]) { // use for base language if not yet defined - languages[code] = messageMap; - languages[rootCode] = messageMap; - } else { - languages[code] = Object.create(languages[rootCode]); - for (key in messageMap) { - if (typeof languages[rootCode][key] === 'undefined') { - languages[rootCode][key] = messageMap[key]; - } - languages[code][key] = messageMap[key]; - } - } - return this; - }, - freshApi: function (language) { - var result = createApi(); - if (language) { - result.language(language); - } - return result; - }, - validate: function (data, schema, checkRecursive) { - var context = new ValidatorContext(globalContext, false, languages[currentLanguage], checkRecursive); - if (typeof schema === "string") { - schema = {"$ref": schema}; - } - context.addSchema("", schema); - var error = context.validateAll(data, schema); - this.error = error; - this.missing = context.missing; - this.valid = (error === null); - return this.valid; - }, - validateResult: function () { - var result = {}; - this.validate.apply(result, arguments); - return result; - }, - validateMultiple: function (data, schema, checkRecursive) { - var context = new ValidatorContext(globalContext, true, languages[currentLanguage], checkRecursive); - if (typeof schema === "string") { - schema = {"$ref": schema}; - } - context.addSchema("", schema); - context.validateAll(data, schema); - var result = {}; - result.errors = context.errors; - result.missing = context.missing; - result.valid = (result.errors.length === 0); - return result; - }, - addSchema: function () { - return globalContext.addSchema.apply(globalContext, arguments); - }, - getSchema: function () { - return globalContext.getSchema.apply(globalContext, arguments); - }, - getSchemaMap: function () { - return globalContext.getSchemaMap.apply(globalContext, arguments); - }, - getSchemaUris: function () { - return globalContext.getSchemaUris.apply(globalContext, arguments); - }, - getMissingUris: function () { - return globalContext.getMissingUris.apply(globalContext, arguments); - }, - dropSchemas: function () { - globalContext.dropSchemas.apply(globalContext, arguments); - }, - reset: function () { - globalContext.reset(); - this.error = null; - this.missing = []; - this.valid = true; - }, - missing: [], - error: null, - valid: true, - normSchema: normSchema, - resolveUrl: resolveUrl, - getDocumentUri: getDocumentUri, - errorCodes: ErrorCodes - }; - return api; -} - -var tv4 = createApi(); -tv4.addLanguage('en-gb', ErrorMessagesDefault); - -//legacy property -tv4.tv4 = tv4; - -if (typeof module !== 'undefined' && module.exports){ - module.exports = tv4; -} -else { - global.tv4 = tv4; -} - -})(this); - -//@ sourceMappingURL=tv4.js.map \ No newline at end of file diff --git a/vendor/styles/diffview.css b/vendor/styles/diffview.css new file mode 100644 index 000000000..811a593b7 --- /dev/null +++ b/vendor/styles/diffview.css @@ -0,0 +1,83 @@ +/* +This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib> + +Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Chas Emerick. +*/ +table.diff { + border-collapse:collapse; + border:1px solid darkgray; + white-space:pre-wrap +} +table.diff tbody { + font-family:Courier, monospace +} +table.diff tbody th { + font-family:verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif; + background:#EED; + font-size:11px; + font-weight:normal; + border:1px solid #BBC; + color:#886; + padding:.3em .5em .1em 2em; + text-align:right; + vertical-align:top +} +table.diff thead { + border-bottom:1px solid #BBC; + background:#EFEFEF; + font-family:Verdana +} +table.diff thead th.texttitle { + text-align:left +} +table.diff tbody td { + padding:0px .4em; + padding-top:.4em; + vertical-align:top; +} +table.diff .empty { + background-color:#DDD; +} +table.diff .replace { + background-color:#FD8 +} +table.diff .delete { + background-color:#E99; +} +table.diff .skip { + background-color:#EFEFEF; + border:1px solid #AAA; + border-right:1px solid #BBC; +} +table.diff .insert { + background-color:#9E9 +} +table.diff th.author { + text-align:right; + border-top:1px solid #BBC; + background:#EFEFEF +} \ No newline at end of file diff --git a/vendor/styles/jquery-ui-1.10.3.custom.css b/vendor/styles/jquery-ui-1.10.4.custom.css similarity index 85% rename from vendor/styles/jquery-ui-1.10.3.custom.css rename to vendor/styles/jquery-ui-1.10.4.custom.css index f9710a7e0..c956584a0 100644 --- a/vendor/styles/jquery-ui-1.10.3.custom.css +++ b/vendor/styles/jquery-ui-1.10.4.custom.css @@ -1,8 +1,8 @@ -/*! jQuery UI - v1.10.3 - 2013-09-04 +/*! jQuery UI - v1.10.4 - 2014-04-11 * http://jqueryui.com * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.slider.css, jquery.ui.theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ +* To view and modify this theme, visit http://jqueryui.com/themeroller/ +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ /* Layout helpers ----------------------------------*/ @@ -296,7 +296,7 @@ /* Component containers ----------------------------------*/ .ui-widget { - font-family: Lucida Grande,Lucida Sans,Arial,sans-serif; + font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { @@ -306,25 +306,25 @@ .ui-widget select, .ui-widget textarea, .ui-widget button { - font-family: Lucida Grande,Lucida Sans,Arial,sans-serif; + font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget-content { - border: 1px solid #a6c9e2; - background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { - border: 1px solid #4297d7; - background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; - color: #ffffff; + border: 1px solid #aaaaaa; + background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; font-weight: bold; } .ui-widget-header a { - color: #ffffff; + color: #222222; } /* Interaction states @@ -332,15 +332,15 @@ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { - border: 1px solid #c5dbec; - background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; - font-weight: bold; - color: #2e6e9e; + border: 1px solid #d3d3d3; + background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { - color: #2e6e9e; + color: #555555; text-decoration: none; } .ui-state-hover, @@ -349,30 +349,34 @@ .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { - border: 1px solid #79b7e7; - background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; - font-weight: bold; - color: #1d5987; + border: 1px solid #999999; + background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, -.ui-state-hover a:visited { - color: #1d5987; +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited { + color: #212121; text-decoration: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { - border: 1px solid #79b7e7; - background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; - font-weight: bold; - color: #e17009; + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { - color: #e17009; + color: #212121; text-decoration: none; } @@ -381,8 +385,8 @@ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { - border: 1px solid #fad42e; - background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; + border: 1px solid #fcefa1; + background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; } .ui-state-highlight a, @@ -394,7 +398,7 @@ .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #cd0a0a; - background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, @@ -440,27 +444,27 @@ } .ui-icon, .ui-widget-content .ui-icon { - background-image: url(images/ui-icons_469bdd_256x240.png); + background-image: url("images/ui-icons_222222_256x240.png"); } .ui-widget-header .ui-icon { - background-image: url(images/ui-icons_d8e7f3_256x240.png); + background-image: url("images/ui-icons_222222_256x240.png"); } .ui-state-default .ui-icon { - background-image: url(images/ui-icons_6da8d5_256x240.png); + background-image: url("images/ui-icons_888888_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon { - background-image: url(images/ui-icons_217bc0_256x240.png); + background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-active .ui-icon { - background-image: url(images/ui-icons_f9bd01_256x240.png); + background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-highlight .ui-icon { - background-image: url(images/ui-icons_2e83ff_256x240.png); + background-image: url("images/ui-icons_2e83ff_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { - background-image: url(images/ui-icons_cd0a0a_256x240.png); + background-image: url("images/ui-icons_cd0a0a_256x240.png"); } /* positioning */ @@ -650,37 +654,37 @@ .ui-corner-top, .ui-corner-left, .ui-corner-tl { - border-top-left-radius: 5px; + border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { - border-top-right-radius: 5px; + border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { - border-bottom-left-radius: 5px; + border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { - border-bottom-right-radius: 5px; + border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; + background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3; filter: Alpha(Opacity=30); } .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; + background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3; filter: Alpha(Opacity=30); border-radius: 8px;