diff --git a/package-lock.json b/package-lock.json index b9a04e1..a57db24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13119,6 +13119,11 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true }, + "rtl-detect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.2.tgz", + "integrity": "sha512-5X1422hvphzg2a/bo4tIDbjFjbJUOaPZwqE6dnyyxqwFqfR+tBcvfqapJr0o0VygATVCGKiODEewhZtKF+90AA==" + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", diff --git a/package.json b/package.json index db485b1..04c9721 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "http-status-codes": "^1.3.0", "module-alias": "^2.1.0", "mwbot": "^1.0.10", + "rtl-detect": "^1.0.2", "ts-deferred": "^1.0.4", "validate.js": "^0.12.0", "vue": "^2.5.17", diff --git a/src/server/data-access/ContentLanguagesLanguageRepo.ts b/src/server/data-access/ContentLanguagesLanguageRepo.ts index be90764..3b72bc8 100644 --- a/src/server/data-access/ContentLanguagesLanguageRepo.ts +++ b/src/server/data-access/ContentLanguagesLanguageRepo.ts @@ -2,6 +2,7 @@ import LanguageRepository from '@/common/data-access/LanguageRepository'; import LanguageCollection from '@/datamodel/LanguageCollection'; import Language from '@/datamodel/Language'; import WikibaseContentLanguagesRepo, { WikibaseApiContentLanguages } from './WikibaseContentLanguagesRepo'; +import RtlDetectLib from 'rtl-detect'; export default class ContentLanguagesLanguageRepo implements LanguageRepository { private languagesRepo: WikibaseContentLanguagesRepo; @@ -17,7 +18,10 @@ export default class ContentLanguagesLanguageRepo implements LanguageRepository Object.entries( contentLanguages ).forEach( ( [ languageCode, language ] ) => { languages[ languageCode ] = { code: languageCode, - directionality: 'ltr', + // this does not do full justice to the directionality question + // * languages do not have directionality - scripts do + // * the configured wikibase instance may have more/different languages + directionality: RtlDetectLib.getLangDir( languageCode ), } as Language; } ); diff --git a/src/types/server/rtl-detect.d.ts b/src/types/server/rtl-detect.d.ts new file mode 100644 index 0000000..5beb0f8 --- /dev/null +++ b/src/types/server/rtl-detect.d.ts @@ -0,0 +1,5 @@ +declare module 'rtl-detect' { + export default class RtlDetectLib { + public static getLangDir( code: string ): string; + } +} diff --git a/tests/unit/server/data-access/ContentLanguagesLanguageRepo.spec.ts b/tests/unit/server/data-access/ContentLanguagesLanguageRepo.spec.ts index 77b32c8..0285e2f 100644 --- a/tests/unit/server/data-access/ContentLanguagesLanguageRepo.spec.ts +++ b/tests/unit/server/data-access/ContentLanguagesLanguageRepo.spec.ts @@ -3,6 +3,7 @@ import MwBotWikibaseContentLanguagesRepo from '@/server/data-access/MwBotWikibas import mwbot from 'mwbot'; import ContentLanguagesLanguageRepo from '@/server/data-access/ContentLanguagesLanguageRepo'; import { WikibaseApiContentLanguages } from '@/server/data-access/WikibaseContentLanguagesRepo'; +import RtlDetectLib from 'rtl-detect'; function newWikibaseContentLanguagesRepository( contentLanguagesRepo: any ) { return new ContentLanguagesLanguageRepo( @@ -23,11 +24,11 @@ describe( 'ContentLanguagesLanguageRepo', () => { getContentLanguages.mockResolvedValue( { en: { code: 'en', - name: 'Englisch', + name: 'English', }, - de: { - code: 'de', - name: 'Deutsch', + ar: { + code: 'ar', + name: 'Arabic', }, } as WikibaseApiContentLanguages ); const contentLanguagesRepo = { @@ -42,15 +43,42 @@ describe( 'ContentLanguagesLanguageRepo', () => { code: 'en', directionality: 'ltr', }, - de: { - code: 'de', - directionality: 'ltr', + ar: { + code: 'ar', + directionality: 'rtl', }, } as LanguageCollection ); done(); } ); } ); + it( 'loads language directionality from rtl-detect', ( done ) => { + const spyGetLangDir = jest.spyOn( RtlDetectLib, 'getLangDir' ); + + const getContentLanguages = jest.fn(); + getContentLanguages.mockResolvedValue( { + en: { + code: 'en', + name: 'English', + }, + ar: { + code: 'ar', + name: 'Arabic', + }, + } as WikibaseApiContentLanguages ); + const contentLanguagesRepo = { + getContentLanguages, + }; + const repo = newWikibaseContentLanguagesRepository( contentLanguagesRepo ); + + repo.getLanguages().then( ( languages: LanguageCollection ) => { + expect( spyGetLangDir ).toBeCalledTimes( 2 ); + expect( spyGetLangDir ).toBeCalledWith( 'en' ); + expect( spyGetLangDir ).toBeCalledWith( 'ar' ); + done(); + } ); + } ); + } ); } );