it-swarm-eu.dev

Lokalizovat řetězce v jazyce Javascript

V současné době používám soubory .resx ke správě zdrojů na straně serveru .NET.

aplikace, kterou jsem se zabývá také umožňuje vývojářům plugin JavaScript do různých událostí obsluhy pro ověření klienta straně, atd .. Jaký je nejlepší způsob, jak pro mě lokalizovat své JavaScript zprávy a řetězce? 

V ideálním případě bych chtěl uložit řetězce v souborech .resx, aby byly zachovány s ostatními lokalizovanými zdroji.

Jsem otevřená návrhům.

38
SaaS Developer

Základní objekt JavaScriptu je asociativní pole, takže jej lze snadno použít k ukládání párů klíčů/hodnot. Pomocí JSON , můžete vytvořit objekt pro každý řetězec, který bude takto lokalizován:

var localizedStrings={
    confirmMessage:{
        'en/US':'Are you sure?',
        'fr/FR':'Est-ce que vous êtes certain?',
        ...
    },

    ...
}

Potom můžete získat verzi národního prostředí každého řetězce takto:

var locale='en/US';
var confirm=localizedStrings['confirmMessage'][locale];
25
Joel Anair

Inspirováno SproutCore Můžete nastavit vlastnosti Řetězců:

'Hello'.fr = 'Bonjour';
'Hello'.es = 'Hola';

a poté jednoduše vyplňte správnou lokalizaci na základě svého národního prostředí:

var locale = 'en';
alert( message[locale] );
13
Ryan

Poté, co Googling hodně a nespokojen s většinou prezentovaných řešení, jsem právě našel úžasné/generické řešení, které používá T4 šablony . Kompletní příspěvek Jochen van Wylick můžete přečíst zde:

Použití T4 pro lokalizaci prostředků JavaScriptu založených na souborech .resx

Hlavní výhody jsou:

  1. Pouze 1 místo, kde jsou spravovány prostředky (konkrétně soubory .resx )
  2. Podpora více kultur
  3. Využití funkce IntelliSense - umožňuje dokončení kódu

Nevýhody:

Nedostatky tohoto řešení jsou samozřejmě v tom, že velikost souboru .Js by mohla být poměrně velká. Vzhledem k tomu, že je uložen v prohlížeči , Nepovažujeme to za problém pro naši aplikaci. - toto ukládání do mezipaměti může také způsobit, že prohlížeč nenajde zdroj volaný z kódu.


Jak to funguje?

V podstatě definoval šablonu T4, která ukazuje na vaše soubory .resx. S nějakým kódem C # přechází každým řetězcem zdrojů a přidává jej do vlastností čistého klíče JavaScriptu, které pak vystupují v jediném souboru JavaScriptu nazvaném Resources.js (názvy můžete v případě potřeby doplnit).


Šablona T4 [odpovídajícím způsobem změňte na umístění souborů ve formátu .resx]

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ Assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".js"#>
<#
 var path = Path.GetDirectoryName(Host.TemplateFile) + "/../App_GlobalResources/";
 var resourceNames = new string[1]
 {
  "Common"
 };

#>
/**
* Resources
* ---------
* This file is auto-generated by a tool
* 2012 Jochen van Wylick
**/
var Resources = {
 <# foreach (var name in resourceNames) { #>
 <#=name #>: {},
 <# } #>
};
<# foreach (var name in resourceNames) {
 var nlFile = Host.ResolvePath(path + name + ".nl.resx" );
 var enFile = Host.ResolvePath(path + name + ".resx" );
 ResXResourceSet nlResxSet = new ResXResourceSet(nlFile);
 ResXResourceSet enResxSet = new ResXResourceSet(enFile);
#>

<# foreach (DictionaryEntry item in nlResxSet) { #>
Resources.<#=name#>.<#=item.Key.ToString()#> = {
 'nl-NL': '<#= ("" + item.Value).Replace("\r\n", string.Empty).Replace("'","\\'")#>',
 'en-GB': '<#= ("" + enResxSet.GetString(item.Key.ToString())).Replace("\r\n", string.Empty).Replace("'","\\'")#>'
 };
<# } #>
<# } #>

Na stránce Form/View

Chcete-li, aby byl správný překlad vyzvednut, přidejte jej do svého předlohy, pokud používáte WebForms:

<script type="text/javascript">

    var locale = '<%= System.Threading.Thread.CurrentThread.CurrentCulture.Name %>';

</script>

<script type="text/javascript" src="/Scripts/Resources.js"></script>

Pokud používáte technologii ASP.NET MVC (jako já), můžete to provést takto:

<script type="text/javascript">

    // Setting Locale that will be used by JavaScript translations
    var locale = $("meta[name='accept-language']").attr("content");

</script>

<script type="text/javascript" src="/Scripts/Resources.js"></script>

MetaAcceptLanguage pomocník, kterého jsem dostal z tohoto úžasného příspěvku od Scott Hanselman:

Globalizace, internacionalizace a lokalizace v ASP.NET MVC 3, JavaScript a jQuery - Část 1

public static IHtmlString MetaAcceptLanguage<T>(this HtmlHelper<T> html)
{
     var acceptLanguage =
         HttpUtility.HtmlAttributeEncode(
                     Thread.CurrentThread.CurrentUICulture.ToString());

      return new HtmlString(
      String.Format("<meta name=\"{0}\" content=\"{1}\">", "accept-language",
                    acceptLanguage));
 }

Použij to

var msg = Resources.Common.Greeting[locale];
alert(msg);
10

JSGettext má vynikající práci - dynamické načítání souborů GNU Gettext .po s použitím téměř jakéhokoli jazyka na backendu. Google pro "Dynamické Javascript lokalizace s Gettext a PHP" najít návod pro JSGettext s PHP (Já bych post odkaz, ale to hloupé stránky mi nedovolí, povzdech ...)

Edit: toto by mělo být odkazem

4
Jani Patokallio

Použil bych zápis objektu/pole:

var phrases={};
phrases['fatalError'] ='On no!';

Pak můžete jednoduše přepnout soubor JS nebo použít volání Ajax k předefinování seznamu frází.

Se satelitní sestavou (namísto souboru resx) můžete výčet všech řetězců na serveru, kde znáte jazyk, čímž se vytvoří objekt Javascript s pouze řetězci pro správný jazyk. 

Něco takového pro nás funguje (kód VB.NET):

Dim rm As New ResourceManager([resource name], [your Assembly])
Dim rs As ResourceSet = 
    rm.GetResourceSet(Thread.CurrentThread.CurrentCulture, True, True)
For Each kvp As DictionaryEntry In rs
    [Write out kvp.Key and kvp.Value]
Next

Bohužel jsme zatím nenašli způsob, jak to udělat pro soubory .resx.

4
Erik Hesselink

K dispozici je knihovna pro lokalizaci aplikací JavaScript: https://github.com/wikimedia/jquery.i18n

To může dělat nahrazení parametru, podporuje gender (chytrý on/ona zpracování), číslo (chytré zpracování množných čísel, včetně jazyků, které mají více než jeden množný tvar), a vlastní gramatická pravidla, která některé jazyky potřebují.

Řetězy jsou uloženy v souborech JSON.

Jediným požadavkem je jQuery.

3
Amir E. Aharoni

Při lokalizaci jazyka JavaScript pro mobilní aplikaci se systémem HTML5 jsem provedl následující kroky:

1.Vytvořil soubor zdrojových souborů pro každý jazyk, který je nazývá jako „en.js“ pro angličtinu. Každý obsahoval různé řetězce aplikace takto:


        var localString = {
        appName: "your app name",
        message1: "blah blah"
      };

2.Použijte Lazyload k načtení správného zdrojového souboru na základě jazyka národního prostředí aplikace: https://github.com/rgrove/lazyload

3.Zadejte kód jazyka přes dotazový řetězec (protože spouštěním html souboru z Android pomocí PhoneGap)

4.Pak jsem napsal následující kód pro dynamické načtení správného zdrojového souboru:


var lang = getQueryString("language");
localization(lang);
function localization(languageCode) {
    try {
        var defaultLang = "en";
        var resourcesFolder = "values/";
        if(!languageCode || languageCode.length == 0)
            languageCode = defaultLang;
        // var LOCALIZATION = null;
        LazyLoad.js(resourcesFolder + languageCode + ".js", function() {
            if( typeof LOCALIZATION == 'undefined') {
                LazyLoad.js(resourcesFolder + defaultLang + ".js", function() {
                    for(var propertyName in LOCALIZATION) {
                        $("#" + propertyName).html(LOCALIZATION[propertyName]);
                    }
                });
            } else {
                for(var propertyName in LOCALIZATION) {
                    $("#" + propertyName).html(LOCALIZATION[propertyName]);
                }
            }
        });
    } catch (e) {
        errorEvent(e);
    }
}
function getQueryString(name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));
}

5.Z html souboru odkazuji na řetězce takto:


    span id="appName"
2
Jaime Botero

Myslím, že to můžete zvážit. Anglicko-španělský příklad:

Psaní 2 skriptů typu Js:

en-GB.js
lang = {
    date_message: 'The start date is incorrect',
    ...
};
es-ES.js
lang = {
    date_message: 'Fecha de inicio incorrecta',
    ...
};

Strana serveru - kód za: 

Protected Overrides Sub InitializeCulture()
    Dim sLang As String 
    sLang = "es-ES" 

    Me.Culture = sLang
    Me.UICulture = sLang
    Page.ClientScript.RegisterClientScriptInclude(sLang & ".js", "../Scripts/" & sLang & ".js")

    MyBase.InitializeCulture()
End Sub

Kde sLang může být "en-GB", víte, v závislosti na aktuálním výběru uživatele ...

Hovory jazyka Javascript:

alert (lang.date_message);

A funguje to, velmi snadno, myslím.

1
Caveman

Rozšiřování na odpověď diodeus.myopenid.com: Nechte svůj kód napsat soubor obsahující pole JS se všemi požadovanými řetězci, pak načtěte příslušný soubor/skript před jiným kódem JS. 

0
Lasar