diff --git a/app/core/social-handlers/FacebookHandler.coffee b/app/core/social-handlers/FacebookHandler.coffee
index 666dad1d3..9252bb151 100644
--- a/app/core/social-handlers/FacebookHandler.coffee
+++ b/app/core/social-handlers/FacebookHandler.coffee
@@ -42,6 +42,7 @@ module.exports = FacebookHandler = class FacebookHandler extends CocoClass
FB.api('/me', {fields: 'email,last_name,first_name,gender'}, @onReceiveMeInfo)
onReceiveMeInfo: (r) =>
+ console.log "Got Facebook user info:", r
unless r.email
console.error('could not get data, since no email provided')
return
diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee
index f2c082446..c17323a56 100644
--- a/app/locale/ko.coffee
+++ b/app/locale/ko.coffee
@@ -4,20 +4,20 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
no_ie: "죄송하지만 코드컴뱃은 인터넷 익스플로러 8에서는 동작하지 않습니다." # Warning that only shows up in IE8 and older
no_mobile: "코드 컴뱃은 모바일 기기용으로 제작되지 않았습니다. 아마 동작하지 않을 가능성이 높습니다." # Warning that shows up on mobile devices
play: "시작" # The big play button that opens up the campaign view.
-# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses
+ play_campaign_version: "캠페인 버전 플레이" # Shows up under big play button if you only play /courses
old_browser: "브라우저가 너무 오래된 버전이라 코드 컴뱃을 실행할 수 없습니다." # Warning that shows up on really old Firefox/Chrome/Safari
old_browser_suffix: "시도해볼 수는 있겠지만..안될 수도 있습니다."
-# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval."
+ ipad_browser: "슬픈 소식: 코드컴뱃은 아이패드의 브라우저에서 구동되지않습니다. 좋은 소식: 우리의 아이패드 앱은 애플의 승인을 기다리고있습니다 ."
campaign: "캠페인"
for_beginners: "초보자용"
multiplayer: "멀티플레이어" # Not currently shown on home page
for_developers: "개발자용" # Not currently shown on home page.
-# or_ipad: "Or download for iPad"
+ or_ipad: "또는 아이패드의 다운로드"
nav:
play: "레벨" # The top nav bar entry where players choose which levels to play
community: "커뮤니티"
-# courses: "Courses"
+ courses: "코스"
editor: "에디터"
blog: "블로그"
forum: "포럼"
@@ -33,7 +33,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
contact: "문의"
twitter_follow: "팔로우"
teachers: "선생님들"
-# careers: "Careers"
+ careers: "채용"
modal:
close: "닫기"
@@ -52,7 +52,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
play:
play_as: "Play As " # Ladder page
-# compete: "Compete!" # Course details page
+ compete: "경쟁!" # Course details page
spectate: "관중모드" # Ladder page
players: "플레이어" # Hover over a level on /play
hours_played: "플레이한 시간" # Hover over a level on /play
@@ -68,14 +68,14 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
achievements: "성취한 목표" # Tooltip on achievement list button from /play
account: "계정" # Tooltip on account button from /play
settings: "설정" # Tooltip on settings button from /play
-# poll: "Poll" # Tooltip on poll button from /play
+ poll: "투표" # Tooltip on poll button from /play
next: "다음" # Go from choose hero to choose inventory before playing a level
change_hero: "영웅 교체" # Go back from choose inventory to choose hero
buy_gems: "젬 구매"
-# subscription_required: "Subscription Required"
+ subscription_required: "가입 필수"
anonymous: "이름없는 플레이어"
level_difficulty: "난이도: "
-# play_classroom_version: "Play Classroom Version" # Choose a level in campaign version that you also can play in one of your courses
+ play_classroom_version: "교실 버전 플레이" # Choose a level in campaign version that you also can play in one of your courses
campaign_beginner: "초보자 캠페인"
awaiting_levels_adventurer_prefix: "매주 마다 새로운 레벨이 생깁니다."
awaiting_levels_adventurer: "모험자로 등록 하세요!"
@@ -83,16 +83,16 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
adjust_volume: "소리 조절"
campaign_multiplayer: "멀티 플레이어 전투장"
campaign_multiplayer_description: "... 이곳에서 당신은 다른 인간 플레이어들과 직접 결투할 수 있습니다."
-# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
-# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
+ campaign_old_multiplayer: "(추천하지 않습니다) 숙련된 멀티플레이어 경쟁"
+ campaign_old_multiplayer_description: "더 문명화 된 시대의 유물. 어떤 시뮬레이션은 이러한 이전, 영웅없는 멀티 경기장에 대해 실행되지 않습니다."
share_progress_modal:
-# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat."
+ blurb: "당신은 큰 진전을 보이고있습니다! 당신이 코드컴뱃으로 얼마나 많이 배웠는지 부모님게 말하십시오."
email_invalid: "이메일 주소가 올바르지 않습니다."
-# form_blurb: "Enter your parent's email below and we’ll show them!"
+ form_blurb: "아래에 부모님의 이메일을 입력하고 우리는 그것들을 보여줍니다!"
form_label: "이메일"
placeholder: "이메일"
-# title: "Excellent Work, Apprentice"
+ title: "우수한, 초심자"
login:
sign_up: "계정 생성"
@@ -100,8 +100,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
logging_in: "로그인 중"
log_out: "로그아웃"
forgot_password: "비밀번호를 잊으셨나요?"
-# authenticate_gplus: "Authenticate G+"
-# load_profile: "Load G+ Profile"
+ authenticate_gplus: "G+ 인증"
+ load_profile: "G+ 프로필 불러오기"
finishing: "완료중.."
sign_in_with_facebook: "Facebook으로 로그인"
sign_in_with_gplus: "G+로 로그인"
@@ -114,9 +114,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
log_in: "비밀번호로 로그인"
required: "진행하기 전에 로그인이 필요합니다."
login_switch: "이미 계정이 있으신가요?"
-# school_name: "School Name and City"
-# optional: "optional"
-# school_name_placeholder: "Example High School, Springfield, IL"
+ school_name: "학교 이름과 도시"
+ optional: "옵션"
+ school_name_placeholder: "예시 고등학교, 스프링필드, IL"
recover:
recover_account_title: "계정 복구"
@@ -166,18 +166,18 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
withdrawn: "취소됨"
accept: "승인"
reject: "보류"
-# withdraw: "Withdraw"
+ withdraw: "철수"
submitter: "제출자"
submitted: "제출됨"
commit_msg: "커밋 메세지"
version_history: "버전 히스토리"
version_history_for: "버전 히스토리 : "
-# select_changes: "Select two changes below to see the difference."
-# undo_prefix: "Undo"
+ select_changes: "차이를 보기위해 두 가지 사항을 변경하도록 선택합니다."
+ undo_prefix: "되돌리기"
undo_shortcut: "(Ctrl+Z)"
-# redo_prefix: "Redo"
+ redo_prefix: "다시하기"
redo_shortcut: "(Ctrl+Shift+Z)"
-# play_preview: "Play preview of current level"
+ play_preview: "현재 수준의 미리보기 재생"
result: "결과"
results: "결과들"
description: "설명"
@@ -221,8 +221,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
years: "년"
play_level:
-# completed_level: "Completed Level:"
-# course: "Course:"
+ completed_level: "완료된 레벨:"
+ course: "코스:"
done: "완료"
next_level: "다음 레벨:"
next_game: "다음 게임"
@@ -256,26 +256,26 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
victory_saving_progress: "저장하기"
victory_go_home: "홈으로"
victory_review: "리뷰를 남겨주세요"
-# victory_review_placeholder: "How was the level?"
+ victory_review_placeholder: "어떤 레벨입니까?"
victory_hour_of_code_done: "정말 종료합니까?"
victory_hour_of_code_done_yes: "네 내 Hour of Code™ 완료했습니다!"
victory_experience_gained: "획득한 경험치"
victory_gems_gained: "획득한 젬"
victory_new_item: "새로운 아이템"
-# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
+ victory_viking_code_school: "놀랍습니다, 당신은 그냥 이길 힘든 수준이었습니다! 이미 소프트웨어 개발자가 아닌 경우, 당신은 비이킹 코드 학교에서 빠르게 이해할것입니다, 당신이 다음 레벨에서 자신의 능력을 14주 동안 전문 웹 개발자가 될 수있는 곳입니다."
victory_become_a_viking: "바이킹이 되세요"
guide_title: "가이드"
tome_cast_button_run: "실행"
tome_cast_button_running: "실행중"
-# tome_cast_button_ran: "Ran"
-# tome_submit_button: "Submit"
-# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
-# tome_select_method: "Select a Method"
-# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methods).
+ tome_cast_button_ran: "실행됨"
+ tome_submit_button: "적용"
+ tome_reload_method: "이 방법에 대한 원래의 코드를 다시불러오기" # Title text for individual method reload button.
+ tome_select_method: "방법 선택"
+ tome_see_all_methods: "편집 할 수있는 모든 방법을 참조하십시오" # Title text for method list selector (shown when there are multiple programmable methods).
tome_select_a_thang: "누군가를 선택하세요. "
tome_available_spells: "사용 가능한 마법"
tome_your_skills: "당신의 스킬"
-# tome_current_method: "Current Method"
+ tome_current_method: "최근 방법"
code_saved: "코드가 저장됨"
skip_tutorial: "넘기기 (esc)"
keyboard_shortcuts: "단축키"
@@ -284,12 +284,12 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
problem_alert_title: "코드를 수정하세요"
time_current: "현재:"
time_total: "최대:"
-# time_goto: "Go to:"
-# non_user_code_problem_title: "Unable to Load Level"
-# infinite_loop_title: "Infinite Loop Detected"
-# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
-# check_dev_console: "You can also open the developer console to see what might be going wrong."
-# check_dev_console_link: "(instructions)"
+ time_goto: "가기:"
+ non_user_code_problem_title: "레벨을 로드 할 수 없습니다"
+ infinite_loop_title: "무한 루프 감지"
+ infinite_loop_description: "세계를 구축하는 초기 코드는 결코 실행이 완료되지 않습니다. 아마도 하나의 정말 느리거나 또는 무한 루프가 있습니다. 혹은 버그일수있습니다. 당신은 다시 이 코드를 실행하려고하거나 기본 상태로 코드를 재설정 할 수 있습니다. 그게 해결되지 않으면, 저희에게 알려 주시기 바랍니다."
+ check_dev_console: "또한 잘못 갈 수를 알기 위해 개발자 콘솔을 열 수 있습니다."
+ check_dev_console_link: "(명령어)"
infinite_loop_try_again: "다시 시도해보세요."
infinite_loop_reset_level: "레벨 리셋"
infinite_loop_comment_out: "내 코드를 일시적 주석처리하기"
@@ -297,7 +297,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
tip_scrub_shortcut: "Ctrl+[, Ctrl+] 를 이용해 실행 속도를 빠르게 할 수 있어요"
tip_guide_exists: "화면 상단의 가이드를 클릭해보세요. 유용한 정보를 얻을 수 있습니다."
tip_open_source: "코드 컴뱃은 100% 오픈 소스 기반입니다!"
-# tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!"
+ tip_tell_friends: "코드 컴뱃을 즐기셨나요? 친구에게 알려주십시오"
tip_beta_launch: "코드 컴뱃은 2013년 10월에 베타 서비스를 출시했습니다."
tip_think_solution: "해결 방법을 고민해보세요, 문제를 고민하지 말구요"
# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra"
@@ -326,7 +326,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# tip_extrapolation: "There are only two kinds of people: those that can extrapolate from incomplete data..."
# tip_superpower: "Coding is the closest thing we have to a superpower."
# tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds"
-# tip_no_code: "No code is faster than no code."
+ tip_no_code: "코드가 없는것보다 빠른것은 없습니다."
tip_code_never_lies: "코드는 절대로 거짓말을 하지 않는다. 주석은 가끔 하지만. — Ron Jeffries"
# tip_reusable_software: "Before software can be reusable it first has to be usable."
# tip_optimization_operator: "Every language has an optimization operator. In most languages that operator is ‘//’"
@@ -341,8 +341,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch"
# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus"
# tip_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha"
-# tip_paper_and_pen: "Before you start coding, you can always plan with a sheet of paper and a pen."
-# tip_solve_then_write: "First, solve the problem. Then, write the code. - John Johnson"
+ tip_paper_and_pen: "코딩을 하기전에, 당신은 항상 종이와 펜으로 계획을 지니고 있어야합니다."
+ tip_solve_then_write: "먼저, 문제를 해결하세요. 그러고, 코드를 쓰는겁니다. - John Johnson"
game_menu:
inventory_tab: "인벤토리"
@@ -355,22 +355,22 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
auth_tab: "가입하기"
inventory_caption: "장비 장착"
choose_hero_caption: "영웅 및 언어 선택 "
-# save_load_caption: "... and view history"
+ save_load_caption: "... 그리고 기록보기"
options_caption: "설정들을 바꾸기"
guide_caption: "문서들과 팁들"
multiplayer_caption: "친구들과 플레이 하세요!"
auth_caption: "진행사항을 저장하세요"
leaderboard:
-# view_other_solutions: "View Leaderboards"
+ view_other_solutions: "리더보드 보기"
scores: "점수"
top_players: "상위 플레이어"
day: "오늘"
week: "이번 주"
-# all: "All-Time"
+ all: "모든-시간"
time: "시간"
-# damage_taken: "Damage Taken"
-# damage_dealt: "Damage Dealt"
+ damage_taken: "데미지 정도"
+ damage_dealt: "죽음을 맞은 데미지"
difficulty: "난이도"
gold_collected: "수집된 골드"
@@ -391,11 +391,11 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
pile_gems: "gem 묶음"
chest_gems: "gem 상자"
purchasing: "구매중..."
- declined: "Your card was declined"
+ declined: "귀하의 카드가 거부되었습니다"
retrying: "서버에러, 다시 시도하세요."
prompt_title: "gem 부족"
prompt_body: "gem이 더 필요하신가요?"
- prompt_button: "Enter Shop"
+ prompt_button: "샵 앤터"
recovered: "gem 구매후 브라우져를 새로고침 하세요."
price: "x{{gems}} / 한달"
@@ -403,10 +403,10 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
# feature1: "110+ basic levels across 4 worlds"
# feature2: "10 powerful new heroes with unique skills!"
-# feature3: "80+ bonus levels"
+ feature3: "80+ 보너스 레벨들"
# feature4: "{{gems}} bonus gems every month!"
-# feature5: "Video tutorials"
-# feature6: "Premium email support"
+ feature5: "영상 튜토리얼"
+ feature6: "프리미엄 이메일 지원"
# feature7: "Private Clans"
free: "프리"
month: "달"
diff --git a/package.json b/package.json
index 5b66726d2..1f3cd320f 100644
--- a/package.json
+++ b/package.json
@@ -98,7 +98,7 @@
"css-brunch": "^1.7.0",
"fs-extra": "^0.26.2",
"jade-brunch": "1.7.5",
- "jasmine": "^2.3.2",
+ "jasmine": "^2.4.1",
"javascript-brunch": "> 1.0 < 1.8",
"karma": "~0.13",
"karma-chrome-launcher": "~0.1.2",
diff --git a/spec/helpers/helper.js b/spec/helpers/helper.js
index 4ad741bb7..7184ad9c3 100644
--- a/spec/helpers/helper.js
+++ b/spec/helpers/helper.js
@@ -38,43 +38,58 @@ if (database.generateMongoConnectionString() !== dbString) {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 120; // for long Stripe tests
-describe('Server Test Helper', function() {
- it('starts the test server', function(done) {
- var server = require('../../server');
- server.startServer(done);
+var initialized = false;
+beforeEach(function(done) {
+ if (initialized) {
+ return done();
+ }
+
+ var async = require('async');
+ async.series([
+ function(cb) {
+ // Start the server
+ var server = require('../../server');
+ server.startServer(cb);
+ },
+ function(cb) {
+ // 5. Check actual database
+ var User = require('../../server/users/User');
+ User.find({}).count(function(err, count) {
+ // For this to serve as a line of defense against testing with the
+ // production DB, tests must be run with
+ expect(err).toBeNull();
+ expect(count).toBeLessThan(100);
+ if(err || count >= 100) {
+ // the only way to be sure we don't keep going with the tests
+ process.exit(1);
+ }
+ GLOBAL.mc.lists.subscribe = _.noop;
+ cb()
+ });
+ },
+ function(cb) {
+ // Clear db
+ var mongoose = require('mongoose');
+ mongoose.connection.db.command({dropDatabase:1}, function(err, result) {
+ if (err) { console.log(err); }
+ cb(err);
+ });
+ },
+ function(cb) {
+ // Initialize products
+ var request = require('request');
+ request.get(getURL('/db/products'), function(err, res, body) {
+ expect(err).toBe(null);
+ expect(res.statusCode).toBe(200);
+ cb(err);
+ });
+ }
+ ],
+ function(err) {
+ if (err) {
+ process.exit(1);
+ }
+ initialized = true;
+ done();
});
-
- it('checks the db is fairly empty', function(done) {
- // 5. Check actual database.
- var User = require('../../server/users/User');
- User.find({}).count(function(err, count) {
- // For this to serve as a line of defense against testing with the
- // production DB, tests must be run with
- expect(err).toBeNull();
- expect(count).toBeLessThan(100);
- if(err || count >= 100) {
- // the only way to be sure we don't keep going with the tests
- process.exit(1);
- }
- GLOBAL.mc.lists.subscribe = _.noop;
- done()
- });
- });
-
- it('clears the db', function(done) {
- var mongoose = require('mongoose');
- mongoose.connection.db.command({dropDatabase:1}, function(err, result) {
- if (err) { console.log(err); }
- done();
- });
- });
-
- it('initializes products', function(done) {
- var request = require('request');
- request.get(getURL('/db/products'), function(err, res, body) {
- expect(err).toBe(null);
- expect(res.statusCode).toBe(200);
- done();
- });
- })
});
\ No newline at end of file