Вы можете создать alias
целей в third_party/sdl/BUILD
:
alias(
name = "sdl",
actual = "//third_party/sdl/2_0_9:sdl",
)
Затем вы можете называть эту цель //third_party/sdl
или //third_party/sdl:sdl
.
Неявная локализация (в меню Visual Studio - Tools - Генерируют Локальные Ресурсы) почти так легка, как это может быть. Запишите свои страницы на Вашем языке по умолчанию, выберите пункт меню, и Ваши файлы ресурсов создаются и могут быть отправлены кому-то для перевода.
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>
Таблица, содержащая строки, имеет один столбец за язык. Это делает очень легким создать сайт на английском языке (или независимо от того, что язык по умолчанию), затем вручите от таблицы (который заполняет себя) к переводчику. Также очень легко видеть, для каких языков у Вас должен быть материал, переведенный. С ресурсами, каждый раз, когда необходимо добавить новую строку, необходимо остановить то, что Вы делаете, и затем переходите к файлу ресурсов для каждого языка и добавляете ресурс.
Вот код для маркировки языка:
''' <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 языках. Мы дергаем за все ниточки в файлы ресурсов и поставляем их в переводческую компанию. Это время от времени - боль, но это - defacto способ сделать это.
Это также получает забаву, когда английские слова с 4 буквами переводятся во фразы с 17 буквами, и необходимо настроить UI.
Как поздно в процессе проектирования Вы? Если не слишком поздно, и если бюджет позволяет, рассматривают портирование на многоязычный CMS как CMS300.net Ektron (который имеет встроенные инструментальные средства для перевода). В противном случае затем у Вас есть огромная задача перед Вами.
Другое решение, которое я использую, состоит в том, чтобы создать папки языка, которые содержат aspx страницы, содержащие весь обязательный текст на том конкретном языке.
Единственная проблема здесь состоит в том, как можно ввести как можно меньше код в тех, которые копируют страницы. Я использую шаблон контроллера здесь, чтобы сделать это и затем источник данных объектов, чтобы получить данные и связать их со средствами управления на всех страницах.
Таким образом я достиг цели избавления от файлов ресурсов, и я могу сохранить код позади в одном месте, не копируя его (если необходимый).
Править: Я рекомендовал бы хорошую платформу CMS также.
Одно из веб-приложений, которые я разрабатываю, имеет это требование NLS также.
Я нашел, что существует по крайней мере 3 места, где Вы локализовали тексты:
Мое решение имеет одну таблицу для страниц, таблицы, и т.д. ("Контейнер"), одна таблица для каждого объекта в том контейнере (например, маркировки, кнопки идентификатором, идентификаторами записи), и одна таблица для переведенных объектов (плюс идентификатор языка).
Приложение для перевода помогает мне усовершенствовать переводы и экспортирует все переводы в XML.
Поставки продукта с переводами, но клиенты могут скорректировать переводы, изменения, вступающие в силу сразу.