Commit 3136f8a5 authored by nanahira's avatar nanahira

Merge branch 'v3' into v3-m1mac

parents 83cd317f 7026934b
#!/bin/bash
set -x
set -o errexit
if [[ -z "$CI_COMMIT_TAG" ]]; then
export TRAVIS_BRANCH="_no_notarize"
fi
npm ci
npm run dist
#!/bin/bash
set -o errexit
BUNDLE_ID="com.mycard.mycard"
APP_PATH=$(ls -1 dist/*.dmg | head -n 1)
xcrun altool --notarize-app --primary-bundle-id "$BUNDLE_ID" --username "$MACOS_NOTARIZE_USERNAME" --password "$MACOS_NOTARIZE_PASSWORD" --asc-provider "$MACOS_ASC_PROVIDER" -t osx --file "$APP_PATH"
......@@ -14,9 +14,8 @@ macOS_bin:
paths:
- bin
script:
- mkdir -p bin; curl --location --retry
5 https://github.com/aria2/aria2/releases/download/release-1.29.0/aria2-1.29.0-osx-darwin.tar.bz2
| tar --strip-components=2 -C bin -jxf - aria2-1.29.0/bin/aria2c
- mkdir -p bin
- curl --location --retry 5 https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-osx-darwin.tar.bz2 | tar --strip-components=2 -C bin -jxf - aria2-1.35.0/bin/aria2c
windows_bin:
stage: prepare
......@@ -27,13 +26,14 @@ windows_bin:
- bin
script:
- mkdir -p bin
- curl --location --retry 5 --output aria2-1.29.0-win-32bit-build1.zip https://github.com/aria2/aria2/releases/download/release-1.29.0/aria2-1.29.0-win-32bit-build1.zip
- unzip -o aria2-1.29.0-win-32bit-build1.zip aria2-1.29.0-win-32bit-build1/aria2c.exe
- mv aria2-1.29.0-win-32bit-build1/aria2c.exe bin
- rm -rf aria2-1.29.0-win-32bit-build1 aria2-1.29.0-win-32bit-build1.zip
#- wget https://cdn01.moecube.com/ygopro-build-materials/mycard-binaries.zip
#- 7z x -y mycard-binaries.zip
- curl --location --retry 5 --output aria2-1.35.0-win-32bit-build1.zip https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-win-32bit-build1.zip
- unzip -o aria2-1.35.0-win-32bit-build1.zip aria2-1.35.0-win-32bit-build1/aria2c.exe
- mv aria2-1.35.0-win-32bit-build1/aria2c.exe bin
- rm -rf aria2-1.35.0-win-32bit-build1 aria2-1.35.0-win-32bit-build1.zip
- curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/i686/bsdtar-3.4.2-2-i686.pkg.tar.xz" | tar --strip-components=2 -C bin -Jxf - usr/bin/bsdtar.exe
- curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/Base/i686/msys2-base-i686-20161025.tar.xz" | tar --strip-components=3 -C bin -Jxf - msys32/usr/bin/msys-2.0.dll msys32/usr/bin/msys-bz2-1.dll msys32/usr/bin/msys-gcc_s-1.dll msys32/usr/bin/msys-iconv-2.dll msys32/usr/bin/msys-lzma-5.dll msys32/usr/bin/msys-lzo2-2.dll msys32/usr/bin/msys-nettle-6.dll msys32/usr/bin/msys-xml2-2.dll msys32/usr/bin/msys-z.dll msys32/usr/bin/sha256sum.exe msys32/usr/bin/msys-intl-8.dll
- curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/Base/i686/msys2-base-i686-20200517.tar.xz" | tar --strip-components=3 -C bin -Jxf - msys32/usr/bin/msys-2.0.dll msys32/usr/bin/msys-bz2-1.dll msys32/usr/bin/msys-expat-1.dll msys32/usr/bin/msys-gcc_s-1.dll msys32/usr/bin/msys-iconv-2.dll msys32/usr/bin/msys-lz4-1.dll msys32/usr/bin/msys-lzma-5.dll msys32/usr/bin/msys-z.dll msys32/usr/bin/msys-zstd-1.dll msys32/usr/bin/sha256sum.exe
windows:
stage: build
......@@ -70,14 +70,24 @@ macOS:
variables:
CSC_KEY_PASSWORD: $MACOS_CSC_KEY_PASSWORD
CSC_LINK: $MACOS_CSC_LINK
script:
- npm ci
- npm run dist
#- ls -la dist
APPLE_ID: $MACOS_NOTARIZE_USERNAME
APPLE_ID_PASSWORD: $MACOS_NOTARIZE_PASSWORD
TEAM_SHORT_NAME: $MACOS_ASC_PROVIDER
script: ./.ci/macos-build.sh
artifacts:
paths:
- dist/
#macOS_notarize:
# stage: deploy
# dependencies:
# - macOS
# tags:
# - macOS
# script: ./.ci/macos-notarize.sh
# only:
# - tags
upload_to_minio:
stage: deploy
dependencies:
......@@ -90,4 +100,4 @@ upload_to_minio:
- aws s3 --endpoint=https://minio.mycard.moe:9000 sync dist/ s3://mycard/downloads
only:
- tags
- v3
#- v3
......@@ -118,7 +118,7 @@
<div class="panel" id="game_info">
<p [innerHTML]="currentApp.description"></p>
<div id="tags" *ngIf="currentApp.tags">
<div *ngFor="let tag of currentApp.tags" class="btn btn-sm btn-danger tag">{{tags[tag] || tag}}</div>
<div *ngFor="let tag of currentApp.tags" class="btn btn-sm btn-info tag">{{tags[tag] || tag}}</div>
</div>
</div>
<div class="panel" id="game_info_2">
......@@ -133,6 +133,9 @@
<dt i18n>发行日期</dt>
<dd>{{currentApp.released_at | date:'mediumDate'}}</dd>
<dt i18n *ngIf="currentApp.updated_at">更新日期</dt>
<dd *ngIf="currentApp.updated_at">{{currentApp.updated_at | date:'mediumDate'}}</dd>
</dl>
</div>
</div>
......
......@@ -58,6 +58,7 @@ export class App {
homepage: string;
developers: { name: string, url: string }[];
released_at: Date;
updated_at: Date;
category: Category;
parent?: App;
......@@ -167,6 +168,7 @@ export class App {
this.description = app.description;
this.developers = app.developers;
this.released_at = app.released_at;
this.updated_at = app.updated_at;
this.author = app.author;
this.homepage = app.homepage;
this.category = Category[<string>app.category];
......
......@@ -84,7 +84,9 @@ export class AppsService {
let appsURL = 'https://api.mycard.moe/apps.json';
let keysURL = 'https://api.mycard.moe/keys';
try {
let data = await this.http.get(appsURL).map((response) => response.json()).toPromise();
let data = await this.http.get(appsURL)
.timeout(5000)
.map((response) => response.json()).toPromise();
let keys_data = await this.http.get(keysURL, {
search: {
user_id: this.loginService.user.email
......@@ -102,6 +104,7 @@ export class AppsService {
console.error(e);
let data = localStorage.getItem('apps_json');
if (data) {
new Notification('MyCard', {body: '读取最新游戏列表失败...'});
this.apps = this.loadAppsList(JSON.parse(data!));
} else {
alert('读取游戏列表失败,可能是网络不通');
......@@ -278,6 +281,9 @@ export class AppsService {
if (app.released_at) {
app.released_at = new Date(app.released_at);
}
if (app.updated_at) {
app.updated_at = new Date(app.updated_at);
}
if (app.news) {
for (let item of app.news) {
item.updated_at = new Date(item.updated_at);
......
......@@ -2,14 +2,14 @@
<html>
<head>
<meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<link href="../node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style>
@font-face {
font-family: 'Mogra';
font-style: normal;
font-weight: 400;
src: url('font/Mogra-Regular.ttf');
src: url('../font/Mogra-Regular.ttf');
}
html,div,body,td,tr{
background: rgba(0,0,0,0);
......
......@@ -36,7 +36,7 @@ let data_str = data_url.get('data');
let data = JSON.parse(data_str!);
let titleStr;
let icon = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.myname + '/25/1.png';
let icon = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.myname + '/120/1.png';
let myMame = data.myname;
let winTimes, loseTimes, rank, rank_up, DP, DP_up, DP_up_sum, EXP, EXP_up;
let winOrLose = 0;
......
......@@ -59,7 +59,7 @@ span {
height: 1em;
width: 1em;
float: right;
margin: 14px;
margin: 5px;
position: relative;
}
......@@ -114,7 +114,7 @@ span {
}
.fa-spin {
margin: 14px;
margin: 5px;
color: #0275d8;
font-weight: bold;
float: right;
......
......@@ -3,7 +3,7 @@
<nav id="apps" *ngIf="apps" class="bg-faded sidebar scroll">
<div id="search" class="input-group">
<i class="fa fa-search input-group-addon search" id="basic-addon1"></i>
<input #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1">
<input i18n-placeholder #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1">
</div>
<span i18n *ngIf="grouped_apps.installed">已安装</span>
......
......@@ -71,6 +71,11 @@ lobby[hidden], webview[hidden] {
text-align: center;
}
#navbar-brand img {
width: 24px;
margin-top: -5px;
}
#navbar .nav-link {
font-size: 18px;
color: #a7a7a7;
......@@ -92,3 +97,7 @@ lobby[hidden], webview[hidden] {
#navbar {
z-index: 100;
}
#settings-modal .modal-dialog {
margin-top: 50px;
}
\ No newline at end of file
<nav id="navbar" class="navbar navbar-toggleable-md navbar-light">
<a id="navbar-brand" class="navbar-brand" href="#">MyCard</a>
<a id="navbar-brand" class="navbar-brand" href="#">
<img src="images/icon.ico" /> MyCard
</a>
<ul class="navbar-nav mr-auto">
<li *ngIf="!loginService.logged_in" class="nav-item active">
<a i18n class="nav-link" href="#">登录</a>
......
......@@ -8,6 +8,7 @@ import { SettingsService } from './settings.sevices';
window['Tether'] = Tether;
const autoUpdater: Electron.AutoUpdater = remote.getGlobal('autoUpdater');
const konami_code_logger: string[] = [];
@Component({
moduleId: module.id,
......@@ -48,6 +49,22 @@ export class MyCardComponent implements OnInit {
'update-available': this.update_available,
'update-downloaded': this.update_downloaded
}));
$('#settings-modal').on('keyup',(event)=>{
konami_code_logger.unshift(event.key);
if (konami_code_logger[9] == 'ArrowUp'
&& konami_code_logger[8] == 'ArrowUp'
&& konami_code_logger[7] == 'ArrowDown'
&& konami_code_logger[6] == 'ArrowDown'
&& konami_code_logger[5] == 'ArrowLeft'
&& konami_code_logger[4] == 'ArrowRight'
&& konami_code_logger[3] == 'ArrowLeft'
&& konami_code_logger[2] == 'ArrowRight'
&& konami_code_logger[1].toLowerCase() == 'b'
&& konami_code_logger[0].toLowerCase() == 'a'
) {
this.currentWindow.webContents.openDevTools();
}
});
// document.addEventListener('drop', (event)=>{
// console.log('drop', event);
// event.preventDefault();
......@@ -120,6 +137,7 @@ export class MyCardComponent implements OnInit {
remote.app.relaunch();
remote.app.quit();
}
$('#settings-modal').modal('hide');
}
//
......
......@@ -18,6 +18,9 @@ import { CandyComponent } from './candy.component';
import { RavenErrorHandler } from './error-handler';
import { NetworkComponent } from './network.component';
export function settingsService_getLocale(settingsService: SettingsService) {
return settingsService.getLocale();
}
@NgModule({
imports: [BrowserModule, FormsModule, ReactiveFormsModule, HttpModule],
......@@ -31,7 +34,7 @@ import { NetworkComponent } from './network.component';
, {
provide: LOCALE_ID,
deps: [SettingsService],
useFactory: (settingsService: SettingsService) => settingsService.getLocale()
useFactory: settingsService_getLocale
}
// , {
// provide: ErrorHandler, useClass: RavenErrorHandler
......
......@@ -50,23 +50,6 @@
/*border-bottom: none;*/
/*}*/
/*!*fixme: auto width*!*/
/*#game-list-modal .title {*/
/*width: 25%;*/
/*}*/
/*#game-list-modal .users {*/
/*width: 20%;*/
/*}*/
/*#game-list-modal .mode {*/
/*width: 20%;*/
/*}*/
/*#game-list-modal .extra {*/
/*width: 35%;*/
/*}*/
/*.float-left {*/
/*float: left;*/
/*}*/
......@@ -104,6 +87,17 @@ form {
display: block;
}
#game-create-windbot .modal-body {
max-height: 400px;
overflow-y: auto;
}
#game-replay-modal .modal-dialog,
#game-create-windbot .modal-dialog,
#game-list-modal .modal-dialog {
margin-top: 50px;
}
#game-list-modal .modal-content {
flex-direction: row;
}
......@@ -185,13 +179,81 @@ form {
}
#game-replay-watch {
height: 500px;
height: 480px;
}
#game-replay-watch table {
font-size: 14px;
}
#game-replay-watch th.mode {
width: 15%;
}
#game-replay-watch th.users {
width: 15%;
}
#game-replay-watch th.extra {
width: 20%;
}
#game-list th.users {
width: 20%;
}
#game-list th.mode {
width: 15%;
}
#game-list th.extra {
width: 35%;
}
#game-list td.users,
#game-list td.extra,
#game-replay-watch td.title,
#game-replay-watch td.users,
#game-replay-watch td.extra {
overflow-x: hidden;
white-space: nowrap;
}
#game-list td.users {
max-width: 95px;
}
#game-list td.extra {
max-width: 185px;
}
#game-replay-watch td.title {
max-width: 360px;
}
#game-replay-watch td.users {
max-width: 90px;
}
#game-replay-watch td.extra {
max-width: 120px;
}
#game-list td.extra span,
#game-replay-watch td.extra span {
margin-left: -2px;
padding-right: 2px;
border-right: 1px solid #999;
}
#game-list td.extra span:first-child,
#game-replay-watch td.extra span:first-child {
margin-left: 0;
}
#game-list td.extra span:last-child,
#game-replay-watch td.extra span:last-child {
padding-right: 0;
border-right: none;
}
#game-replay-watch .avatar {
width: 18px;
height: 18px;
......
......@@ -70,7 +70,7 @@
<tr *ngFor="let room of rooms" class="room" (click)="join_room(room)">
<td class="title">{{room.title}}</td>
<td class="users">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)">
</td>
<td class="mode">
<span i18n *ngIf="room.options.mode === 0">单局模式</span>
......@@ -79,20 +79,20 @@
</td>
<td class="extra">
<span *ngIf="room.options.rule != default_options.rule">{{{'0': 'OCG', '1': 'TCG', '2': 'O/T', '3': '专有卡禁止'}[room.options.rule]}}</span>
<span i18n *ngIf="room.options.start_lp != default_options.start_lp">{{room.options.start_lp}} LP</span>
<span i18n *ngIf="room.options.start_hand != default_options.start_hand">{{room.options.start_hand}} 初始</span>
<span i18n *ngIf="room.options.draw_count != default_options.draw_count">{{room.options.draw_count}} 抽卡</span>
<span i18n *ngIf="room.options.enable_priority != default_options.enable_priority">旧规则</span>
<span i18n *ngIf="room.options.no_check_deck != default_options.no_check_deck">不检查</span>
<span i18n *ngIf="room.options.no_shuffle_deck != default_options.no_shuffle_deck">不洗卡</span>
<span i18n *ngIf="room.options.start_lp != default_options.start_lp">{{room.options.start_lp}}LP</span>
<span i18n i18n-title *ngIf="room.options.start_hand != default_options.start_hand" title="初始起手数量">{{room.options.start_hand}}初始</span>
<span i18n i18n-title *ngIf="room.options.draw_count != default_options.draw_count" title="每回合抽卡数量">{{room.options.draw_count}}抽卡</span>
<span i18n i18n-title *ngIf="room.options.enable_priority != default_options.enable_priority" title="上个版本的大师规则">旧规则</span>
<span i18n i18n-title *ngIf="room.options.no_check_deck != default_options.no_check_deck" title="不检查卡组是否合规">不检查</span>
<span i18n i18n-title *ngIf="room.options.no_shuffle_deck != default_options.no_shuffle_deck" title="任何时候都不洗切卡组">不洗卡</span>
</td>
</tr>
</tbody>
</table>
<div id="join-private" class="input-group input-group-sm">
<i class="fa fa-key input-group-addon" aria-hidden="true"></i>
<input [(ngModel)]="join_password" type="text" class="form-control" placeholder="在这输入你朋友的私密房间密码就可以进去了哦!">
<span class="input-group-btn"><button class="btn btn-secondary" type="button" (click)="join_private(join_password)">加入私密房间</button></span>
<input [(ngModel)]="join_password" type="text" class="form-control" i18n-placeholder placeholder="在这输入你朋友的私密房间密码就可以进去了哦!">
<span class="input-group-btn"><button i18n class="btn btn-secondary" type="button" (click)="join_private(join_password)">加入私密房间</button></span>
</div>
</div>
......@@ -103,18 +103,18 @@
<ng-container *ngIf="!room.private; else private">
<label i18n for="game-create-title">游戏标题</label>
<input type="text" maxlength="12" class="form-control form-control-sm" id="game-create-title" name="title" [(ngModel)]="room.title" required [readonly]>
<small class="form-text text-muted">最多 12 个字</small>
<small i18n class="form-text text-muted">最多 12 个字</small>
</ng-container>
<ng-template #private>
<label *ngIf="room.private" for="game-create-title"><i class="fa fa-key" aria-hidden="true"></i>
<span i18n>房间密码</span></label>
<div class="input-group input-group-sm">
<input type="text" maxlength="12" class="form-control" id="game-create-title" name="title" [(ngModel)]="host_password" readonly>
<span id="copy-wrapper" class="input-group-btn" data-toggle="tooltip" title="房间密码已复制到剪贴板">
<button class="btn btn-secondary fa fa-clipboard" type="button" title="复制" (click)="copy(host_password, $event)"></button>
<span i18n-title id="copy-wrapper" class="input-group-btn" data-toggle="tooltip" title="房间密码已复制到剪贴板">
<button i18n-title class="btn btn-secondary fa fa-clipboard" type="button" title="复制" (click)="copy(host_password, $event)"></button>
</span>
</div>
<small class="form-text text-muted">把这个分享给你的朋友</small>
<small i18n class="form-text text-muted">把这个分享给你的朋友</small>
</ng-template>
</div>
......@@ -129,7 +129,7 @@
</div>
<div class="form-group">
<label i18n for="game-create-rule">决斗模式</label>
<select class="form-control form-control-sm" id="game-create-mode" name="mode" (change)="room.options.start_lp = room.options.mode == 2 ? 16000 : 8000" [(ngModel)]="room.options.mode">
<select class="form-control form-control-sm" id="game-create-mode" name="mode" (change)="room.options.start_lp = room.options.mode == 2 ? default_options.start_lp_tag : default_options.start_lp" [(ngModel)]="room.options.mode">
<option i18n value="0">单局模式</option>
<option i18n value="1">比赛模式</option>
<option i18n value="2">TAG</option>
......@@ -212,9 +212,9 @@
<li class="nav-item">
<a i18n class="nav-link" data-toggle="tab" href="#game-replay-local" role="tab">本地录像</a>
</li>
<li *ngIf="settingsService.getLocale().startsWith('zh')" class="nav-item">
<!--<li *ngIf="settingsService.getLocale().startsWith('zh')" class="nav-item">
<a class="nav-link" data-toggle="tab" href="#game-replay-bilibili" role="tab">哔哩哔哩</a>
</li>
</li>-->
<!--<li class="nav-item">-->
<!--<a class="nav-link" data-toggle="tab" href="#game-replay-youtube" role="tab">YouTube</a>-->
<!--</li>-->
......@@ -224,46 +224,44 @@
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="title">
<span i18n>游戏模式</span>
<th class="mode">
<!--<span i18n>游戏模式</span>-->
<div id="watch-filter" class="dropdown">
<button i18n class="btn btn-secondary dropdown-toggle btn-sm" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
筛选
</button>
<button i18n class="btn btn-secondary dropdown-toggle btn-sm" type="button" id="watchDropdownMenuButton" aria-haspopup="true" aria-expanded="false">游戏模式</button>
<div class="dropdown-menu">
<h6 i18n class="dropdown-header">匹配</h6>
<div class="form-check dropdown-item">
<input id="filter-athletic" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.athletic" (change)="refresh_replay_rooms()">
<label i18n for="filter-athletic" class="form-check-label">竞技匹配</label>
</div>
<div class="form-check dropdown-item">
<input id="filter-entertain" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.entertain" (change)="refresh_replay_rooms()">
<label i18n for="filter-entertain" class="form-check-label">娱乐匹配</label>
</div>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.athletic">
竞技匹配
</label>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.entertain">
娱乐匹配
</label>
<h6 i18n class="dropdown-header">自定义游戏</h6>
<div class="form-check dropdown-item">
<input id="filter-single" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.single" (change)="refresh_replay_rooms()">
<label i18n for="filter-single" class="form-check-label">单局模式</label>
</div>
<div class="form-check dropdown-item">
<input id="filter-match" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.match" (change)="refresh_replay_rooms()">
<label i18n for="filter-match" class="form-check-label">比赛模式</label>
</div>
<div class="form-check dropdown-item">
<input id="filter-tag" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.tag" (change)="refresh_replay_rooms()">
<label i18n for="filter-tag" class="form-check-label">TAG</label>
</div>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.single">
单局模式
</label>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.match">
比赛模式
</label>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.tag">
TAG
</label>
<h6 i18n class="dropdown-header">单人模式</h6>
<div class="form-check dropdown-item">
<input id="filter-windbot" type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.windbot" (change)="refresh_replay_rooms()">
<label i18n for="filter-windbot" class="form-check-label">单人模式</label>
</div>
<label i18n class="form-check dropdown-item">
<input type="checkbox" class="form-check-input" [(ngModel)]="replay_rooms_filter.windbot">
单人模式
</label>
</div>
</div>
</th>
<th i18n class="users">游戏标题</th>
<th i18n class="mode">玩家</th>
<th i18n class="extra">详情</th>
<th i18n class="title">游戏标题</th>
<th i18n class="users">玩家</th>
<th i18n class="extra">额外选项</th>
</tr>
</thead>
<tbody>
......@@ -277,23 +275,24 @@
<span i18n *ngIf="!(room.arena || room.id.startsWith('AI#')) && room.options.mode === 2">TAG</span>
</td>
<td class="title">
<span *ngIf="room.private">{{room.users[0] && room.users[0].username}} 的私密房间</span>
<span i18n *ngIf="room.private">{{room.users[0] && room.users[0].username}} 的私密房间</span>
<span i18n *ngIf="room.arena || room.id.startsWith('AI#')">{{room.users[0] && room.users[0].username}} 跟 {{room.users[1] && room.users[1].username}} 的决斗</span>
<span *ngIf="!(room.arena || room.id.startsWith('AI#') || room.private)">{{room.title}}</span>
</td>
<td class="users">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)">
</td>
<td class="extra">
<span *ngIf="!(room.arena || room.id.startsWith('AI#'))">
<div *ngIf="!(room.arena || room.id.startsWith('AI#'))">
<span *ngIf="room.options.rule != default_options.rule">{{{'0': 'OCG', '1': 'TCG', '2': 'O/T', '3': '专有卡禁止'}[room.options.rule]}}</span>
<span i18n *ngIf="room.options.start_lp != default_options.start_lp">{{room.options.start_lp}} LP</span>
<span i18n *ngIf="room.options.start_hand != default_options.start_hand">{{room.options.start_hand}} 初始</span>
<span i18n *ngIf="room.options.draw_count != default_options.draw_count">{{room.options.draw_count}} 抽卡</span>
<span i18n *ngIf="room.options.enable_priority != default_options.enable_priority">旧规则</span>
<span i18n *ngIf="room.options.no_check_deck != default_options.no_check_deck">不检查</span>
<span i18n *ngIf="room.options.no_shuffle_deck != default_options.no_shuffle_deck">不洗卡</span>
</span>
<span i18n *ngIf="room.options.start_lp != default_options.start_lp && room.options.mode != 2">{{room.options.start_lp}}LP</span>
<span i18n *ngIf="room.options.start_lp != default_options.start_lp_tag && room.options.mode == 2">{{room.options.start_lp}}LP</span>
<span i18n i18n-title *ngIf="room.options.start_hand != default_options.start_hand" title="初始起手数量">{{room.options.start_hand}}初始</span>
<span i18n i18n-title *ngIf="room.options.draw_count != default_options.draw_count" title="每回合抽卡数量">{{room.options.draw_count}}抽卡</span>
<span i18n i18n-title *ngIf="room.options.enable_priority != default_options.enable_priority" title="上个版本的大师规则">旧规则</span>
<span i18n i18n-title *ngIf="room.options.no_check_deck != default_options.no_check_deck" title="不检查卡组是否合规">不检查</span>
<span i18n i18n-title *ngIf="room.options.no_shuffle_deck != default_options.no_shuffle_deck" title="任何时候都不洗切卡组">不洗卡</span>
</div>
</td>
</tr>
</tbody>
......@@ -304,9 +303,9 @@
<a *ngFor="let replay of replays" class="list-group-item list-group-item-action" (click)="watch_replay(replay)">{{replay}}</a>
</div>
</div>
<div *ngIf="settingsService.getLocale().startsWith('zh')" class="tab-pane" id="game-replay-bilibili" role="tabpanel">
<!--<div *ngIf="settingsService.getLocale().startsWith('zh')" class="tab-pane" id="game-replay-bilibili" role="tabpanel">
<webview #bilibili src="http://m.bilibili.com/search.html?keyword=YGOPro" (did-finish-load)="bilibili_loaded()" (will-navigate)="bilibili_navigate($event)"></webview>
</div>
</div>-->
<!--<div class="tab-pane" id="game-replay-youtube" role="tabpanel">-->
<!--<webview #youtube src="https://m.youtube.com/results?search_query=YGOPro" (did-finish-load)="youtube_loaded()" (will-navigate)="youtube_navigate($event)"></webview>-->
<!--</div>-->
......
......@@ -69,6 +69,7 @@ interface Options {
mode: number;
rule: number;
start_lp: number;
start_lp_tag: number;
start_hand: number;
draw_count: number;
enable_priority: boolean;
......@@ -137,6 +138,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
mode: 1,
rule: this.settingsService.getLocale().startsWith('zh') ? 0 : 1,
start_lp: 8000,
start_lp_tag: 16000,
start_hand: 5,
draw_count: 1,
enable_priority: false,
......@@ -386,6 +388,23 @@ export class YGOProComponent implements OnInit, OnDestroy {
this.replay_connections = [];
});
let watchDropdownMenu = $('#watch-filter');
watchDropdownMenu.on("change", "input[type='checkbox']", (event) => {
//$(event.target).closest("label").toggleClass("active", (<HTMLInputElement> event.target).checked);
this.refresh_replay_rooms();
});
replay_modal.on('click', (event) => {
if (!watchDropdownMenu.is(event.target) && !watchDropdownMenu.has(event.target).length) {
watchDropdownMenu.removeClass('show');
}
});
$('#watchDropdownMenuButton').on('click', () => {
watchDropdownMenu.toggleClass('show');
});
remote.ipcMain.on('YGOPro', (e: any, type: string) => {
console.log('rrrrr');
this.request_match(type);
......@@ -602,7 +621,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
data.exp_rank_ex = exp_rank_ex;
data.arena_rank_ex = arena_rank_ex;
if (start_time !== data.start_time) {
this.appsService.showResult('end_YGOPro_single.html', data, 202, 222);
this.appsService.showResult('app/end_YGOPro_single.html', data, 202, 222);
}
});
} catch (error) {
......@@ -797,4 +816,11 @@ export class YGOProComponent implements OnInit, OnDestroy {
// this.youtube.nativeElement.src = 'https://m.youtube.com/results?search_query=YGOPro';
// shell.openExternal(event.url);
// }
avatar_fallback(event) {
if (!event.target.getAttribute('fallback')) {
event.target.src = "images/noavatar.png";
event.target.setAttribute('fallback', true);
}
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style>
html,div,body,td,tr{
background: rgba(0,0,0,0);
font-size:14px;
font-family:-apple-system, Arial, 'Source Sans Pro', "Microsoft YaHei", 'Microsoft JhengHei', "WenQuanYi Micro Hei", sans-serif;
padding:0;
margin:0;
color:#00a4d9;
}
i:hover{
color:#0b88b1;
}
td{
text-align:center;
width:50px;
height:20px;
line-height: 20px;
padding:2px;
}
td:nth-child(1){
width:auto;
}
td:nth-child(2){
text-align:left;
width:150px
}
img{
display: block;
height: 100%;
}
.window{
position:relative;
width:320px;
height:180px;
background:linear-gradient(to bottom, #bfcdd2, rgba(218, 218, 218, 0.17));
padding:5px;
}
.myIcon{
float:left;
height:100%
}
.close{
position:absolute;
top:5px;
right:5px
}
.title{
/*display: table;*/
height:50px;
line-height:30px;
padding:5px;
border-bottom:1px #fff solid;
color:#00a4d9
}
.winOrLose{
font-size:30px;
display:table-cell;
vertical-align:middle;
padding-right:10px;
display: none;
}
.myInfo_tr{background:linear-gradient(to right, rgba(255,255,255,1), rgba(255,255,255,0.5));}
#myName{
height:50%;
line-height:100%;
font-size:25px;
}
#myScore{font-size:25px; padding-right: 10px}
#myExp{font-size:15px; color:green; padding-right: 10px}
#myGold{font-size:15px; color:#ec6d20; padding-right: 10px}
#win{color:green;}
#lose{color:red;}
#users_info{border-collapse:collapse;}
</style>
</head>
<body>
<div class="window">
<i onclick="window.opener=null;window.close();" class="fa fa-times close" title="关闭"></i>
<div class="title">
<div class="myIcon">
<img id="myIcon" >
</div>
<div style="float:left; padding-left:10px">
<div id="myName"></div>
<div style="height:50%;">
<span id="myScore"></span>
<span id="myExp"></span>
<span id="myGold"></span>
</div>
</div>
<div style="height:100%; float:right; display:table;">
<span id="win" class="winOrLose"></span>
<span id="lose" class="winOrLose"></span>
</div>
</div>
<div class="clear:both"></div>
<div style="padding:5px;">
<table id="users_info">
<tr>
<th colspan="2">玩家</th>
<th>评价</th>
<th>经验</th>
<th>金币</th>
</tr>
</table>
</div>
</div>
<script>
window.exports = {}
</script>
<script src="end.js"></script>
</body>
</html>
/**
* Created by break on 2017/6/9.
*/
import * as $ from 'jquery';
let data_url = (new URL(document.location.toString())).searchParams;
let data_str = data_url.get('data');
console.log(data_str);
// data={
// 'win':true,
// 'users_info':[{
// 'isPlay':true,
// 'icon':'http://himg.bdimg.com/sys/portrait/item/55c177633531343132333435f20c.jpg',
// 'name':'刘大耳',
// 'score':'5555',
// 'exp':'123',
// 'gold':'321'
// },{
// 'isPlay':false,
// 'icon':'http://himg.bdimg.com/sys/portrait/item/55c177633531343132333435f20c.jpg',
// 'name':'关绿帽',
// 'score':'008',
// 'exp':'789',
// 'gold':'999'
// }
// ]
// }
let data = JSON.parse(data_str!);
console.log(data);
let win = data.win;
let users_info = data.users_info;
let my_info;
if (win) {
$('#win').show();
} else {
$('#lose').show();
}
console.log(data);
for (let user_info of users_info) {
let tr_style = '';
if (user_info.isPlay) {
tr_style = ' class="myInfo_tr"';
my_info = user_info;
}
let tr = '<tr' + tr_style + '> <td><img src="' + user_info.icon + '"></td><td>' + user_info.name + '</td><td>' + user_info.score + '</td><td>' + user_info.exp + '</td><td>' + user_info.gold + '</td></tr>';
$('#users_info').append(tr);
}
$('#myIcon').attr('src', my_info.icon);
$('#myName').html(my_info.name);
$('#myScore').html(my_info.score);
$('#myExp').html(my_info.exp);
$('#myGold').html(my_info.gold);
let t = setTimeout(function () {
window.opener = null;
window.close();
}, 5000);
$('html').hover(function () {
clearTimeout(t);
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style>
html,div,body,td,tr{
background: rgba(0,0,0,0);
font-size:14px;
font-family:-apple-system, Arial, 'Source Sans Pro', "Microsoft YaHei", 'Microsoft JhengHei', "WenQuanYi Micro Hei", sans-serif;
padding:0;
margin:0;
color:#00a4d9;
}
i:hover{
color:#0b88b1;
}
td{
text-align:center;
width:50px;
height:20px;
line-height: 20px;
padding:2px;
}
td:nth-child(1){
width:auto;
}
td:nth-child(2){
text-align:left;
width:150px
}
img{
display: block;
height: 100%;
}
.window{
position:relative;
width:320px;
height:180px;
background:linear-gradient(to bottom, #bfcdd2, rgba(218, 218, 218, 0.17));
padding:5px;
}
.myIcon{
float:left;
height:100%
}
.close{
position:absolute;
top:5px;
right:5px
}
.title{
/*display: table;*/
height:50px;
line-height:30px;
padding:5px;
border-bottom:1px #fff solid;
color:#00a4d9
}
.winOrLose{
font-size:30px;
display:table-cell;
vertical-align:middle;
padding-right:10px;
display: none;
}
.myInfo_tr{background:linear-gradient(to right, rgba(255,255,255,1), rgba(255,255,255,0.5));}
#myName{
height:50%;
line-height:100%;
font-size:25px;
}
#myScore{font-size:25px; padding-right: 10px}
#myExp{font-size:15px; color:green; padding-right: 10px}
#myGold{font-size:15px; color:#ec6d20; padding-right: 10px}
#win{color:green;}
#lose{color:red;}
#users_info{border-collapse:collapse;}
</style>
</head>
<body>
<div class="window">
<i onclick="window.opener=null;window.close();" class="fa fa-times close" title="关闭"></i>
<div class="title">
<div class="myIcon">
<img id="myIcon" >
</div>
<div style="float:left; padding-left:10px">
<div id="myName"></div>
<div style="height:50%;">
<span id="myScore"></span>
<span id="myExp"></span>
<span id="myGold"></span>
</div>
</div>
<div style="height:100%; float:right; display:table;">
<span id="win" class="winOrLose"></span>
<span id="lose" class="winOrLose"></span>
<span id="a_draw" class="winOrLose"></span>
</div>
</div>
<div class="clear:both"></div>
<div style="padding:5px;">
<table id="users_info">
<tr>
<th colspan="2">玩家</th>
<th>评价</th>
<th>经验</th>
<th>金币</th>
</tr>
</table>
</div>
</div>
<script>
window.exports = {}
</script>
<script src="end_YGOPro.js"></script>
</body>
</html>
/**
* Created by break on 2017/6/9.
*/
import * as $ from 'jquery';
let data_url = (new URL(document.location.toString())).searchParams;
let data_str = data_url.get('data');
console.log(data_str);
// {"usernamea": "loyi",
// "usernameb": "saten",
// "userscorea": 2,
// "userscoreb": 0,
// "expa": 36.5,
// "expb": 9,
// "expa_ex": 35.5,
// "expb_ex": 8.5,
// "pta": 479.950607945308,
// "ptb": 494.012345698275,
// "pta_ex": 479.950607945308,
// "ptb_ex": 494.012345698275,
// "type": "entertain",
// "start_time": "2017-06-12T17:07:54.000Z",
// "end_time": "2017-06-12T17:23:16.000Z"}
let data = JSON.parse(data_str!);
let icona = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.usernamea + '/25/1.png';
let iconb = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.usernameb + '/25/1.png';
console.log(data);
if (data.usernamea === data.myname) {
if ( data.userscorea > data.userscoreb) {
$('#win').show();
}else if ( data.userscorea < data.userscoreb) {
$('#lose').show();
}else {
$('#a_draw').show();
}
$('#myIcon').attr('src', icona);
$('#myName').html(data.usernamea);
$('#myScore').html(data.userscorea);
$('#myExp').html(parseInt(data.expa).toString());
$('#myGold').html(parseInt(data.pta).toString());
let tr = '<tr class="myInfo_tr"><td><img src="' + icona + '"></td><td>' + data.usernamea + '</td><td>' + data.userscorea + '</td><td>' + parseInt(data.expa).toString() + '</td><td>' + parseInt(data.pta).toString() + '</td></tr>';
$('#users_info').append(tr);
tr = '<tr><td><img src="' + iconb + '"></td><td>' + data.usernameb + '</td><td>' + data.userscoreb + '</td><td>' + parseInt(data.expb).toString() + '</td><td>' + parseInt(data.ptb).toString() + '</td></tr>';
$('#users_info').append(tr);
}else {
if ( data.userscorea > data.userscoreb) {
$('#lose').show();
}else if ( data.userscorea < data.userscoreb) {
$('#win').show();
}else {
$('#a_draw').show();
}
$('#myIcon').attr('src', iconb);
$('#myName').html(data.usernameb);
$('#myScore').html(data.userscoreb);
$('#myExp').html(parseInt(data.expb).toString());
$('#myGold').html(parseInt(data.ptb).toString());
let tr = '<tr><td><img src="' + icona + '"></td><td>' + data.usernamea + '</td><td>' + data.userscorea + '</td><td>' + parseInt(data.expa).toString() + '</td><td>' + parseInt(data.pta).toString() + '</td></tr>';
$('#users_info').append(tr);
tr = '<tr class="myInfo_tr"><td><img src="' + iconb + '"></td><td>' + data.usernameb + '</td><td>' + data.userscoreb + '</td><td>' + parseInt(data.expb).toString() + '</td><td>' + parseInt(data.ptb).toString() + '</td></tr>';
$('#users_info').append(tr);
}
let t = setTimeout(function () {
window.opener = null;
window.close();
}, 5000);
$('html').hover(function () {
clearTimeout(t);
});
// let {ipcRenderer} = require('electron');
// setTimeout( function(){ipcRenderer.send('massage', '')} , 1000);
This diff was suppressed by a .gitattributes entry.
......@@ -27,7 +27,7 @@ if (handleElevate()) {
return;
}
const { ipcMain, app, shell, BrowserWindow, Menu, Tray } = require('electron');
const { ipcMain, app, shell, BrowserWindow, Menu, Tray, Notification } = require('electron');
const { autoUpdater } = require('electron-updater');
const isDev = require('electron-is-dev');
const child_process = require('child_process');
......@@ -37,6 +37,9 @@ const path = require('path');
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
// aria2c启动失败则为null
let aria2c;
// 单实例
const gotTheLock = app.requestSingleInstanceLock()
......@@ -136,9 +139,18 @@ function createAria2c() {
default:
throw 'unsupported platform';
}
return child_process.spawn(aria2c_path, ['--enable-rpc', '--rpc-allow-origin-all', '--continue', '--split=10', '--min-split-size=1M', '--max-connection-per-server=10', '--remove-control-file', '--allow-overwrite'], { stdio: 'ignore' });
aria2c = child_process.spawn(aria2c_path, [
'--enable-rpc',
'--rpc-allow-origin-all',
'--rpc-listen-port=6800',
'--continue',
'--split=10',
'--min-split-size=1M',
'--max-connection-per-server=10',
'--remove-control-file',
'--allow-overwrite'
], { stdio: 'ignore' });
}
const aria2c = createAria2c();
// 主窗口
function createWindow() {
......@@ -212,6 +224,12 @@ app.on('ready', async () => {
if (process.platform === 'win32') {
createTray();
}
createAria2c();
aria2c.on('error', (err) => {
new Notification({ title: 'MyCard', body: '启动aria2失败,可能是被杀毒软件误删。游戏下载和更新功能将不可用。' }).show();
console.error(err);
aria2c = null;
});
if (process.env['NODE_ENV'] === 'production') {
/*let updateTempPath = '~/.cache/mycard-updater'
if (process.platform === 'win32') {
......@@ -248,7 +266,7 @@ app.on('activate', function () {
app.on('quit', () => {
// windows 在非 detach 模式下会自动退出子进程
if (process.platform !== 'win32') {
if (process.platform !== 'win32' && aria2c) {
aria2c.kill();
}
});
......@@ -5,581 +5,1485 @@
<source>竞技匹配</source>
<target>Ranked</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">3</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0bf938a69dc640aba46428d1cbbd2fef34c88daa">
<source>娱乐匹配</source>
<target>Unranked</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">272</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5026868223e028297430142f8cafdf6dd6fcf004">
<source>自定义游戏</source>
<target>Custom</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">5</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">241</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3768b60a7e2625bb1fc2db37eb8c6b8e4bd99101">
<source>单人模式</source>
<target>Vs. Com</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">6</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">33</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">254</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">270</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="44e77a67a8818ad255773958c6b32c6280fb9faa">
<source>观战录像</source>
<target>Replay</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="157bc28ebe7ecf3f455852f64687ea580dfe23dc">
<source>预计时间</source>
<target>Estimated Wait</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6968a638448b1f36c52a3b306541214acbf9d567">
<source>实际时间</source>
<target>Actual Wait</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f6f3be110e7043e3cfe71a7bd75b8b3be79bff5d">
<source>取消</source>
<target>Cancel</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">46</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">238</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">288</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">341</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\network.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="def237147323023c1f5ce0579345da19d4707fdb">
<source>卡组</source>
<target>Deck</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a842d4536fdee499a55c753c50810254347ced32">
<source>编辑</source>
<target>Edit</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1e64bb9c96dfc2b9cb03179dd0c9f992e0645e5f">
<source>选择对手</source>
<target>Select Opponent</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a73f70f2c3126bd103eba9b300efb446ff353187">
<source>随机</source>
<target>Random</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5018459a548611c5e7a8bb9f81f8871358089f69">
<source>正在读取游戏列表...</source>
<target>Loading Game List...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">57</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="dc0c986dacfc57a3254d4164784a43c8c78cd5ef">
<source>现在没有等待中的游戏,可以自行创建一个房间或者去匹配</source>
<target>There is no opening game available now, you can create a new game yourself, or play ranked game.</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e35d1bf7c735e8df55a62046cd2d9f820bf5bffd">
<source>游戏标题</source>
<target>Title</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">62</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">104</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">262</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3872a823a98042e4730861ab6f9344239d9deeb6">
<source>玩家</source>
<target>Player</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">63</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">263</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d62a2717a0381d996785271c61177711777ba63c">
<source>决斗模式</source>
<target>Duel mode</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">64</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d4038dd5d0e9d5139d425fc7bea40e40d965cc5b">
<source>额外选项</source>
<target>Additional Options</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">65</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">140</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">264</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e436a4a0da03320dc61ba35bfab390ab85a23d0c">
<source>单局模式</source>
<target>Single Duel</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">76</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">133</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">273</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2cf71acc936cf244cc5862b28efe461e91cb137d">
<source>比赛模式</source>
<target>Match</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">77</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">274</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c2ed31e132c305b995382adce0f95ccdabadaa21">
<source>TAG</source>
<target>TAG</target>
</trans-unit>
<trans-unit datatype="html" id="8514a93609dc67a44e5b198b53e42fe468f8a81a">
<source><x id="INTERPOLATION"/> LP</source>
<target><x id="INTERPOLATION"/> LP</target>
</trans-unit>
<trans-unit datatype="html" id="4a6f5fb56c2367667232cc46608dc46a282e2e56">
<source><x id="INTERPOLATION"/> 初始</source>
<target><x id="INTERPOLATION"/> Starting</target>
</trans-unit>
<trans-unit datatype="html" id="cae091ce48a80dbc22d5fde2eea1cbd34e7038c7">
<source><x id="INTERPOLATION"/> 抽卡</source>
<target><x id="INTERPOLATION"/> Draw</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">135</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">275</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="aec28732ff145abe493362d5e88bc6bad1019318">
<source><x id="INTERPOLATION"/>LP</source>
<target><x id="INTERPOLATION"/>LP</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">288</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cd98842cdc11669a0738a361b22f43c0c673766b">
<source><x id="INTERPOLATION"/>初始</source>
<target><x id="INTERPOLATION"/>Start</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">290</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9b3b12112efb752aa72374ffa6c8ca42a2d70a3d">
<source>初始起手数量</source>
<target>Draw count when the duel start</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">290</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cd1d172d64a79d88e6e9b9bb2c622ce94dd5a929">
<source><x id="INTERPOLATION"/>抽卡</source>
<target><x id="INTERPOLATION"/>Draw</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">84</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">291</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6a3e97dfd1992e61e97d2a2be2b2ddf13f318ac9">
<source>每回合抽卡数量</source>
<target>Draw count of each turn</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">84</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">291</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="785cc65c8db99887484b3b1067c45b32810c7c2a">
<source>旧规则</source>
<target>Old rules</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">85</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">165</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="350191538e68a92c731e26748aeeaefd6057999f">
<source>上个版本的大师规则</source>
<target>Previous Master Rule</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">85</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="b5be173f96718dfa737f1da31d9ffab5b803561e">
<source>不检查</source>
<target>Don't check</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">86</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0b515681fb332bd8b8b2546e947c1e2dd17eee1d">
<source>不检查卡组是否合规</source>
<target>Don't check if the deck is legal</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">86</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="517c8b6e5361bc32d7458a1e8b2bdbf09abb6f01">
<source>不洗卡</source>
<target>Don't shuffle</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">87</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c8f90957413ee947f95851258a906b2507c5ec2a">
<source>任何时候都不洗切卡组</source>
<target>Don't shuffle the deck at any time</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">87</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="739d660c23ece9c643e11f84a5a9b989bc1bff92">
<source>在这输入你朋友的私密房间密码就可以进去了哦!</source>
<target>Enter the password of the private room...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="52cb37d4d51b8e9926dc9f8b3ebd87f7f9c28e0d">
<source>加入私密房间</source>
<target>Join private room</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="19923836b1ae79614782426a7a001d8ccfa27b5c">
<source>创建房间</source>
<target>Create</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="dbbe20b6bcb3ec318694afcfaa51c3cc8c4f6c14">
<source>最多 12 个字</source>
<target>Up to 12 characters</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="b086b473216334b81d0ca5f4086a8c500c6adfae">
<source>房间密码</source>
<target>Room password</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5eadb60473a54773298ee679a4ce6a19d9c2f31c">
<source>复制</source>
<target>Copy</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">114</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\network.component.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="681f5f7d8ca9f49149f4ddbcc3809e847da9abc2">
<source>房间密码已复制到剪贴板</source>
<target>Room password copied</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">113</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2ce9a108884cb5f7b73d734c07839a8a7c60c223">
<source>把这个分享给你的朋友</source>
<target>Share this to your friend</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4b911deaa4defd0803635012281f3dd1112aabd1">
<source>卡片允许</source>
<target>Rule</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">122</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="93d3b6bb4f3a66efd8c49f9063f6c8d6a9e959bf">
<source>OCG</source>
<target>OCG</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">124</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="150cb34526cf737163beb63ab76e4809ac1367dd">
<source>TCG</source>
<target>TCG</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be6d109c359b1d11b261280915e6b1706ca3ed9b">
<source>OCG & TCG</source>
<target>TCG/OCG</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2a3f48f9ea5e6aae92e249ac2b279dbc07a6127d">
<source>专有卡禁止</source>
<target>Unspecified</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="01cfbee3f1d69f5adae299b7b8c8d75034aef53b">
<source>初始 LP</source>
<target>Starting LP</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0d72e50857f1d2504e08f7886d4c9d35a46e3ed9">
<source>初始手牌数</source>
<target>Starting Hand</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="88cc5676c5322fd55c1df94ab487359100e6f9dd">
<source>每回合抽卡</source>
<target>Draw / Turn</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">154</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7c29758dc53e9a5d62665d9fa4fadb28425b801f">
<source>私密房间</source>
<target>Private room</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6e7470ddf4c35f6fab39b6ebeadb1780701a5469">
<source>不检查卡组</source>
<target>Don't check</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">169</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4f104c680937cb724b069f62ab1ff60651c5bb06">
<source>不洗切卡组</source>
<target>Don't shuffle</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="84276d07f694b80bd5ea94d28283b6530248d02e">
<source>观战</source>
<target>Live</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">207</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d516b78557483a84288359494abde950d3887518">
<source>本地录像</source>
<target>Local</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">213</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7047116f06b2fcb5e7f8e8589d1ef31628aff0fa">
<source>游戏模式</source>
<target>Game Mode</target>
</trans-unit>
<trans-unit datatype="html" id="b4e8477152d07e8eba5ff8e205c4531816b47292">
<source>筛选</source>
<target>Filter</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">230</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="968e4d8a0f7b5eaaa1d588a738abdaa0ec389d16">
<source>匹配</source>
<target>Matchmaking</target>
</trans-unit>
<trans-unit datatype="html" id="08afd8197e09842de9d76741588c6c1bcd3e2605">
<source>详情</source>
<target>Detail</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">232</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="def75ea9acd3da49e6147241d1be818f8a7ce80b">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
竞技匹配
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
Ranked
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f17779dfdda35219eee16c358b3cbe14ff789e3c">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
娱乐匹配
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
Unranked
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="25cdef61312547afc246b3429d94771c5ee2fa3b">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
单局模式
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
Single mode
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">242</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="18af41ff38726d95ec017e21f8da22c3a08ccb3a">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
比赛模式
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
Match mode
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9fcb9c4a68f2af185ebc6717184d06939e6902fe">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
TAG
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
TAG
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">250</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2592afa29068412ddab43d6961c75827f8ca0d1f">
<source>
<x ctype="x-input" id="TAG_INPUT"/>
单人模式
</source>
<target>
<x ctype="x-input" id="TAG_INPUT"/>
Bot mode
</target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="eb9b7293445a26df2b986acef9687b87427eb81a">
<source><x id="INTERPOLATION"/> 的私密房间</source>
<target>Private Room of <x id="INTERPOLATION"/> </target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5136f852d874c46bf808987470980a0f2560487e">
<source><x id="INTERPOLATION"/><x id="INTERPOLATION_1"/> 的决斗</source>
<target><x id="INTERPOLATION"/> Vs. <x id="INTERPOLATION_1"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\ygopro.component.ts</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4fbedd55acdf8789c0d5bb10792a2775540c990b">
<source><x id="INTERPOLATION"/> 购买</source>
<target><x id="INTERPOLATION"/> Buy</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0415ea4132361a518cfb8b81e058f4238b85f071">
<source>安装试玩版</source>
<target>Install Trial Version</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a8cae935472a05e1c8c9be436bb7b1bdea96a54a">
<source>安装</source>
<target>Install</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">173</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e6194d8a9c8da57b667847cd80f1da563f2c2b1e">
<source>导入</source>
<target>Import</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8bb533b37ee18bf8d09df19b4d7234b38f134909">
<source>正在下载</source>
<target>Downloading...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2fe99d94b20d6f8aba7814d8657037ec9d69d36c">
<source>正在安装...</source>
<target>Installing...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="bea72fe35b7b9933e126b6ee3a6828c307ccc3d4">
<source>正在卸载...</source>
<target>UnInstalling...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e5ee7e692c816893b6fd2f9375e6d8303cd794cd">
<source>等待安装...</source>
<target>Pending...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3d632d85701edba578ee10c6802c5fe49bca1d62">
<source>正在更新...</source>
<target>Updating</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">30</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d3852e0147360b29d0d6076e95dd1ad0098a60db">
<source>运行</source>
<target>Start</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="67adbad4f646bb8e1c440522bafea8fe5f7e6bfd">
<source>设置</source>
<target>Settings</target>
</trans-unit>
<trans-unit datatype="html" id="3d6cad40e26f99e39bc6f5925a890ba83b67ce5b">
<source>联机</source>
<target>Network</target>
</trans-unit>
<trans-unit datatype="html" id="5eadb60473a54773298ee679a4ce6a19d9c2f31c">
<source>复制</source>
<target>Copy</target>
</trans-unit>
<trans-unit datatype="html" id="95d5e106e679433bec012420b1ab9334c294bc7e">
<source>选择服务器</source>
<target>Select Server</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">43</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="409ab83692bb4c157cddafe70de9e95531be796e">
<source>排位成绩</source>
<target>Rank Result</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">73</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="eb22ba5ed7019f8799bc645c508108136ad54096">
<source>竞技排名</source>
<target>D.P Rank</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">77</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="78da696d0961bc2c3f10d9e6f5998161ba17b75f">
<source>娱乐排名</source>
<target>EXP Rank</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c3e6d747b93851670dd03bc38346f8f7f6fee421">
<source>竞技胜率</source>
<target>Win Rate</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ed1a1a97ab1b37a358ca132a5c87040a9af13693">
<source>经验</source>
<target>EXP</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">85</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0ce6333a9b6c85ccd57ecdbee84ef7f6f3f51ef4">
<source>胜场</source>
<target>Win</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a89a5c5567bbe1de398b978749b9a1bf6f1281bf">
<source>负场</source>
<target>Lose</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">95</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="41a0424d676209939f79f70c8ef8aa8a143d3451">
<source>平局</source>
<target>Draw</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3f4d682cd4fc7579e9ea6bd1bddec84dbc35fd50">
<source>总场</source>
<target>Total</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">107</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f5f5d4874301c4b42cdbfab010c953631abbcec9">
<source>更多资料</source>
<target>More Info</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">114</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d894d6d2877894a61841bb27d0ed7a85419b58aa">
<source>开发</source>
<target>Developer</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="502c98fe1d2359937a3be80448a1343c43eb0e82">
<source>发行日期</source>
<target>Release Date</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c221cbf6933c44b3c99740ed3f8715db7ce9791f">
<source>更新日期</source>
<target>Update Date</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">137</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="63346eb53d54138db02c1713ae58f73bb1b8786f">
<source>新闻</source>
<target>News</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">144</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="b1c134df688af90e436e49f6d3e9f6960f9497c6">
<source>了解更多</source>
<target>More Info</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">149</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3ebbe3f1c691ec3184ac8c7a5f360706501e6b50">
<source>名称</source>
<target>Name</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d58ff4f339ad18d82b08fb0615ba8c1cf373a4a2">
<source>操作</source>
<target>Action</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">162</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e090f6d9d8129a7b8b92387f05f37eb4b44c0b4e">
<source>卸载</source>
<target>Uninstall</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">170</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8d0792a89fc399aafb40cc1228cb8c04a2056883">
<source>本地文件</source>
<target>Local Files</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="628c76783ac32e6c8b2ea9134397b8cb82a82cd6">
<source>浏览本地文件</source>
<target>Browse</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">188</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6d582ed48c57c91fc7cf10f36f3869cd33808d1d">
<source>校验完整性</source>
<target>Verify</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">189</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4809edca33b1a07d7d6e8905287d3825e676f2c8">
<source>安装 <x id="INTERPOLATION"/></source>
<target>Install <x id="INTERPOLATION"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f8e60167c7a0871ccf40ed2a0750311411dfd665">
<source>即将开始安装 <x id="INTERPOLATION"/></source>
<target>Preparing Installation <x id="INTERPOLATION"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="63a6c9b023e9e9f8ddfba70b0e24931008fa2510">
<source>安装位置</source>
<target>Path</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0b96c54bf810c6deb2c32253bf16b86d3c90da94">
<source>快捷方式</source>
<target>Shortcuts</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9a629bd93b2e21100857f30721b7ac44ce0a2e23">
<source>创建启动菜单快捷方式</source>
<target>Create Start Menu shortcut</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8aa0a41ee6809b972d3904d96607ba5e6dc48fd9">
<source>创建 LaunchPad 快捷方式</source>
<target>Create Launchpad Shortcut</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="da32e99069864644f0419f67858d93815e029b02">
<source>创建开始菜单快捷方式</source>
<target>Create Start Menu Shortcut</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d8a2d9a9f8854ad118381e6e30a41dc1959a4f0b">
<source>创建桌面快捷方式</source>
<target>Create Desktop Shortcut</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">226</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2af1068491573803bc4756c4f94a689155370d9c">
<source>扩展内容</source>
<target>Expansion</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2ba33dd61b1ac70666322680f248e5336b3ee69a">
<source>依赖:</source>
<target>Dependencies</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">233</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">283</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a15b7787a037bb540cc5d29cd8f955f836359a32">
<source>导入 <x id="INTERPOLATION"/></source>
<target>Import <x id="INTERPOLATION"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">249</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="61b454cd8b58f72dcb818f8b3e71d636255d21a6">
<source>选择主程序 <x id="INTERPOLATION"/></source>
<target>Select program <x id="INTERPOLATION"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e1dc3b38b5b1e156d04cde23cf30209d977faa3f">
<source>导入到</source>
<target>Import to</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">261</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="446a2e3833dd7f4122a0a3f2046e7b062b54d575">
<source>购买 <x id="INTERPOLATION"/></source>
<target>Buy <x id="INTERPOLATION"/></target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">300</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">353</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6b296cbd1145fbf948c58a7afa5c4d200cdfd98b">
<source>购买</source>
<target>Buy</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e81bc577e08b01e7ebe9351760c0c845b3bb2fb4">
<source>返回</source>
<target>Return</target>
<context-group purpose="location">
<context context-type="sourcefile">app\app-detail.component.ts</context>
<context context-type="linenumber">365</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ef65da47763167a418e811d9007c53b896b50479">
<source>最小化</source>
<target>Minimize</target>
<context-group purpose="location">
<context context-type="sourcefile">app\candy.component.ts</context>
<context context-type="linenumber">5</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a4148531ad465c2e931b7e754db36872c37d81e9">
<source>取消最小化</source>
<target>Unminimize</target>
<context-group purpose="location">
<context context-type="sourcefile">app\candy.component.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3b5d294cb083dfe7adeef5030777e93a14b3ba25">
<source>还原</source>
<target>Restore</target>
<context-group purpose="location">
<context context-type="sourcefile">app\candy.component.ts</context>
<context context-type="linenumber">7</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5d721f211851b0df47f1b25a5cc0b66ba0c1d2ec">
<source>最大化</source>
<target>Maximize</target>
<context-group purpose="location">
<context context-type="sourcefile">app\candy.component.ts</context>
<context context-type="linenumber">8</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="18317f699a18335372324838e993a15aeb114d6d">
<source>搜索游戏</source>
<target>Search...</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1761e51e36b01ae1e0012914bd58aa2a741d0401">
<source>已安装</source>
<target>Installed</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="69f3fab778e92fcec3a8c38d53d771a36e6d5230">
<source>推荐</source>
<target>Recommended</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="fc570ecca13755cb4a92e7513fbd55c2d412f23c">
<source>迷之物体</source>
<target>Something</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0873cd6df2d1f1016e02526aa9ba32415c1a11d8">
<source>东方 Project</source>
<target>Touhou Project</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="785db32107cc0b47564b05381a1d782021d77c67">
<source>东方旧作</source>
<target>Touhou old series</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="817376261844eb7eb0c035ed0e3fce744a96b6d9">
<source>已安装的运行库</source>
<target>Installed Runtime Library</target>
<context-group purpose="location">
<context context-type="sourcefile">app\lobby.component.ts</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ae5dccdf399fb229fb9f0153a7ec5c28a4579ca1">
<source>登录</source>
<target>Sign In</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="fbfb7c4354663a67786aa5aee748d1f38b8fe71c">
<source>游戏</source>
<target>Library</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c4fc2b3584e7581cddb08bb1ebfa41e601195d5b">
<source>社区</source>
<target>Community</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a8bb0580a537d7a47ff0a2df6907b5f6acee50c6">
<source>更新出错,点击重试</source>
<target>Download update failed, click to retry</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="a75ff3d3253e8d65f703cf2a9384fc09532a73d5">
<source>正在检查更新</source>
<target>Checking for updates</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">30</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="21d13c0058fb50264b8e8a867dff4133861e5260">
<source>正在下载更新</source>
<target>Downloading updates</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="abd0524ada522c2ca41fa6ac06bbc6a887828d70">
<source>下载更新完成,点击安装</source>
<target>Update Downloaded, click to install</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">32</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d2f3938b0b672d936a9b157211b6212d7f015c21">
<source>切换用户</source>
<target>Logout</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="065034046fe7863f3fe1a1f68e5767cf58bed3c1">
<source>关闭</source>
<target>Close</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9d9335d175b40b85f2b98610af517a8b7509c089">
<source>MyCard 设置</source>
<target>MyCard Settings</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="b22ce2179c700e2499e1d402fb1d3f4392c7f6af">
<source>语言</source>
<target>Language</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af09a0e18f4200fdb729133ddcd5bb43d52439aa">
<source>确定</source>
<target>OK</target>
<context-group purpose="location">
<context context-type="sourcefile">app\mycard.component.ts</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3d6cad40e26f99e39bc6f5925a890ba83b67ce5b">
<source>联机</source>
<target>Network</target>
<context-group purpose="location">
<context context-type="sourcefile">app\network.component.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="95d5e106e679433bec012420b1ab9334c294bc7e">
<source>选择服务器</source>
<target>Select Server</target>
<context-group purpose="location">
<context context-type="sourcefile">app\network.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
</body>
</file>
......
{
"name": "mycard",
"version": "3.0.41",
"version": "3.0.44",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"version": "3.0.41",
"version": "3.0.44",
"hasInstallScript": true,
"license": "UNLICENSED",
"dependencies": {
......@@ -61,6 +61,7 @@
"@types/typeahead": "latest",
"electron": "^4.2.12",
"electron-builder": "latest",
"electron-builder-notarize": "^1.2.0",
"rollup": "latest",
"rollup-plugin-commonjs": "latest",
"rollup-plugin-node-resolve": "latest",
......@@ -560,6 +561,12 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz",
"integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA=="
},
"node_modules/@types/normalize-package-data": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"node_modules/@types/plist": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz",
......@@ -1920,6 +1927,141 @@
"node": ">=14.0.0"
}
},
"node_modules/electron-builder-notarize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/electron-builder-notarize/-/electron-builder-notarize-1.2.0.tgz",
"integrity": "sha512-mSU5CSjydNlO5oFSOimJvzKQ4m/whUUBoE3i2xSAOF7+T2ZIzSfsGCT1SJvqsiHYf2xvTb2RpFoHWE6Oc9Cvgg==",
"dev": true,
"dependencies": {
"electron-notarize": "^0.2.0",
"js-yaml": "^3.14.0",
"read-pkg-up": "^7.0.0"
},
"engines": {
"node": ">=8"
},
"peerDependencies": {
"electron-builder": ">= 20.44.4"
}
},
"node_modules/electron-builder-notarize/node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/electron-builder-notarize/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/electron-builder-notarize/node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/electron-builder-notarize/node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-builder-notarize/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/electron-builder-notarize/node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"dependencies": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
"parse-json": "^5.0.0",
"type-fest": "^0.6.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/electron-builder-notarize/node_modules/read-pkg-up": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"dependencies": {
"find-up": "^4.1.0",
"read-pkg": "^5.2.0",
"type-fest": "^0.8.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-builder-notarize/node_modules/read-pkg/node_modules/type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/electron-builder-notarize/node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"node_modules/electron-builder-notarize/node_modules/type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/electron-builder/node_modules/fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
......@@ -2024,6 +2166,39 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-notarize": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz",
"integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==",
"dev": true,
"dependencies": {
"debug": "^4.1.1",
"fs-extra": "^8.1.0"
}
},
"node_modules/electron-notarize/node_modules/fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/electron-notarize/node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/electron-publish": {
"version": "22.11.7",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.11.7.tgz",
......@@ -2222,6 +2397,19 @@
"node": ">=0.8.0"
}
},
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/estree-walker": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
......@@ -3024,6 +3212,12 @@
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"node_modules/json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
......@@ -3106,6 +3300,12 @@
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
"integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
},
"node_modules/lines-and-columns": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
"dev": true
},
"node_modules/load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
......@@ -3122,6 +3322,18 @@
"node": ">=0.10.0"
}
},
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
......@@ -3483,6 +3695,42 @@
"node": ">=6"
}
},
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
......@@ -5647,6 +5895,12 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz",
"integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA=="
},
"@types/normalize-package-data": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"@types/plist": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz",
......@@ -6750,6 +7004,109 @@
}
}
},
"electron-builder-notarize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/electron-builder-notarize/-/electron-builder-notarize-1.2.0.tgz",
"integrity": "sha512-mSU5CSjydNlO5oFSOimJvzKQ4m/whUUBoE3i2xSAOF7+T2ZIzSfsGCT1SJvqsiHYf2xvTb2RpFoHWE6Oc9Cvgg==",
"dev": true,
"requires": {
"electron-notarize": "^0.2.0",
"js-yaml": "^3.14.0",
"read-pkg-up": "^7.0.0"
},
"dependencies": {
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
}
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"requires": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
"parse-json": "^5.0.0",
"type-fest": "^0.6.0"
},
"dependencies": {
"type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true
}
}
},
"read-pkg-up": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"requires": {
"find-up": "^4.1.0",
"read-pkg": "^5.2.0",
"type-fest": "^0.8.1"
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
}
}
},
"electron-download": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz",
......@@ -6809,6 +7166,38 @@
"resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz",
"integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA=="
},
"electron-notarize": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz",
"integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"fs-extra": "^8.1.0"
},
"dependencies": {
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
}
}
},
"electron-publish": {
"version": "22.11.7",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.11.7.tgz",
......@@ -6973,6 +7362,12 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"estree-walker": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
......@@ -7605,6 +8000,12 @@
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
......@@ -7675,6 +8076,12 @@
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
"integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
},
"lines-and-columns": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
"dev": true
},
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
......@@ -7688,6 +8095,15 @@
"strip-bom": "^2.0.0"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
......@@ -7985,6 +8401,30 @@
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
......
{
"name": "mycard",
"version": "3.0.43",
"version": "3.0.45",
"description": "moecube",
"keywords": [],
"author": "zh99998 <zh99998@gmail.com>",
......@@ -16,7 +16,7 @@
"release": "tsc && electron-builder",
"build:aot": "ngc -p tsconfig-aot.json && rollup -c rollup-config.js",
"tsc": "tsc",
"i18n": "ng-xi18n --i18nFormat 'xlf2' && sed -i.bak 's/source-language=\"en\"/source-language=\"zh-CN\"/' messages.xlf",
"i18n": "ng-xi18n --i18nFormat xlf && sed -i.bak 's/source-language=\"en\"/source-language=\"zh-CN\"/' messages.xlf",
"i18n:upload": "npm run i18n && curl --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} --request PUT --header 'Content-type: multipart/form-data' --form content=@messages.xlf https://www.transifex.com/api/2/project/moecube/resource/messages/content/",
"i18n:translate": "open https://www.transifex.com/moecube/moecube/translate/#en_US/messages/108367258?translated=no",
"i18n:download": "curl --output locale/messages.en-US.xlf --retry 5 --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} https://www.transifex.com/api/2/project/moecube/resource/messages/translation/en_US/?file && sed -i.bak 's/\\&amp;/\\&/g; s/\\&lt;/</g; s/\\&gt;/>/g; s/\\&quot;/\"/g;' locale/messages.en-US.xlf",
......@@ -75,12 +75,13 @@
"@types/typeahead": "latest",
"electron": "^4.2.12",
"electron-builder": "latest",
"electron-builder-notarize": "^1.2.0",
"rollup": "latest",
"rollup-plugin-commonjs": "latest",
"rollup-plugin-node-resolve": "latest",
"rollup-plugin-uglify": "latest",
"tslint": "^3.15.1",
"typescript": "latest"
"typescript": "^2.9.2"
},
"build": {
"productName": "MyCard",
......@@ -94,9 +95,6 @@
"extraResources": [
"bin"
],
"win": {
"publisherName": "Nana Yumesaki"
},
"linux": {
"target": [
{
......@@ -112,6 +110,11 @@
}
]
},
"afterSign": "electron-builder-notarize",
"mac": {
"hardenedRuntime": true,
"entitlements": "./node_modules/electron-builder-notarize/entitlements.mac.inherit.plist"
},
"dmg": {
"contents": [
{
......
......@@ -86,8 +86,7 @@ mycard {
}
.scroll:hover {
overflow-y: auto;
overflow-y: overlay;
}
body.resizing /deep/ * {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment