[번역] ASP.NET MVC 3 개발의 20가지 노하우 (4) [20 Recipes for Programming MVC 3]: 다중 언어 지원 실현

19973 단어 programming
의제
인터넷에는 수백 개국에서 온 수백만 명의 사람들이 있고 수백 가지 다른 언어도 존재하며 심지어 영국, 미국, 캐나다와 영국 사이에도 여러 가지 다른 사투리가 존재한다.당신의 사이트가 한 가지 언어만 제공한다고 해서 방문이 제한되지 않도록 하세요.
솔루션
리소스 파일을 만들고 Key/Value 유형의 정적 텍스트를 추가하며 CurrentUICulture를 사용하여 현재 현실 언어를 변경할 수 있습니다. 
토론
리소스 파일은 웹 사이트에 여러 언어를 저장할 수 있는 XML 파일입니다.자원 파일을 만들 때 현재 기본 언어를 포함합니다.자원에 키/값 대 텍스트를 만들면 컨트롤러, 모델, 보기 곳곳에서 사용할 수 있습니다.예제 1-3 리소스 파일의 예입니다.
  
그림 1-3, 리소스 파일 예
 
응용 프로그램을 마우스 오른쪽 버튼으로 클릭하고 추가 -> 새 폴더를 선택하여 새 파일의 이름을 Resources 로 지정합니다.새 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가 -> 새 항목을 선택합니다.뒤쪽 검색에서 에셋을 입력하고 에셋 파일을 선택합니다.
위의 그림과 같이 리소스 파일에 Book 모델 클래스의 모든 속성에 대한 엔트리를 작성합니다.그런 다음 모델 클래스를 수정하여 DisplayAttribute를 사용하여 이러한 값을 참조해야 합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using MvcApplication4.Validations;

namespace MvcApplication4.Models
{

public class Book
{
public int ID { get; set; }

[Required]
[Display(Name = "TitleDisplay",
ResourceType = typeof(Resources.Resource1))]
public string Title { get; set; }

[Display(Name = "IsbnDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
[IsbnValidation]
public string Isbn { get; set; }

[Display(Name = "SummaryDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
public string Summary { get; set; }

[Display(Name = "AuthorDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
public string Author { get; set; }

[Display(Name = "ThumbnailDisplay",
ResourceType = typeof(Resources.Resource1))]
public string Thumbnail { get; set; }

[Display(Name = "PriceDisplay",
ResourceType = typeof(Resources.Resource1))]
[Range(1, 100)]
public double Price { get; set; }

[Display(Name = "PublishedDisplay",
ResourceType = typeof(Resources.Resource1))]
[DataType(DataType.Date)]
[Required]
public DateTime Published { get; set; }

}

public class BookDBContext : DbContext
{
public DbSet<Book> Books { get; set; }
}

}

 
위의 예에서 DisplayAttribute는 키 이름 필드를 사용하여 자원 파일에서 인용된 자원 값을 검색합니다.이러한 인용은 모든 보기와 컨트롤러에서 사용할 수 있다.
 
다음 예에서, 우리는 책 색인 보기의 현실 텍스트를 바꾸어 정적 텍스트를 자원 파일로 이동할 것이다.테이블 1-1에서 키/값 쌍을 만들려면 다음과 같이 하십시오.
키 이름

BookIndexTitle
인덱스
CreateLink
창설
EditLink
편집자
DetailsLink
자세한 사정
DeleteLink
삭제
표 1-1 리소스 파일 업데이트
 
지금까지 자원 파일 하나만 만들었습니다. 모든 키 이름은 프로젝트 전체에서 유일해야 합니다.보시다시피, 테이블에 만들어진 다섯 개의 키 값이 맞습니다. 모든 보기에서 링크해서 사용할 수 있습니다. 
리소스 파일 업데이트가 완료되면 Books Controller를 열고 Index() 메서드를 다음 코드로 바꿉니다.
        //
// GET: /Books/
public ViewResult Index()
{

#region ViewBag Resources

ViewBag.Title =
Resources.Resource1.BookIndexTitle;

ViewBag.CreateLink =
Resources.Resource1.CreateLink;

ViewBag.TitleDisplay =
Resources.Resource1.TitleDisplay;

ViewBag.IsbnDisplay =
Resources.Resource1.IsbnDisplay;

ViewBag.SummaryDisplay =
Resources.Resource1.SummaryDisplay;

ViewBag.AuthorDisplay =
Resources.Resource1.AuthorDisplay;

ViewBag.ThumbnailDisplay =
Resources.Resource1.ThumbnailDisplay;

ViewBag.PriceDisplay =
Resources.Resource1.PriceDisplay;

ViewBag.PublishedDisplay =
Resources.Resource1.PublishedDisplay;

ViewBag.EditLink =
Resources.Resource1.EditLink;

ViewBag.DetailsLink =
Resources.Resource1.DetailsLink;

ViewBag.DeleteLink =
Resources.Resource1.DeleteLink;

#endregion

return View(db.Books.ToList());

}

 
마지막으로 책의 색인 디렉토리 보기는 모든 텍스트를 ViewBag의 해당 속성에 대한 참조로 변경해야 합니다.
@model IEnumerable<MvcApplication6.Models.Book>

<h2>@ViewBag.Title</h2>
<p>
@Html.ActionLink((string)ViewBag.CreateLink, "Create")
</p>

<table>
<tr>
<th>
@ViewBag.TitleDisplay
</th>

<th>
@ViewBag.IsbnDisplay
</th>

<th>
@ViewBag.SummaryDisplay
</th>

<th>
@ViewBag.AuthorDisplay
</th>

<th>
@ViewBag.ThumbnailDisplay
</th>

<th>
@ViewBag.PriceDisplay
</th>

<th>
@ViewBag.PublishedDisplay
</th>
<th></th>
</tr>

@foreach (var item in Model)
{

<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>

<td>
@Html.DisplayFor(modelItem => item.Isbn)
</td>

<td>
@Html.DisplayFor(modelItem => item.Summary)
</td>

<td>
@Html.DisplayFor(modelItem => item.Author)
</td>

<td>
@Html.DisplayFor(modelItem => item.Thumbnail)
</td>

<td>
@Html.DisplayFor(modelItem => item.Price)
</td>

<td>
@Html.DisplayFor(modelItem => item.Published)
</td>
<td>
@Html.ActionLink((string)ViewBag.EditLink,
"Edit", new { id = item.ID }) |

@Html.ActionLink((string)ViewBag.DetailsLink,
"Details", new { id = item.ID }) |

@Html.ActionLink((string)ViewBag.DeleteLink,
"Delete", new { id = item.ID })

</td>
</tr>
}

</table>

 
다른 보기와 컨트롤러는 모두 이런 방식으로 수정할 수 있다. 이 수정이 끝난 후에 우리는 자원 파일을 다른 언어 버전으로 복사하기만 하면 된다.
추가 입력을 피하기 위해서, 모든 파일을 자원 파일에 추가하는 것을 권장합니다.현재 자원 파일을 오른쪽 단추로 클릭하고 '복사' 를 클릭한 다음 'Resources' 폴더를 오른쪽 단추로 눌러서' 붙여넣기 '를 누르고 복사한 자원 복사본 파일을' Resource 1.fr.resx '로 이름을 바꿉니다. 물론 원하는 언어로 복사본을 만들고 이름을 붙일 수도 있습니다.그리고 이 파일의 가치 있는 부분을 당신이 원하는 언어 텍스트로 번역하세요.
요청에 따라 언어를 바꾸려면 글로벌에서 해야 합니다.asax.cs 파일의 AppliationAcquireRequestState() 방법에서는 각 요청에 대한CurrentUICulture를 변경하여 다음을 수행합니다.
       protected void Application_AcquireRequestState(
object sender, EventArgs e)
{

if (HttpContext.Current.Session != null)
{

CultureInfo ci =
(CultureInfo)this.Session["CurrentLanguage"];

if (ci == null)
{
ci = new CultureInfo("en");
this.Session["CurrentLanguage"] = ci;
}

Thread.CurrentThread.CurrentUICulture = ci;

Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(ci.Name);
}
}

위 코드 예제에서는 테스트를 거친 후 세션 변수인 CurrentLanguage에 유효한 CultureInfo 값이 지정됩니다. 유효한 CultureInfo가 감지되면 기본적으로 영어로 CurrentLanguage가 지정됩니다.다음은 Home Controller에서 사용자가 언어를 선택하는 기능을 제공하는 작업을 만듭니다.
       
        public ActionResult ChangeLanguage(string language)
{
Session["CurrentLanguage"] =
new CultureInfo(language);

return Redirect("Index");
}

ChangeLanguage는 Global을 업데이트하는 새 언어 이름을 설정하는 매개 변수를 받아들입니다.asax.cs의 그림 변수를 선택한 언어 인터페이스로 전환합니다.다음 링크를 글로벌 공유 마스터 페이지에 추가합니다Layout.cshtml:
[ @Html.ActionLink("English", "ChangeLanguage", "Home",
new { language = "en" }, null) ]

[ @Html.ActionLink("Français", "ChangeLanguage", "Home",
new { language = "fr" }, null) ]

우리는 링크를'로그인'링크 옆에 놓을 것이다. 그러면 사이트가 점차적으로 발전함에 따라 새로운 자원 파일을 만들고 새로운 링크를 추가하면 사용자가 새로운 언어를 선택할 수 있고 새로운 언어를 추가하는 것이 매우 쉽다.
앞서 캐나다, 미국, 영국 등 나라에는 다양한 영어 사투리가 있는데, 서로 다른 나라에 언어 정보를 추가하려면 국가의 코드 뒤에 언어 코드를 추가하고 문자'-'를 통해 연결할 수 있다.예를 들어'en-GB'는 영국 영어를 나타내고 추가된 후에 링크, 언어 이름과 커런트UICulture 설정을 업데이트해야 한다.
참조 정보
CurrentUICulture 원서 주소 책 원본 코드

좋은 웹페이지 즐겨찾기