package.nls.json 代表英文語言文件
{"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up"
}
在 package.json 里可以用下面方式引用
"title": "%command.favourite.moveup%"
新建個?package.nls.zh-cn.json 文件是中文語言包
{"command.favourite.addtofavourite": "添加到收藏夾","command.favourite.deletefavourite": "從收藏夾中刪除","command.favourite.moveup": "上移"
}
同樣方式引用,當 vscode 設置成中文時會引用中文語言包?
"title": "%command.favourite.moveup%"
這是 package.json 用多語言,如果代碼中也想使用多語言怎么辦呢
創建?localize.ts 文件,從?code-settings-sync?插件中拷貝過來的
import { existsSync, readFileSync } from 'fs';
import { resolve } from "path";
import { extensions } from "vscode";
import { ILanguagePack } from '../model/language-pack.model';export class Localize {private bundle = this.resolveLanguagePack();private options: { locale: string };public localize(key: string, ...args: string[]): string {const message = this.bundle[key] || key;return this.format(message, args);}private init() {try {this.options = {...this.options,...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}")};} catch (err) {throw err;}}private format(message: string, args: string[] = []): string {return args.length? message.replace(/\{(\d+)\}/g,(match, rest: any[]) => args[rest[0]] || match): message;}private resolveLanguagePack(): ILanguagePack {this.init();const languageFormat = "package.nls{0}.json";const defaultLanguage = languageFormat.replace("{0}", "");const rootPath = extensions.getExtension('yunan-hu.vscode-favourite').extensionPath;const resolvedLanguage = this.recurseCandidates(rootPath,languageFormat,this.options.locale);const languageFilePath = resolve(rootPath, resolvedLanguage);try {const defaultLanguageBundle = JSON.parse(resolvedLanguage !== defaultLanguage? readFileSync(resolve(rootPath, defaultLanguage), "utf-8"): "{}");const resolvedLanguageBundle = JSON.parse(readFileSync(languageFilePath, "utf-8"));return { ...defaultLanguageBundle, ...resolvedLanguageBundle };} catch (err) {throw err;}}private recurseCandidates(rootPath: string,format: string,candidate: string): string {const filename = format.replace("{0}", `.${candidate}`);const filepath = resolve(rootPath, filename);if (existsSync(filepath)) {return filename;}if (candidate.split("-")[0] !== candidate) {return this.recurseCandidates(rootPath, format, candidate.split("-")[0]);}return format.replace("{0}", "");}
}export default Localize.prototype.localize.bind(new Localize());
注意?extensions.getExtension('yunan-hu.vscode-favourite') 要改為自己的發布者名,和 package.json 里的name值?
?language-pack.model.ts
export interface ILanguagePack {[key: string]: string;
}
使用
import localize from '../helper/localize'vscode.window.showErrorMessage(localize('ext.new.group.name'));
這樣就可以在 ts 中使用了。