diff --git a/src/TTFFont.js b/src/TTFFont.js index 04ef94b4..853db158 100644 --- a/src/TTFFont.js +++ b/src/TTFFont.js @@ -25,7 +25,7 @@ export default class TTFFont { } constructor(stream, variationCoords = null) { - this.defaultLanguage = 'en'; + this.defaultLanguage = null; this.stream = stream; this.variationCoords = variationCoords; @@ -45,6 +45,10 @@ export default class TTFFont { } } + setDefaultLanguage(lang = null) { + this.defaultLanguage = lang; + } + _getTable(table) { if (!(table.tag in this._tables)) { try { @@ -84,39 +88,36 @@ export default class TTFFont { return result; } - /** - * The unique PostScript name for this font - * @type {string} - */ - get postscriptName() { - let name = this.getName('postscriptName'); - if (name) { - return name; - } - - let record = this.name.records.postscriptName; - if (record) { - let lang = Object.keys(record)[0]; - return record[lang]; - } - - return null; - } - /** * Gets a string from the font's `name` table * `lang` is a BCP-47 language code. * @return {string} */ - getName(key, lang = this.defaultLanguage) { - let record = this.name.records[key]; + getName(key, lang = this.defaultLanguage || fontkit.defaultLanguage) { + let record = this.name && this.name.records[key]; if (record) { - return record[lang]; + // Attempt to retrieve the entry, depending on which translation is available: + return ( + record[lang] + || record[this.defaultLanguage] + || record[fontkit.defaultLanguage] + || record['en'] + || record[Object.keys(record)[0]] // Seriously, ANY language would be fine + || null + ); } return null; } + /** + * The unique PostScript name for this font, e.g. "Helvetica-Bold" + * @type {string} + */ + get postscriptName() { + return this.getName('postscriptName'); + } + /** * The font's full name, e.g. "Helvetica Bold" * @type {string} diff --git a/src/base.js b/src/base.js index e224180d..ec3a584e 100644 --- a/src/base.js +++ b/src/base.js @@ -52,3 +52,8 @@ fontkit.create = function(buffer, postscriptName) { throw new Error('Unknown font format'); }; + +fontkit.defaultLanguage = 'en'; +fontkit.setDefaultLanguage = function(lang = 'en') { + fontkit.defaultLanguage = lang; +}; \ No newline at end of file diff --git a/test/i18n.js b/test/i18n.js new file mode 100644 index 00000000..038b7ab6 --- /dev/null +++ b/test/i18n.js @@ -0,0 +1,110 @@ +import assert from 'assert'; + +import fontkit from '../src'; + +describe('i18n', function() { + describe('fontkit.setDefaultLanguage', function () { + let font; + before('load Amiri font', function() { + font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf'); + }); + after('reset default language', function () { + fontkit.setDefaultLanguage(); + }); + + + it('font has "en" metadata properties', function() { + assert.equal(font.fullName, 'Amiri'); + assert.equal(font.postscriptName, 'Amiri-Regular'); + assert.equal(font.familyName, 'Amiri'); + assert.equal(font.subfamilyName, 'Regular'); + assert.equal(font.copyright, 'Copyright (c) 2010-2017, Khaled Hosny .\nPortions copyright (c) 2010, Sebastian Kosch .'); + assert.equal(font.version, 'Version 000.110 '); + }); + + it('can set global default language to "ar"', function () { + fontkit.setDefaultLanguage('ar'); + assert.equal(fontkit.defaultLanguage, 'ar'); + }); + + it('font now has "ar" metadata properties', function() { + assert.equal(font.fullName, 'Amiri'); + assert.equal(font.postscriptName, 'Amiri-Regular'); + assert.equal(font.familyName, 'Amiri'); + assert.equal(font.subfamilyName, 'عادي'); + assert.equal(font.copyright, 'حقوق النشر 2010-2017، خالد حسني .'); + assert.equal(font.version, 'إصدارة 000٫110'); + }); + + it('can reset default language back to "en"', function () { + fontkit.setDefaultLanguage(); + assert.equal(fontkit.defaultLanguage, "en"); + }); + }); + + describe('font.setDefaultLanguage', function () { + let font; + before('load Amiri font', function () { + font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf'); + }); + + it('font has "en" metadata properties', function() { + assert.equal(font.fullName, 'Amiri'); + assert.equal(font.postscriptName, 'Amiri-Regular'); + assert.equal(font.familyName, 'Amiri'); + assert.equal(font.subfamilyName, 'Regular'); + assert.equal(font.copyright, 'Copyright (c) 2010-2017, Khaled Hosny .\nPortions copyright (c) 2010, Sebastian Kosch .'); + assert.equal(font.version, 'Version 000.110 '); + }); + + it('can set font\'s default language to "ar"', function () { + font.setDefaultLanguage('ar'); + assert.equal(font.defaultLanguage, 'ar'); + }); + + it('font now has "ar" metadata properties', function() { + assert.equal(font.fullName, 'Amiri'); + assert.equal(font.postscriptName, 'Amiri-Regular'); + assert.equal(font.familyName, 'Amiri'); + assert.equal(font.subfamilyName, 'عادي'); + assert.equal(font.copyright, 'حقوق النشر 2010-2017، خالد حسني .'); + assert.equal(font.version, 'إصدارة 000٫110'); + }); + + it('the font\'s language should not change when the global changes', function () { + fontkit.setDefaultLanguage('en'); + + assert.equal(font.defaultLanguage, 'ar'); + assert.equal(font.subfamilyName, 'عادي'); + }); + + it('can reset default language back to "en"', function () { + font.setDefaultLanguage(); + assert.equal(font.defaultLanguage, null); + assert.equal(font.subfamilyName, 'Regular'); + }); + }); + + describe('backup languages', function () { + let font; + before('load Amiri font', function () { + font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf'); + }); + after('reset default language', function () { + fontkit.setDefaultLanguage(); + }); + + it('if the font\'s default language isn\'t found, use the global language', function () { + font.setDefaultLanguage('piglatin'); + fontkit.setDefaultLanguage('ar'); + + assert.equal(font.subfamilyName, 'عادي'); + }); + it('if the global language isn\'t found, use "en"', function () { + font.setDefaultLanguage('piglatin'); + fontkit.setDefaultLanguage('klingon'); + + assert.equal(font.subfamilyName, 'Regular'); + }); + }); +});