Commit aa081edb authored by 神楽坂玲奈's avatar 神楽坂玲奈

ygopro i18n

parent 09e7a347
...@@ -8,10 +8,10 @@ ...@@ -8,10 +8,10 @@
<!--应用变更中--> <!--应用变更中-->
<div class="actions" *ngIf="currentApp.isInstalled() && !currentApp.isReady()"> <div class="actions" *ngIf="currentApp.isInstalled() && !currentApp.isReady()">
<div> <div>
<span *ngIf="currentApp.isDownloading()">正在下载</span> <span i18n *ngIf="currentApp.isDownloading()">正在下载</span>
<span *ngIf="currentApp.isInstalling()">正在安装...</span> <span i18n *ngIf="currentApp.isInstalling()">正在安装...</span>
<span *ngIf="currentApp.isUninstalling()">正在卸载...</span> <span i18n *ngIf="currentApp.isUninstalling()">正在卸载...</span>
<span *ngIf="currentApp.isWaiting()">等待安装...</span> <span i18n *ngIf="currentApp.isWaiting()">等待安装...</span>
<span *ngIf="currentApp.status.total">{{(currentApp.status.progress/currentApp.status.total * 100).toFixed()}}%</span> <span *ngIf="currentApp.status.total">{{(currentApp.status.progress/currentApp.status.total * 100).toFixed()}}%</span>
<span>{{currentApp.progressMessage()}}</span> <span>{{currentApp.progressMessage()}}</span>
</div> </div>
......
...@@ -74,7 +74,7 @@ export class AppDetailComponent implements OnInit { ...@@ -74,7 +74,7 @@ export class AppDetailComponent implements OnInit {
async installMod(mod: App) { async installMod(mod: App) {
let option = new InstallOption(mod, path.dirname(mod.parent.local!.path)); let option = new InstallOption(mod, path.dirname(mod.parent!.local!.path));
await this.install(mod, option, {}); await this.install(mod, option, {});
} }
......
...@@ -52,7 +52,7 @@ export class App { ...@@ -52,7 +52,7 @@ export class App {
author: string; // English Only author: string; // English Only
homepage: string; homepage: string;
category: Category; category: Category;
parent: App; parent?: App;
get download(): string { get download(): string {
let downloadUrl = "https://thief.mycard.moe/metalinks/"; let downloadUrl = "https://thief.mycard.moe/metalinks/";
......
import {Injectable, ApplicationRef, EventEmitter} from "@angular/core"; import {Injectable, ApplicationRef, EventEmitter} from "@angular/core";
import {Http} from "@angular/http"; import {Http} from "@angular/http";
import {App, AppStatus, Action} from "./app"; import {App, AppStatus, Action, Category} from "./app";
import {SettingsService} from "./settings.sevices"; import {SettingsService} from "./settings.sevices";
import * as fs from "fs"; import * as fs from "fs";
import * as path from "path"; import * as path from "path";
...@@ -77,13 +77,15 @@ export class AppsService { ...@@ -77,13 +77,15 @@ export class AppsService {
} }
// 去除无关语言 // 去除无关语言
for (let key of ['name', 'description']) { for (let key of ['name', 'description', 'news']) {
if (app[key]) {
let value = app[key][locale]; let value = app[key][locale];
if (!value) { if (!value) {
value = app[key]["zh-CN"]; value = app[key]["zh-CN"];
} }
app[key] = value; app[key] = value;
} }
}
// 去除平台无关的内容 // 去除平台无关的内容
for (let key of ['actions', 'dependencies', 'references', 'version']) { for (let key of ['actions', 'dependencies', 'references', 'version']) {
...@@ -102,8 +104,8 @@ export class AppsService { ...@@ -102,8 +104,8 @@ export class AppsService {
// 设置App关系 // 设置App关系
//TODO: 这里有必要重新整理一下么? //TODO: 这里有必要重新整理一下么?
for (let [id] of apps) { for (let [id, app] of apps) {
let temp = apps.get(id)!.actions; let temp = app.actions;
let map = new Map<string,any>(); let map = new Map<string,any>();
for (let action of Object.keys(temp)) { for (let action of Object.keys(temp)) {
let openId = temp[action]["open"]; let openId = temp[action]["open"];
...@@ -112,10 +114,9 @@ export class AppsService { ...@@ -112,10 +114,9 @@ export class AppsService {
} }
map.set(action, temp[action]); map.set(action, temp[action]);
} }
apps.get(id)!.actions = map; app.actions = map;
for (let key of ['dependencies', 'references', 'parent']) { for (let key of ['dependencies', 'references', 'parent']) {
let app = apps.get(id)!;
let value = app[key]; let value = app[key];
if (value) { if (value) {
if (Array.isArray(value)) { if (Array.isArray(value)) {
...@@ -129,6 +130,26 @@ export class AppsService { ...@@ -129,6 +130,26 @@ export class AppsService {
} }
} }
} }
// 为语言包置一个默认的名字
// 这里简易做个 i18n 的 hack
const lang = {
'en-US': {
'en-US': 'English',
'zh-CN': 'Simplified Chinese',
'zh-TW': 'Traditional Chinese',
'language_pack': 'Language'
},
'zh-CN': {
'en-US': '英文',
'zh-CN': '简体中文',
'zh-TW': '繁体中文',
'language_pack': '语言包'
}
};
if (!app.name && app.category == Category.module && app.tags.includes('language') && app.parent) {
app.name = `${app.parent.name} ${lang[locale].language_pack} (${app.locales.map((l) => lang[locale][l]).join(', ')})`
}
} }
return apps; return apps;
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div id="main"> <div id="main">
<div id="apps" *ngIf="apps"> <div id="apps" *ngIf="apps">
<span *ngIf="grouped_apps.installed">已安装</span> <span i18n *ngIf="grouped_apps.installed">已安装</span>
<ul *ngIf="grouped_apps.installed" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.installed" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.installed" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.installed" [class.active]="app===currentApp">
<i *ngIf="!app.isReady() && !app.status.total" class="spin fa fa-circle-o-notch fa-spin fa-fw"></i> <i *ngIf="!app.isReady() && !app.status.total" class="spin fa fa-circle-o-notch fa-spin fa-fw"></i>
...@@ -17,13 +17,13 @@ ...@@ -17,13 +17,13 @@
</li> </li>
</ul> </ul>
<span *ngIf="grouped_apps.recommend">推荐</span> <span i18n *ngIf="grouped_apps.recommend">推荐</span>
<ul *ngIf="grouped_apps.recommend" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.recommend" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.recommend" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.recommend" [class.active]="app===currentApp">
<a (click)="chooseApp(app)" href="#">{{app.name}}</a> <a (click)="chooseApp(app)" href="#">{{app.name}}</a>
</li> </li>
</ul> </ul>
<span *ngIf="grouped_apps.mysterious">迷之物体</span> <span i18n *ngIf="grouped_apps.mysterious">迷之物体</span>
<ul *ngIf="grouped_apps.mysterious" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.mysterious" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.mysterious" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.mysterious" [class.active]="app===currentApp">
<a (click)="chooseApp(app)" href="#">{{app.name}}</a> <a (click)="chooseApp(app)" href="#">{{app.name}}</a>
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
max="{{app.status.total}}"></progress> max="{{app.status.total}}"></progress>
</li> </li>
</ul> </ul>
<span *ngIf="grouped_apps.touhou">东方 Project</span> <span i18n *ngIf="grouped_apps.touhou">东方 Project</span>
<ul *ngIf="grouped_apps.touhou" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.touhou" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.touhou" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.touhou" [class.active]="app===currentApp">
<a (click)="chooseApp(app)" href="#">{{app.name}}</a> <a (click)="chooseApp(app)" href="#">{{app.name}}</a>
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
max="{{app.status.total}}"></progress> max="{{app.status.total}}"></progress>
</li> </li>
</ul> </ul>
<span *ngIf="grouped_apps.touhou_pc98">东方旧作</span> <span i18n *ngIf="grouped_apps.touhou_pc98">东方旧作</span>
<ul *ngIf="grouped_apps.touhou_pc98" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.touhou_pc98" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.touhou_pc98" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.touhou_pc98" [class.active]="app===currentApp">
<a (click)="chooseApp(app)" href="#">{{app.name}}</a> <a (click)="chooseApp(app)" href="#">{{app.name}}</a>
</li> </li>
</ul> </ul>
<span *ngIf="grouped_apps.runtime_installed">已安装的运行库</span> <span i18n *ngIf="grouped_apps.runtime_installed">已安装的运行库</span>
<ul *ngIf="grouped_apps.runtime_installed" class="nav nav-sidebar"> <ul *ngIf="grouped_apps.runtime_installed" class="nav nav-sidebar">
<li *ngFor="let app of grouped_apps.runtime_installed" [class.active]="app===currentApp"> <li *ngFor="let app of grouped_apps.runtime_installed" [class.active]="app===currentApp">
<a (click)="chooseApp(app)" href="#">{{app.name}}</a> <a (click)="chooseApp(app)" href="#">{{app.name}}</a>
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
* Created by zh99998 on 16/9/2. * Created by zh99998 on 16/9/2.
*/ */
import {Component, OnInit, ChangeDetectorRef, Input} from "@angular/core"; import {Component, OnInit, ChangeDetectorRef, Input} from "@angular/core";
import {AppsService} from "./apps.service";
import * as fs from "fs"; import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import * as crypto from "crypto"; import * as crypto from "crypto";
...@@ -15,7 +14,7 @@ import {App} from "./app"; ...@@ -15,7 +14,7 @@ import {App} from "./app";
import {Http, Headers, URLSearchParams} from "@angular/http"; import {Http, Headers, URLSearchParams} from "@angular/http";
import "rxjs/Rx"; import "rxjs/Rx";
import {ISubscription} from "rxjs/Subscription"; import {ISubscription} from "rxjs/Subscription";
import {AppLocal} from "./app-local"; import {SettingsService} from "./settings.sevices";
declare const $: any; declare const $: any;
...@@ -109,7 +108,7 @@ export class YGOProComponent implements OnInit { ...@@ -109,7 +108,7 @@ export class YGOProComponent implements OnInit {
connections: WebSocket[] = []; connections: WebSocket[] = [];
constructor(private http: Http, private appsService: AppsService, private loginService: LoginService, private ref: ChangeDetectorRef) { constructor(private http: Http, private settingsService: SettingsService, private loginService: LoginService, private ref: ChangeDetectorRef) {
switch (process.platform) { switch (process.platform) {
case 'darwin': case 'darwin':
this.numfont = ['/System/Library/Fonts/SFNSTextCondensed-Bold.otf']; this.numfont = ['/System/Library/Fonts/SFNSTextCondensed-Bold.otf'];
...@@ -117,7 +116,7 @@ export class YGOProComponent implements OnInit { ...@@ -117,7 +116,7 @@ export class YGOProComponent implements OnInit {
break; break;
case 'win32': case 'win32':
this.numfont = [path.join(process.env['SystemRoot'], 'Fonts', 'arialbd.ttf')]; this.numfont = [path.join(process.env['SystemRoot'], 'Fonts', 'arialbd.ttf')];
this.textfont = [path.join(process.env['SystemRoot'], 'Fonts', 'simsun.ttc')]; this.textfont = [path.join(process.env['SystemRoot'], 'Fonts', 'msyh.ttc'), path.join(process.env['SystemRoot'], 'Fonts', 'msyh.ttf'), path.join(process.env['SystemRoot'], 'Fonts', 'simsun.ttc')];
break; break;
} }
} }
...@@ -208,7 +207,7 @@ export class YGOProComponent implements OnInit { ...@@ -208,7 +207,7 @@ export class YGOProComponent implements OnInit {
} }
} }
if (!await this.get_font([data.textfont.split(' ', 2)[0]])) { if (data.textfont == 'c:/windows/fonts/simsun.ttc 14' || !await this.get_font([data.textfont.split(' ', 2)[0]])) {
let font = await this.get_font(this.textfont); let font = await this.get_font(this.textfont);
if (font) { if (font) {
data['textfont'] = `${font} 14` data['textfont'] = `${font} 14`
...@@ -258,10 +257,51 @@ export class YGOProComponent implements OnInit { ...@@ -258,10 +257,51 @@ export class YGOProComponent implements OnInit {
return this.join('AI#' + name, this.servers[0]) return this.join('AI#' + name, this.servers[0])
} }
start_game(args: string[]) { async start_game(args: string[]) {
let win = remote.getCurrentWindow(); let win = remote.getCurrentWindow();
win.minimize(); win.minimize();
console.log(path.join(this.app.local!.path, this.app.actions.get('main')!.execute), args, {cwd: this.app.local!.path}); let locale = this.settingsService.getLocale();
if (localStorage.getItem('ygopro-locale') != locale) {
console.log(`try convert ygopro locale to ${locale}`)
try {
await new Promise((resolve, reject) => {
let source = fs.createReadStream(path.join(this.app.local!.path, 'locales', locale, 'strings.conf'));
source.on('open', (error: Error) => {
let destination = fs.createWriteStream(path.join(this.app.local!.path, 'strings.conf'));
source.pipe(destination);
destination.on('error', (error: Error) => {
reject(error)
});
destination.on('close', () => {
resolve()
})
});
source.on('error', (error: Error) => {
reject(error)
});
});
await new Promise((resolve, reject) => {
let source = fs.createReadStream(path.join(this.app.local!.path, 'locales', locale, 'cards.cdb'));
source.on('open', (error: Error) => {
let destination = fs.createWriteStream(path.join(this.app.local!.path, 'cards.cdb'));
source.pipe(destination);
destination.on('error', (error: Error) => {
reject(error)
});
destination.on('close', () => {
resolve()
})
});
source.on('error', (error: Error) => {
reject(error)
});
});
localStorage.setItem('ygopro-locale', locale)
console.log(`convert ygopro locale to ${locale} success`)
} catch (error) {
console.error(`convert ygopro locale to ${locale} failed`, error)
}
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let child = child_process.spawn(path.join(this.app.local!.path, this.app.actions.get('main')!.execute), args, { let child = child_process.spawn(path.join(this.app.local!.path, this.app.actions.get('main')!.execute), args, {
cwd: this.app.local!.path, cwd: this.app.local!.path,
......
This diff is collapsed.
...@@ -10,7 +10,7 @@ function handleElevate() { ...@@ -10,7 +10,7 @@ function handleElevate() {
if (process.argv[1] == '-e') { if (process.argv[1] == '-e') {
if (process.platform == 'darwin') { if (process.platform == 'darwin') {
app.dock.hide(); require('electron').app.dock.hide();
} }
let elevate = JSON.parse(new Buffer(process.argv[2], 'base64').toString()); let elevate = JSON.parse(new Buffer(process.argv[2], 'base64').toString());
require('net').connect(elevate['ipc'], function () { require('net').connect(elevate['ipc'], function () {
......
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