Skip to content

Instantly share code, notes, and snippets.

@Nobepico
Forked from tmedwards/sc-i18n-example.twee
Last active November 28, 2023 14:03
Show Gist options
  • Save Nobepico/a24f0327d503eeb964017a8199719d56 to your computer and use it in GitHub Desktop.
Save Nobepico/a24f0327d503eeb964017a8199719d56 to your computer and use it in GitHub Desktop.
QOL Improvements for tmedward's internationalization (i18n) js code (Works with saves)
:: StoryTitle
i18n
:: StoryData
{
"ifid": "d9bea9e0-9c7e-4a8d-8137-c02e0f5811eb",
"format": "SugarCube",
"format-version": "2.36.1",
"start": "Start",
"zoom": 1
}
:: Next {"position":"900,600","size":"100,100"}
/* This should be empty. */
:: Next _en {"position":"1100,600","size":"100,100"}
Next
<<link "Save">>
<<script>>
Save.slots.save(0);
<</script>>
<</link>>
:: Next _es {"position":"1100,800","size":"100,100"}
Próximo
<<link "Ahorrar">>
<<script>>
Save.slots.save(0);
<</script>>
<</link>>
:: Next _pt {"position":"1100,400","size":"100,100"}
Próximo
<<link "Salvar">>
<<script>>
Save.slots.save(0);
<</script>>
<</link>>
:: Start {"position":"500,600","size":"100,100"}
/*
Creating a passage without suffix ("_pt", "_en", etc.) will automatically assign the language suffix currently selected in the settings menu and send the user to the passage named correspondently.
Example:
In the settings, "English is selected"
The passage "Start" has no passage, so it will be forward to the passage "Start_en".
The passages will work normally if they already have the currently selected lang suffix, as is demonstrated in the Portuguese suffix (You can freely move from "Start_pt" to "Next_pt" without having the intermediary that the English suffix has.
I have forked this code to make sure that when you are in a passage that already has a prefix but is not the currently selected one, for example if you are in "Next_pt" and change the language in the settings, you will be forwarded to the passage with the correct suffix.
Example:
You are in the passage "Next_pt"
You change the language in the settings to "English"
You will be forwarded to "Next_en"
NOTE:
Unsuffixed passages MUST be empty. They are not shown to the player, though are still rendered, thus code within it being able to change and/or break the game.
When adding suffixes to the name of the passages, they have to be structured the same way the template ones are.
Name of the passage, a space, an underscore and the language suffix.
Examples:
- Start _pt
- Example _en
- Banana _de
- Croissant _fr
The default title for saves will be the current passage's name excluding the suffix.
You can change the title of the save as you usually would do, using the Save API.
Examples:
Passage name: Banana
Save.slots.save(0, "Ai Caramba");
>Save title: Ai caramba
Passage name: Banana _pt
Save.slots.save(2);
>Save title: Banana
Passage name: Banana _pt
Save.slots.save(2, "Carambolas");
>Save title: Carambolas
*/
:: Start _en {"position":"700,600","size":"100,100"}
English.
[[Next]]
<<set $saveDesc_en = "Start_en">>
<<link "Save">>
<<script>>
Save.slots.save(0);
<</script>>
<</link>>
:: Start _es {"position":"700,800","size":"100,100"}
Español.
[[Próximo|Next _es]]
<<set $saveDesc_pt = "Start_es">>
<<link "Ahorrar">>
<<script>>
Save.slots.save(0, "Ai Caramba");
<</script>>
<</link>>
:: Start _pt {"position":"700,400","size":"100,100"}
Português.
[[Próximo|Next _pt]]
<<set $saveDesc_pt = "Start_pt">>
<<link "Salvar">>
<<script>>
Save.slots.save(0, "Ai Caramba");
<</script>>
<</link>>
:: StoryScript [script]
setup.i18n = {
langs : {
// You need to add the label and code to be used in the switch case.
'English' : 'en',
'Português' : 'pt',
'Español' : 'es'
},
codes : function () {
return Object.keys(this.langs).map(function (label) {
return this.langs[label];
}, this);
},
labels : function () {
return Object.keys(this.langs);
},
labelFromCode : function (code) {
var label = Object.keys(this.langs).find(function (label) {
return this.langs[label] === code;
}, this);
if (!label) {
throw new Error('unknown language code "' + code + '"');
}
return label;
}
};
;(function () {
function initLanguage() {
/*
Set the `l10nStrings` properties to the appropriate
values for each supported language.
You can find the properties for some languages in the
sugarcube website: https://www.motoslave.net/sugarcube/2/
English doesn't need a case unless you
want to alter the default values.
*/
switch (setup.i18n.langs[settings.lang]) {
case 'pt':
l10nStrings.identity=
"jogo",
l10nStrings.aborting=
"Abortar",
l10nStrings.cancel=
"Cancelar",
l10nStrings.close=
"Fechar",
l10nStrings.ok=
"OK",
l10nStrings.errorTitle=
"Erro",
l10nStrings.errorToggle=
"Alternar a visualização de erro",
l10nStrings.errorNonexistentPassage='a passagem "{passage}" não existe',
l10nStrings.errorSaveMissingData=
"o ficheiro não contem a informação necessária. Ou o ficheiro carregado não é correcto ou foi corrumpido",
l10nStrings.errorSaveIdMismatch=
"o ficheiro não pertence ao {identity}",
l10nStrings._warningIntroLacking=
"O seu browser não tem esta opção ou a opção foi desabilitada",
l10nStrings._warningOutroDegraded=
", portanto este {identity} não está a correr a 100%. Pode continuar, mas algumas partes não irão funcionar.",
l10nStrings.warningNoWebStorage=
"{_warningIntroLacking} o Web Storage API{_warningOutroDegraded}",
l10nStrings.warningDegraded=
"{_warningIntroLacking} algum componente requerido por este {identity}{_warningOutroDegraded}",
l10nStrings.debugBarToggle=
"Alternar a barra de depuração",
l10nStrings.debugBarNoWatches=
"— sem vigias —",
l10nStrings.debugBarAddWatch=
"Adicionar vigia",
l10nStrings.debugBarDeleteWatch=
"Apagar vigia",
l10nStrings.debugBarWatchAll=
"Vigiar tudo",
l10nStrings.debugBarWatchNone=
"Apagar tudo",
l10nStrings.debugBarLabelAdd=
"Adicionar",
l10nStrings.debugBarLabelWatch=
"Vigiar",
l10nStrings.debugBarLabelTurn=
"Virar",
l10nStrings.debugBarLabelViews=
"Visualizações",
l10nStrings.debugBarViewsToggle=
"Alternar visualizações de depuração",
l10nStrings.debugBarWatchToggle=
"Alternar o painel de vigia",
l10nStrings.uiBarToggle=
"Alternar a barra de interface",
l10nStrings.uiBarBackward=
"Voltar um passo atrás na história do {identity}",
l10nStrings.uiBarForward=
"Ir um passo a frente na história do {identity}",
l10nStrings.uiBarJumpto=
"Saltar para um ponto especifico na história do {identity}",
l10nStrings.jumptoTitle=
"Saltar para",
l10nStrings.jumptoTurn=
"Vez",
l10nStrings.jumptoUnavailable=
"Não existem pontos de salto disponíveis…",
l10nStrings.savesTitle=
"Jogos Guardados",
l10nStrings.savesDisallowed=
"Não se pode guardar o jogo nesta passagem. A opção foi desabilitada.",
l10nStrings.savesIncapable=
"{_warningIntroLacking} assim sendo como não é possivel guardar, a opção está desabilitada nesta sessão.",
l10nStrings.savesLabelAuto=
"Guardado Automaticamente",
l10nStrings.savesLabelDelete=
"Apagar",
l10nStrings.savesLabelExport=
"Salvar para o Disco…",
l10nStrings.savesLabelImport=
"Carregar do Disco…",
l10nStrings.savesLabelLoad=
"Carregar",
l10nStrings.savesLabelClear=
"Apagar Tudo",
l10nStrings.savesLabelSave=
"Salvar",
l10nStrings.savesLabelSlot=
"Espaço Vazio",
l10nStrings.savesUnavailable=
"Não existem Jogos Guardados…",
l10nStrings.savesUnknownDate=
"data desconhecida",
l10nStrings.settingsTitle=
"Opções",
l10nStrings.settingsOff=
"Desabilitar",
l10nStrings.settingsOn=
"Habilitar",
l10nStrings.settingsReset=
"Reset para configurações iniciais",
l10nStrings.restartTitle=
"Recomeçar",
l10nStrings.restartPrompt=
"Tem a certeza que quer recomeçar? Qualquer progresso que não tenha sido guardado será perdido.",
l10nStrings.shareTitle=
"Partilhar",
l10nStrings.autoloadTitle=
"Guardado Automaticamente",
l10nStrings.autoloadCancel=
"Voltar ao ínicio",
l10nStrings.autoloadOk=
"Carregar jogo guardado automaticamente",
l10nStrings.autoloadPrompt=
"Um jogo guardado automaticamente está disponivel. Carregar agora ou voltar ao ínicio?",
l10nStrings.macroBackText=
"Para trás",
l10nStrings.macroReturnText=
"Voltar"
break;
case 'es':
l10nStrings.identity = 'juego';
l10nStrings.aborting = 'Abortar';
l10nStrings.cancel = 'Cancelar';
l10nStrings.close = 'Cerrar';
l10nStrings.ok = 'OK';
l10nStrings.errorTitle = 'Error';
l10nStrings.errorToggle = 'Cambiar la vista de error';
l10nStrings.errorNonexistentPassage = 'el pasaje "{passage}" no existe';
l10nStrings.errorSaveMissingData = 'La partida requiere datos no encontrados. O el archivo cargado no es una partida guardada o la partida guardada está corrupta';
l10nStrings.errorSaveIdMismatch = 'Partida errónea {identity}';
l10nStrings._warningIntroLacking = 'Tu navegador carece o ha desactivado';
l10nStrings._warningOutroDegraded = ', este {identity} está funcionando en un modo degradado. Puedes continuar, sin embargo, algunas partes pueden no funcionar correctamente';
l10nStrings.warningNoWebStorage = '{_warningIntroLacking} el Almacenamiento Web API{_warningOutroDegraded}';
l10nStrings.warningDegraded = '{_warningIntroLacking} algunas de las capacidades requeridas por este {identity}{_warningOutroDegraded}';
l10nStrings.debugBarToggle = 'Alternar la barra de depuración';
l10nStrings.debugBarNoWatches = '\u2014 no hay observadores estabecidos \u2014';
l10nStrings.debugBarAddWatch = 'Añadir observador';
l10nStrings.debugBarDeleteWatch = 'Borrar observador';
l10nStrings.debugBarWatchAll = 'Ver todo';
l10nStrings.debugBarWatchNone = 'Borrar todo';
l10nStrings.debugBarLabelAdd = 'Añadir';
l10nStrings.debugBarLabelWatch = 'Ver';
l10nStrings.debugBarLabelTurn = 'Girar';
l10nStrings.debugBarLabelViews = 'Vistas';
l10nStrings.debugBarViewsToggle = 'Alternar las vistas debug';
l10nStrings.debugBarWatchToggle = 'Alternar el panel de observadores';
l10nStrings.uiBarToggle = 'Alternar la barra de UI';
l10nStrings.uiBarBackward = 'Volver atrás en la historia del {identity}';
l10nStrings.uiBarForward = 'Avanzar en la historia del {identity}';
l10nStrings.uiBarJumpto = 'Saltar a un punto específico de la {identity} historia';
l10nStrings.jumptoTitle = 'Saltar A';
l10nStrings.jumptoTurn = 'Girar';
l10nStrings.jumptoUnavailable = 'No hay puntos de salto disponibles actualmente\u2026';
l10nStrings.savesTitle = 'Guardar';
l10nStrings.savesDisallowed = 'Guardar se ha deshabilitado en este pasaje.';
l10nStrings.savesEmptySlot = '\u2014 Guardado vacío \u2014';
l10nStrings.savesIncapable = '{_warningIntroLacking} las capacidades requeridas para proporcionar guardados, entonces los guardados han sido deshabilitados para esta sesión.';
l10nStrings.savesLabelAuto = 'Autoguardado';
l10nStrings.savesLabelDelete = 'Borrar';
l10nStrings.savesLabelExport = 'Guardar en Disco\u2026';
l10nStrings.savesLabelImport = 'Cargar desde Disco\u2026';
l10nStrings.savesLabelLoad = 'Cargar';
l10nStrings.savesLabelClear = 'Borrar todo';
l10nStrings.savesLabelSave = 'Guardar';
l10nStrings.savesLabelSlot = 'Espacio';
l10nStrings.savesSavedOn = 'Guardado';
l10nStrings.savesUnavailable = 'No se encontraron espacios de guardado\u2026';
l10nStrings.savesUnknownDate = 'desconocido';
l10nStrings.settingsTitle = 'Ajustes';
l10nStrings.settingsOff = 'Off';
l10nStrings.settingsOn = 'On';
l10nStrings.settingsReset = 'Usar predeterminados';
l10nStrings.restartTitle = 'Reiniciar';
l10nStrings.restartPrompt = '¿Estás seguro de que quieres reiniciar? Todo progreso no guardado caerá en el olvido.';
l10nStrings.shareTitle = 'Compartir';
l10nStrings.alertTitle = 'Alerta';
l10nStrings.autoloadTitle = 'Autocargar';
l10nStrings.autoloadCancel = 'Ir al Comienzo';
l10nStrings.autoloadOk = 'Cargar autoguardado';
l10nStrings.autoloadPrompt = 'Un autoguardado existe ¿Cargarlo ahora o ir al comienzo?';
l10nStrings.macroBackText = 'Atrás';
l10nStrings.macroReturnText = 'Volver';
break;
}
$('html').attr('lang', setup.i18n.langs[settings.lang]);
}
function changeLanguage() {
window.location.reload();
}
Setting.addList('lang', {
label : "Language",
list : setup.i18n.labels(),
default : setup.i18n.labelFromCode('en'),
onInit : initLanguage,
onChange : changeLanguage
});
$(document).on(':passagerender', function (ev) {
let passageTit = State.passage;
let suffix = ' _' + setup.i18n.langs[settings.lang];
let eq = 0;
for (let i = setup.i18n.codes().length - 1; i >= 0; i--) {
if (passageTit.substr(-4) == ' _' + setup.i18n.codes()[i]) {
eq++;
}
if (' _' + setup.i18n.codes()[i] == setup.i18n.langs[settings.lang]) {
eq++;
}
}
if (eq == 1) {
var passageSuf = passageTit.substring(0, passageTit.length - 4) + suffix;
$(ev.content).empty().wiki(Story.get(passageSuf).processText());
} else {
var passageSuf = passageTit + suffix;
$(ev.content).empty().wiki(Story.get(passageSuf).processText());
}
});
})();
Config.passages.descriptions = true;
Save.onSave.add(function (save) {
let regx = /\s_\w{2}$/g;
if (!regx.exec(save.title) == false) {
save.title = save.title.substring(0, save.title.length - 4);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment