ASP.NET多言語Webサイト?
-
06-07-2019 - |
質問
どうすればウェブサイトを多言語(例:英語、フランス語、スペイン語)に対応できるように変換できますか?
リソースファイルが気に入らないのは、制限があり、リストを作成するのにかなり時間がかかるからです。提案はありますか?
更新
現時点では、XMLファイルを使用し、Xpathを使用して値を取得するのが最良の方法です。
解決
暗黙的なローカライズ(Visual Studio-[ツール]メニュー-[ローカルリソースの生成])は、可能な限り簡単です。デフォルトの言語でページを記述し、メニューオプションを選択すると、リソースファイルが作成され、翻訳のために送信できます。
resxファイルは単なるxmlであるため、翻訳会社が希望する場合は、スプレッドシートに簡単に変換できます。
バッキングストアとしてresxの代わりにデータベースを使用することは難しくありません。 Rick Strahlには、データベース駆動型のローカリゼーションプロバイダーの優れた説明とコード例がありますこちら-Google翻訳とBabelfishへのインターフェースを備えたすてきな組み込みローカリゼーションエディタもあります。
他のヒント
多言語サイトのリソースをデータベースに保存します。これらを簡単に作成してアクセスできるようにするためのツールをいくつか作成しました。この構文を使用できるカスタムExpressionBuilderがあります。
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
デフォルトのテキストを含むカスタムラベル。行がまだない場合はデータベースに行を追加します。
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
文字列を含むテーブルには、言語ごとに1つの列があります。これにより、英語(またはデフォルトの言語)でサイトを簡単に作成し、翻訳者にテーブル(それ自体を入力する)を渡すことができます。また、翻訳対象の言語が必要な言語を確認するのも非常に簡単です。リソースを使用すると、新しい文字列を追加する必要があるたびに、作業を停止し、各言語のリソースファイルに移動してリソースを追加する必要があります。
言語ラベルのコードは次のとおりです。
''' <summary>
''' Retrieves a language-specific string.
''' </summary>
Public Class LanguageLabel
Inherits Label
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private Sub Populate()
If Len(Me.Name) > 0 Then
Dim LanguageString As String = GetLanguageString(Me.Name, Me.Text)
If Len(LanguageString) > 0 Then Me.Text = LanguageString
End If
End Sub
Private Sub LanguageLabel_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
Populate()
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
' By default a label wraps the text in a <span>, which we don't want in some situations
writer.Write(Me.Text)
End Sub
End Class
およびユーティリティ関数:
Public Function GetLanguageString(ByVal Name As String, Optional ByVal DefaultText As String = "") As String
Dim DefaultLanguage As Language = Languages.GetById(1)
Name = StripPunctuation(Name).Trim.Replace(" ", "") ' Remove punctuation, spaces from name
Dim SelectSql As String = String.Format("Select {0},{1} from LanguageStrings where Name=@Name", Languages.CurrentLanguage.Code, DefaultLanguage.Code)
Dim LanguageStringTable As DataTable = ExecuteDataset(cs, CommandType.Text, SelectSql, New SqlParameter("@Name", Name)).Tables(0)
If LanguageStringTable IsNot Nothing AndAlso LanguageStringTable.Rows.Count > 0 Then
Dim LanguageText As String = LanguageStringTable.Rows(0)(Languages.CurrentLanguage.Code).ToString
Dim DefaultLanguageText As String = LanguageStringTable.Rows(0)(DefaultLanguage.Code).ToString
If Len(LanguageText) > 0 Then
' We have a string in this language
Return LanguageText
Else
' Nothing in this language - return default language value
Return DefaultLanguageText
End If
Else
' No record with this name - create a dummy one
If DefaultText = "" Then DefaultText = Name
Dim InsertSql As String = String.Format("Insert into LanguageStrings (Name, {0}) values (@Name, @Text)", DefaultLanguage.Code)
ExecuteNonQuery(cs, CommandType.Text, InsertSql, New SqlParameter("@Name", Name), New SqlParameter("@Text", DefaultText))
Return Name
End If
End Function
リソースファイルを使用する方法です。製品は12言語で出荷されます。すべての文字列をリソースファイルに取り出し、翻訳会社に発送します。それは時々苦痛ですが、それはそれを行うための事実上の方法です。
4文字の英語の単語が17文字のフレーズに翻訳され、UIを微調整する必要がある場合も楽しいです。
設計プロセスのどのくらい遅れていますか?遅すぎず、予算が許せば、 Ektron CMS300.net のような多言語CMSへの移植を検討してください。 (これには組み込みの翻訳ツールがあります)。そうでない場合は、前に大きなタスクがあります。
私が使用している別の解決策は、特定の言語で必要なすべてのテキストを含むaspxページを含む言語フォルダを作成することです。
ここでの唯一の問題は、複製するページにできるだけ少ないコードをどのように挿入できるかです。ここではコントローラーパターンを使用してこれを行い、次にオブジェクトデータソースを使用してデータを取得し、すべてのページのコントロールにバインドしています。
このようにして、リソースファイルを削除するという目標を達成し、必要な場合を除き、コードを複製せずに1か所に保持できます。
編集:良いCMSフレームワークもお勧めします。
私が開発するWebアプリの1つにもこのNLS要件があります。
ローカライズされたテキストがある場所が少なくとも3つあることがわかりました:
- ユーザーインターフェイス
- データベーステーブル(&quot;カタログ&quot;またはそれらを呼び出すもの)
- バックエンドコード(サービスなど)
私のソリューションには、ページ、テーブルなど(&quot; Container&quot;)の1つのテーブル、そのコンテナー内の各アイテム(ラベル、IDによるボタン、レコード識別子など)の1つのテーブル、および翻訳されたアイテムの1つのテーブル(プラス言語識別子)。
翻訳アプリケーションは、翻訳を最新に保ち、すべての翻訳をXMLでエクスポートするのに役立ちます。
製品には翻訳が付属していますが、顧客は翻訳を調整でき、変更はすぐに反映されます。
リソースファイルを使用して行ったサンプルコード global.asaxを追加
void Application_BeginRequest(Object sender, EventArgs e)
{
// Code that runs on application startup
HttpCookie cookie = HttpContext.Current.Request.Cookies["CultureInfo"];
if (cookie != null && cookie.Value != null)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
}
else
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
}
}
http://satindersinght.blogspot.in/2012/ 06 / create-website-for-multilanguage.html
http://satindersinght.wordpress.com / 2012/06/14 / create-website-for-multilanguage-support /