1/*
2 * Copyright 2019-2024, Andrew Lindesay <apl@lindesay.co.nz>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef LANGUAGE_MODEL_H
6#define LANGUAGE_MODEL_H
7
8#include <vector>
9
10#include <Referenceable.h>
11
12#include "Language.h"
13
14
15typedef BReference<Language> LanguageRef;
16
17
18class LanguageModel {
19public:
20								LanguageModel();
21								LanguageModel(BString forcedSystemDefaultLanguage);
22	virtual						~LanguageModel();
23
24			void				ClearSupportedLanguages();
25	const	int32				CountSupportedLanguages() const;
26	const	LanguageRef			SupportedLanguageAt(int32 index) const;
27			void				AddSupportedLanguage(const LanguageRef& value);
28			void				SetPreferredLanguageToSystemDefault();
29
30	const	LanguageRef			PreferredLanguage() const
31									{ return fPreferredLanguage; }
32
33private:
34			int32				_IndexOfSupportedLanguage(
35									const char* code,
36									const char* countryCode,
37									const char* scriptCode) const;
38			int32				_IndexOfBestMatchingSupportedLanguage(
39									const char* code,
40									const char* countryCode,
41									const char* scriptCode) const;
42
43			Language			_DeriveSystemDefaultLanguage() const;
44			Language			_DeriveDefaultLanguage() const;
45			Language*			_FindBestSupportedLanguage(
46									const char* code,
47            						const char* countryCode,
48            						const char* scriptCode) const;
49			void				_SetPreferredLanguage(const Language& language);
50
51	static	int					_NullSafeStrCmp(const char* s1, const char* s2);
52
53	static	int					_LanguagesCompareFn(const LanguageRef& l1, const LanguageRef& l2);
54	static	bool				_IsLanguageBefore(const LanguageRef& l1, const LanguageRef& l2);
55
56private:
57			std::vector<LanguageRef>
58								fSupportedLanguages;
59			LanguageRef			fPreferredLanguage;
60			BString				fForcedSystemDefaultLanguage;
61};
62
63
64#endif // LANGUAGE_MODEL_H