generaltranslation 1.1.23 → 1.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,6 @@ npm i generaltranslation
18
18
 
19
19
  ```
20
20
  import GT from 'generaltranslation'
21
- // or const GT = require('generaltranslation')
22
21
 
23
22
  const gt = new GT()
24
23
  ```
@@ -55,35 +54,27 @@ const codes = gt.getLanguageCodes(['French', 'Spanish'])
55
54
  console.log(codes) // ['fr', 'es']
56
55
  ```
57
56
 
58
- ## Which languages do AI models understand?
57
+ ## Get a user's language
59
58
 
60
- We continually benchmark AI models and add new models as they are released. That means these functions have to be <code>async</code>. This information is provided as a public service. It's completely free and requires no API key.
59
+ ### getUserLanguage()
61
60
 
62
- ### async getModelList()
63
-
64
- Get the latest list of models for which there is data. Returns an array of model names.
61
+ Returns a user's default browser language. Meant for use in a web browser.
65
62
 
66
63
  ```
67
- const models = await gt.getModelList();
68
- console.log(models) // ['gpt-4', ... ]
64
+ const userLanguage = getUserLanguage();
65
+ console.log(userLanguage) // 'en'
69
66
  ```
70
67
 
71
- ### async getModelLanguages(model)
72
-
73
- Get all languages known to be compatible with a given AI model. Returns an array of languages codes, or null if the model is unknown.
68
+ If invoked on an instance of the GT class, this function will return the default language of that instance, similar to accessing the `defaultLanguage` property.
74
69
 
75
70
  ```
76
- const languages = await gt.getModelLanguages('mixtral-8x7b')
77
- console.log(languages) // ['en', 'fr', 'de', 'es', 'it']
78
- ```
79
-
80
- ### async isSupportedLanguage(model, code)
71
+ import GT from 'generaltranslation'
81
72
 
82
- Returns true if a model is known to be compatible with a given language, represented by an ISO-639 language code. Returns false otherwise.
73
+ const gt = new GT({
74
+ defaultLanguage: 'en'
75
+ });
83
76
 
84
- ```
85
- const supported = await gt.isSupportedLanguage('gpt-4', 'fr')
86
- console.log(supported) // true
77
+ console.log(gt.getUserLanguage()) // same as gt.defaultLanguage
87
78
  ```
88
79
 
89
80
  ## Prompt Internationalization API
@@ -150,4 +141,35 @@ This also works:
150
141
 
151
142
  ```
152
143
  const translatedPrompt = await gt.translatePrompt({ text: 'Tell me a story' }, 'es');
153
- ```
144
+ ```
145
+
146
+ ## Which languages do AI models understand?
147
+
148
+ We continually benchmark AI models and add new models as they are released. That means these functions have to be <code>async</code>. This information is provided as a public service. It's completely free and requires no API key.
149
+
150
+ ### async getModelList()
151
+
152
+ Get the latest list of models for which there is data. Returns an array of model names.
153
+
154
+ ```
155
+ const models = await gt.getModelList();
156
+ console.log(models) // ['gpt-4', ... ]
157
+ ```
158
+
159
+ ### async getModelLanguages(model)
160
+
161
+ Get all languages known to be compatible with a given AI model. Returns an array of languages codes, or null if the model is unknown.
162
+
163
+ ```
164
+ const languages = await gt.getModelLanguages('mixtral-8x7b')
165
+ console.log(languages) // ['en', 'fr', 'de', 'es', 'it']
166
+ ```
167
+
168
+ ### async isSupportedLanguage(model, code)
169
+
170
+ Returns true if a model is known to be compatible with a given language, represented by an ISO-639 language code. Returns false otherwise.
171
+
172
+ ```
173
+ const supported = await gt.isSupportedLanguage('gpt-4', 'fr')
174
+ console.log(supported) // true
175
+ ```
@@ -0,0 +1,14 @@
1
+ // Returns a user's default browser language
2
+ // e.g. 'en-US', not necessarily 'en'
3
+ // generaltranslation handles this well, but other libraries may not
4
+ // (it's a skill issue I'm afraid)
5
+ export default function _getUserLanguage({defaultLanguage = ''} = {}) {
6
+ if (typeof window !== 'undefined' && window?.navigator) {
7
+ return navigator?.language || navigator?.userLanguage || defaultLanguage || '';
8
+ } else if (defaultLanguage) {
9
+ return defaultLanguage;
10
+ } else {
11
+ console.error("getUserLanguage error. It's likely you've called getUserLanguage() on the server. This is inadvisable and without a default language will return an empty string.")
12
+ return ''
13
+ }
14
+ }
@@ -1,4 +1,4 @@
1
- {
1
+ const CodeToLanguage = {
2
2
  "ab": "Abkhazian",
3
3
  "aa": "Afar",
4
4
  "af": "Afrikaans",
@@ -182,4 +182,5 @@
182
182
  "yo": "Yoruba",
183
183
  "za": "Zhuang",
184
184
  "zu": "Zulu"
185
- }
185
+ }
186
+ export default CodeToLanguage;
@@ -1,4 +1,4 @@
1
- {
1
+ const LanguageToCode = {
2
2
  "abkhazian": "ab",
3
3
  "afar": "aa",
4
4
  "afrikaans": "af",
@@ -224,4 +224,5 @@
224
224
  "zhuang": "za",
225
225
  "chuang": "za",
226
226
  "zulu": "zu"
227
- }
227
+ }
228
+ export default LanguageToCode;
@@ -1,4 +1,4 @@
1
- {
1
+ const CodeToLanguageTriletter = {
2
2
  "abk": "Abkhazian",
3
3
  "aar": "Afar",
4
4
  "afr": "Afrikaans",
@@ -184,3 +184,4 @@
184
184
  "zha": "Zhuang",
185
185
  "zul": "Zulu"
186
186
  }
187
+ export default CodeToLanguageTriletter;
@@ -1,4 +1,4 @@
1
- {
1
+ const LanguageToCodeTriletter = {
2
2
  "abkhazian": "abk",
3
3
  "afar": "aar",
4
4
  "afrikaans": "afr",
@@ -225,4 +225,5 @@
225
225
  "zhuang": "zha",
226
226
  "chuang": "zha",
227
227
  "zulu": "zul"
228
- }
228
+ }
229
+ export default LanguageToCodeTriletter;
package/codes/codes.js CHANGED
@@ -1,17 +1,27 @@
1
1
  // ----- IMPORTS ----- //
2
2
 
3
- const CodeToLanguage = require('./639-1/CodeToLanguage.json');
4
- const LanguageToCode = require('./639-1/LanguageToCode.json');
3
+ import CodeToLanguage from './639-1/CodeToLanguage.js'
4
+ import LanguageToCode from './639-1/LanguageToCode.js'
5
5
 
6
6
  // only for languages which have no two-letter code
7
- const CodeToLanguageTriletter = require('./639-3/CodeToLanguageTriletter.json');
8
- const LanguageToCodeTriletter = require('./639-3/LanguageToCodeTriletter.json');
7
+ import CodeToLanguageTriletter from './639-3/CodeToLanguageTriletter.js'
8
+ import LanguageToCodeTriletter from './639-3/LanguageToCodeTriletter.js'
9
9
 
10
10
  // ----- LANGUAGE CODES ----- //
11
11
 
12
12
  // Returns the name of a language from an ISO 639 code or an array of codes
13
- const _mapCodeToLanguage = code => CodeToLanguage[code] || CodeToLanguageTriletter[code] || '';
14
- const _getLanguageName = codes => {
13
+ const _mapCodeToLanguage = code => {
14
+ if (code.length === 2) {
15
+ return CodeToLanguage[code]
16
+ }
17
+ if (code.length === 3) {
18
+ CodeToLanguageTriletter[code]
19
+ }
20
+ else {
21
+ return CodeToLanguage[code.slice(0, 2)] || '';
22
+ }
23
+ }
24
+ export const _getLanguageName = codes => {
15
25
  return Array.isArray(codes) ? codes.map(_mapCodeToLanguage) : _mapCodeToLanguage(codes);
16
26
  }
17
27
 
@@ -21,10 +31,6 @@ const _mapLanguageToCode = language => {
21
31
  const lowerCaseLanguage = language.toLowerCase();
22
32
  return LanguageToCode[lowerCaseLanguage] || LanguageToCodeTriletter[lowerCaseLanguage] || '';
23
33
  }
24
- const _getLanguageCode = languages => {
34
+ export const _getLanguageCode = languages => {
25
35
  return Array.isArray(languages) ? languages.map(_mapLanguageToCode) : _mapLanguageToCode(languages);
26
- }
27
-
28
- module.exports = {
29
- _getLanguageName, _getLanguageCode
30
36
  }
package/index.js CHANGED
@@ -3,20 +3,21 @@
3
3
 
4
4
  // ----- IMPORTS ----- //
5
5
 
6
- const { _getLanguageName, _getLanguageCode } = require('./codes/codes.js');
7
- const { _getModelList, _getModelInfo, _getAllModelInfo, _getModelLanguages, _isLanguageSupported, _getModelsByDeveloper, _getModelsByLanguage, } = require('./models/models.js');
8
- const { _translatePrompt } = require('./prompts/translate.js');
6
+ import _getUserLanguage from "./client/getUserLanguage.js";
7
+ import { _getLanguageCode, _getLanguageName } from "./codes/codes.js"
8
+ import { _getModelInfo, _getModelList, _getModelLanguages, _isLanguageSupported, _getModelsByDeveloper, _getModelsByLanguage } from "./models/models.js"
9
+ import _translatePrompt from "./prompts/translate.js"
9
10
 
10
11
  // ----- CORE CLASS ----- //
11
12
 
12
- class GT {
13
+ export default class GT {
13
14
 
14
15
  constructor({
15
16
  apiKey = '',
16
17
  defaultLanguage = 'en',
17
18
  baseURL = 'https://translate.gtx.dev'
18
19
  } = {}) {
19
- this.apiKey = apiKey;
20
+ this.apiKey = apiKey || (typeof process !== 'undefined' ? process.env.GT_API_KEY : '');
20
21
  this.defaultLanguage = defaultLanguage;
21
22
  this.baseURL = baseURL;
22
23
  }
@@ -28,12 +29,18 @@ class GT {
28
29
  // Model information functions
29
30
  getModelList = _getModelList; // returns array of supported model names
30
31
  getModelInfo = _getModelInfo; // returns model object
31
- getAllModelInfo = _getAllModelInfo; // returns all info on all models
32
32
  getModelLanguages = _getModelLanguages; // e.g. 'mistral-7b' => ['en']
33
33
  isLanguageSupported = _isLanguageSupported; // e.g. ('mistral-7b', 'en') => true
34
34
  getModelsByLanguage = _getModelsByLanguage; // returns array of model names
35
35
  getModelsByDeveloper = _getModelsByDeveloper; // returns array of model names
36
36
 
37
+ // Get a user's browser language
38
+ getUserLanguage = () => {
39
+ return _getUserLanguage({
40
+ defaultLanguage: this.defaultLanguage
41
+ });
42
+ }
43
+
37
44
  // Prompt I18N
38
45
  translatePrompt = async (prompt, language) => {
39
46
  return await _translatePrompt({
@@ -43,15 +50,16 @@ class GT {
43
50
 
44
51
  }
45
52
 
46
- // ----- EXPORTS ----- //
47
-
48
- module.exports = GT;
49
- module.exports.getLanguageCode = _getLanguageCode;
50
- module.exports.getLanguageName = _getLanguageName;
51
- module.exports.getModelList = _getModelList;
52
- module.exports.getModelInfo = _getModelInfo;
53
- module.exports.getAllModelInfo = _getAllModelInfo;
54
- module.exports.getModelLanguages = _getModelLanguages;
55
- module.exports.isLanguageSupported = _isLanguageSupported;
56
- module.exports.getModelsByDeveloper = _getModelsByDeveloper;
57
- module.exports.getModelsByLanguage = _getModelsByLanguage;
53
+ // ----- SECONDARY EXPORTS ----- //
54
+
55
+ export {
56
+ _getLanguageCode as getLanguageCode,
57
+ _getLanguageName as getLanguageName,
58
+ _getModelList as getModelList,
59
+ _getModelInfo as getModelInfo,
60
+ _getModelLanguages as getModelLanguages,
61
+ _isLanguageSupported as isLanguageSupported,
62
+ _getModelsByDeveloper as getModelsByDeveloper,
63
+ _getModelsByLanguage as getModelsByLanguage,
64
+ _getUserLanguage as getUserLanguage
65
+ };
package/models/models.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // ----- MODEL INFORMATION ----- //
2
2
 
3
3
  // Get all info on all models
4
- const _getAllModelInfo = async () => {
4
+ export const _getAllModelInfo = async () => {
5
5
  try {
6
6
  const result = await fetch(`https://models.gtx.dev/all`);
7
7
  return await result.json();
@@ -13,7 +13,7 @@ const _getAllModelInfo = async () => {
13
13
 
14
14
  // Get all models by a given developer
15
15
  // Returns an empty array if none
16
- const _getModelsByDeveloper = async developer => {
16
+ export const _getModelsByDeveloper = async developer => {
17
17
  if (!developer) return null;
18
18
  developer = developer?.toLowerCase();
19
19
  try {
@@ -28,7 +28,7 @@ const _getModelsByDeveloper = async developer => {
28
28
 
29
29
  // Get all models certified for a given language
30
30
  // Returns an empty array if none
31
- const _getModelsByLanguage = async language => {
31
+ export const _getModelsByLanguage = async language => {
32
32
  if (!language) return null;
33
33
  language = language?.toLowerCase();
34
34
  try {
@@ -43,7 +43,7 @@ const _getModelsByLanguage = async language => {
43
43
 
44
44
  // Get all models
45
45
  // Returns an array of model names
46
- const _getModelList = async () => {
46
+ export const _getModelList = async () => {
47
47
  try {
48
48
  const result = await fetch(`https://models.gtx.dev/models`);
49
49
  const models = await result.json();
@@ -56,7 +56,7 @@ const _getModelList = async () => {
56
56
 
57
57
  // Get all info about a given model
58
58
  // Returns an object or null if invalid
59
- const _getModelInfo = async model => {
59
+ export const _getModelInfo = async model => {
60
60
  if (!model) return null;
61
61
  model = model?.toLowerCase();
62
62
  try {
@@ -69,27 +69,19 @@ const _getModelInfo = async model => {
69
69
  }
70
70
  }
71
71
 
72
+ // ----- FUNCTIONS FROM MODEL INFO ----- //
73
+
72
74
  // Get all languages known to be compatible with a given LLM
73
75
  // Returns an array of languages codes, or null if unknown
74
- const _getModelLanguages = async model => {
76
+ export const _getModelLanguages = async model => {
75
77
  const modelInfo = await _getModelInfo(model);
76
78
  return modelInfo?.languages;
77
79
  }
78
80
 
79
81
  // Returns true if a model is known to be compatible with a language
80
82
  // Returns false otherwise
81
- const _isLanguageSupported = async (model, code) => {
83
+ export const _isLanguageSupported = async (model, code) => {
82
84
  if (!code) return false;
83
85
  const modelLanguages = await _getModelLanguages(model);
84
86
  return modelLanguages?.includes(code) ? true : false;
85
- }
86
-
87
- module.exports = {
88
- _getModelList,
89
- _getModelInfo,
90
- _getModelLanguages,
91
- _isLanguageSupported,
92
- _getModelsByDeveloper,
93
- _getModelsByLanguage,
94
- _getAllModelInfo
95
87
  }
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "generaltranslation",
3
- "version": "1.1.23",
3
+ "version": "1.1.25",
4
4
  "description": "A language toolkit for AI developers",
5
5
  "main": "index.js",
6
+ "type": "module",
6
7
  "scripts": {
7
8
  "test": "echo \"Error: no test specified\" && exit 1"
8
9
  },
@@ -5,7 +5,7 @@ const _shouldTranslate = item => typeof item?.translate === 'boolean' ? item.tra
5
5
 
6
6
  // Pre-processes content to send to the API
7
7
  // Separates out text that shouldn't be translated.
8
- const _processContent = ({ content }) => {
8
+ const _processPrompt = ({ content }) => {
9
9
  const processed = [];
10
10
  const untranslated = [];
11
11
  if (Array.isArray(content)) {
@@ -40,7 +40,7 @@ const _processContent = ({ content }) => {
40
40
  }
41
41
 
42
42
  // Build content string from array or single item
43
- const _constructContent = ({ content, untranslated = null}) => {
43
+ const _constructPrompt = ({ content, untranslated = null}) => {
44
44
  if (Array.isArray(content)) {
45
45
  let final = '';
46
46
  for (const item of content) {
@@ -75,10 +75,10 @@ const _translatePrompt = async ({
75
75
 
76
76
  const defaultLanguage = context?.defaultLanguage;
77
77
  if (language === defaultLanguage) {
78
- return _constructContent({ content: content });
78
+ return _constructPrompt({ content: content });
79
79
  };
80
80
 
81
- const { processed, untranslated } = _processContent({ content });
81
+ const { processed, untranslated } = _processPrompt({ content });
82
82
 
83
83
  try {
84
84
  const response = await fetch(`${context?.baseURL}/prompt`, {
@@ -98,15 +98,13 @@ const _translatePrompt = async ({
98
98
  throw new Error(`${result || response.status}`);
99
99
  } else {
100
100
  const result = await response.json();
101
- return _constructContent({content: result, untranslated: untranslated });
101
+ return _constructPrompt({content: result, untranslated: untranslated });
102
102
  }
103
103
  } catch (error) {
104
104
  console.error(error)
105
- return _constructContent({ content: content })
105
+ return _constructPrompt({ content: content })
106
106
  }
107
107
 
108
108
  }
109
109
 
110
- module.exports = {
111
- _translatePrompt
112
- }
110
+ export default _translatePrompt;