বৃহত্তর নেট নেট প্রকল্পে বহু ভাষা / বিশ্বায়ন বাস্তবায়নের সর্বোত্তম উপায় way


87

আমি শীঘ্রই একটি বৃহত সি # প্রকল্পে কাজ করব এবং শুরু থেকে বহু ভাষা সমর্থন তৈরি করতে চাই। আমার চারপাশে একটি খেলা হয়েছে এবং এটি প্রতিটি ভাষার জন্য পৃথক রিসোর্স ফাইল ব্যবহার করে কাজ করতে পারি, তারপরে স্ট্রিংগুলি লোড করতে রিসোর্স ম্যানেজার ব্যবহার করুন।

অন্য কোন ভাল পন্থা আছে যা আমি সন্ধান করতে পারি?

উত্তর:


91

সংস্থানগুলি সহ একটি পৃথক প্রকল্প ব্যবহার করুন

আমি এটিকে অভিজ্ঞতার বাইরে বলতে পারি, 12 টি 24 টি প্রকল্পের সাথে বর্তমান সমাধান রয়েছে যার মধ্যে এপিআই, এমভিসি, প্রকল্প গ্রন্থাগার (কোর কার্যকারিতা), ডব্লিউপিএফ, ইউডাব্লুপি এবং জ্যামারিন রয়েছে। এটি দীর্ঘস্থায়ী পোস্টটি পড়া মূল্যহীন যেহেতু আমি মনে করি এটি করার সর্বোত্তম উপায়। ভিএস সরঞ্জামগুলির সাহায্যে সহজেই রফতানিযোগ্য এবং আমদানিযোগ্য অনুবাদ সংস্থাগুলিতে প্রেরণ করা হয় বা অন্য লোকেরা পর্যালোচনা করে।

সম্পাদনা 02/2018: এখনও শক্তিশালী হচ্ছে, এটি একটি। নেট স্ট্যান্ডার্ড লাইব্রেরিতে রূপান্তর করা এটি এমনকি নেট ফ্রেমওয়ার্ক এবং নেট কোর জুড়ে এটি ব্যবহার সম্ভব করে তোলে। আমি এটিকে JSON এ রূপান্তর করার জন্য একটি অতিরিক্ত বিভাগ যুক্ত করেছি যাতে উদাহরণস্বরূপ কৌণিক এটি ব্যবহার করতে পারে।

সম্পাদনা 2019: জামারিনের সাথে এগিয়ে যাওয়া, এটি এখনও সমস্ত প্ল্যাটফর্ম জুড়ে কাজ করে। যেমন Xamarin.forms পাশাপাশি রেক্স ফাইল ব্যবহার করার পরামর্শ দেয়। (আমি এখনও জামারিনে কোনও অ্যাপ্লিকেশন বিকাশ করতে পারি নি ms ফর্মগুলিতে, তবে ডকুমেন্টেশনগুলি কেবল এটি শুরু করার জন্য বিশদভাবে জানানো হয়েছে, এটি কভার করে: জ্যামারিন.ফর্মস ডকুমেন্টেশন )। একে এটিকে JSON এ রূপান্তর করার মতো আমরা এটিকে Xamarin.Android এর জন্য .xML ফাইলে রূপান্তর করতে পারি।

সম্পাদনা 2019 (2): ডাব্লুপিএফ থেকে ইউডাব্লুপি-তে আপগ্রেড করার সময়, আমি মুখোমুখি হয়েছি যে ইউডাব্লুপিতে তারা অন্য একটি ফাইল টাইপ ব্যবহার করতে পছন্দ করে .resw, যা সামগ্রীর মতো বিষয়গুলির ক্ষেত্রে তবে ব্যবহারটি পৃথক। আমি এটি করার একটি ভিন্ন উপায় খুঁজে পেয়েছি যা আমার মতে, ডিফল্ট সমাধানের পরে আরও ভাল কাজ করে ।

2020 সম্পাদনা করুন: বৃহত্তর (মডিউলার) প্রকল্পগুলির জন্য কিছু পরামর্শ আপডেট করেছে যাতে একাধিক ভাষা প্রকল্পের প্রয়োজন হতে পারে।

সুতরাং, এটি পেতে দিন।

প্রো এর

  • প্রায় সর্বত্র জোরালোভাবে টাইপ করা।
  • ডব্লিউপিএফ-এ আপনাকে মোকাবেলা করতে হবে না ResourceDirectories
  • এএসপি.এনইটি, ক্লাস লাইব্রেরি, ডব্লিউপিএফ, জামারিন,। নেট কোর,। নেট স্ট্যান্ডার্ডের জন্য সমর্থিত যতদূর আমি পরীক্ষা করে দেখেছি।
  • কোনও অতিরিক্ত তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন নেই।
  • সংস্কৃতি ফালব্যাক সমর্থন করে: en-US -> en।
  • কেবল ব্যাক-এন্ডই নয়, এমভিসির জন্য .cshtML এ ডাব্লুপিএফ এবং জ্যামারিন.ফর্মের জন্য এক্সএএমএল-তেও কাজ করে।
  • পরিবর্তন করে ভাষাটি সহজেই হেরফের করুন Thread.CurrentThread.CurrentCulture
  • অনুসন্ধান ইঞ্জিনগুলি বিভিন্ন ভাষায় ক্রল করতে পারে এবং ব্যবহারকারী ভাষা-নির্দিষ্ট url প্রেরণ বা সংরক্ষণ করতে পারে।

কন এর

  • ডাব্লুপিএফ এক্সএএমএল কখনও কখনও বগি হয়, নতুন যুক্ত স্ট্রিংগুলি সরাসরি প্রদর্শিত হয় না। পুনর্নির্মাণ হ'ল অস্থায়ী ফিক্স (vs2015)।
  • ইউডাব্লুপি এক্সএএমএল ইন্টেলিজেন্স পরামর্শগুলি প্রদর্শন করে না এবং ডিজাইনের সময় পাঠ্যটি প্রদর্শন করে না।
  • আমাকে বলুন.

সেটআপ

আপনার সমাধানে ভাষা প্রকল্প তৈরি করুন, এটি মাইপ্রজেক্টের মতো একটি নাম দিন L ভাষা । রিসোর্সস নামে একটি ফোল্ডার যুক্ত করুন এবং সেই ফোল্ডারে দুটি রিসোর্স ফাইল (.resx) তৈরি করুন। এক নামক Resources.resx এবং অন্য নামক Resources.en.resx (অথবা নির্দিষ্ট জন্য .en-GB.resx)। আমার বাস্তবায়নে, আমার কাছে ডিফল্ট ভাষা হিসাবে এনএল (ডাচ) ভাষা রয়েছে, যাতে এটি আমার প্রথম ফাইলে যায় এবং ইংরেজি আমার দ্বিতীয় ফাইলে যায়।

সেটআপটির মতো দেখতে হবে:

ভাষা সেটআপ প্রকল্প

রিসোর্স.রেক্সের বৈশিষ্ট্যগুলি অবশ্যই: বৈশিষ্ট্য

কাস্টম সরঞ্জাম নামস্থানটি আপনার প্রকল্পের নামস্থানে সেট করা আছে তা নিশ্চিত করুন। এর কারণ হ'ল ডাব্লুপিএফ-তে আপনি Resourcesএক্সএএমএল-এর ভিতরে উল্লেখ করতে পারবেন না ।

এবং রিসোর্স ফাইলের ভিতরে, অ্যাক্সেস মডিফায়ারটিকে সর্বজনীনতে সেট করুন:

অ্যাক্সেস মডিফায়ার

আপনার যদি এত বড় অ্যাপ্লিকেশন থাকে (আসুন আলাদা আলাদা মডিউল বলি) আপনি উপরের মতো একাধিক প্রকল্প তৈরির বিষয়টি বিবেচনা করতে পারেন। সেক্ষেত্রে আপনি আপনার কী এবং উত্স শ্রেণীর নির্দিষ্ট মডিউলটির সাথে উপসর্গ করতে পারেন pre একক ওভারভিউতে সমস্ত ফাইল একত্রিত করার জন্য ভিজ্যুয়াল স্টুডিওতে রয়েছে এমন সেরা ভাষা সম্পাদক ব্যবহার করুন ।

অন্য প্রকল্পে ব্যবহার করা হচ্ছে

আপনার প্রকল্পের রেফারেন্স: রেফারেন্সগুলিতে ডান ক্লিক করুন -> উল্লেখ যুক্ত করুন -> প্রকল্পগুলি \ সমাধান।

কোনও ফাইলে নেমস্পেস ব্যবহার করুন: using MyProject.Language;

ব্যাক-এন্ডে এটির মতো ব্যবহার করুন: string someText = Resources.orderGeneralError; যদি রিসোর্স নামে আর কিছু থাকে তবে কেবল পুরো নেমস্পেসে রেখে দিন।

এমভিসিতে ব্যবহার করছি

এমভিসিতে আপনি ভাষাটি সেট করতে পছন্দ করতে পারেন তবে আমি প্যারামিটারাইজড ইউআরএল ব্যবহার করেছি, যা এটির মতো সেটআপ করা যেতে পারে:

অন্যান্য ম্যাপিংয়ের নীচে রুটকনফিগ। সি

routes.MapRoute(
    name: "Locolized",
    url: "{lang}/{controller}/{action}/{id}",
    constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" },   // en or en-US
    defaults: new { controller = "shop", action = "index", id = UrlParameter.Optional }
);

ফিল্টারকনফিগ.সি.এস. (যদি তাই হতে FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);পারে তবে Application_start()পদ্ধতিতে যুক্ত করুনGlobal.asax

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ErrorHandler.AiHandleErrorAttribute());
        //filters.Add(new HandleErrorAttribute());
        filters.Add(new LocalizationAttribute("nl-NL"), 0);
    }
}

স্থানীয়করণঅ্যাট্রিবিউট

public class LocalizationAttribute : ActionFilterAttribute
{
    private string _DefaultLanguage = "nl-NL";
    private string[] allowedLanguages = { "nl", "en" };

    public LocalizationAttribute(string defaultLanguage)
    {
        _DefaultLanguage = defaultLanguage;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string lang = (string) filterContext.RouteData.Values["lang"] ?? _DefaultLanguage;
        LanguageHelper.SetLanguage(lang);
    }
}

ল্যাঙ্গুয়েজ হেল্পার কেবল সংস্কৃতি সম্পর্কিত তথ্য সেট করে।

//fixed number and date format for now, this can be improved.
public static void SetLanguage(LanguageEnum language)
{
    string lang = "";
    switch (language)
    {
        case LanguageEnum.NL:
            lang = "nl-NL";
            break;
        case LanguageEnum.EN:
            lang = "en-GB";
            break;
        case LanguageEnum.DE:
            lang = "de-DE";
            break;
    }
    try
    {
        NumberFormatInfo numberInfo = CultureInfo.CreateSpecificCulture("nl-NL").NumberFormat;
        CultureInfo info = new CultureInfo(lang);
        info.NumberFormat = numberInfo;
        //later, we will if-else the language here
        info.DateTimeFormat.DateSeparator = "/";
        info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
        Thread.CurrentThread.CurrentUICulture = info;
        Thread.CurrentThread.CurrentCulture = info;
    }
    catch (Exception)
    {

    }
}

.Cshtml এ ব্যবহার

@using MyProject.Language;
<h3>@Resources.w_home_header</h3>

অথবা আপনি যদি ইউএসিংগুলি সংজ্ঞায়িত করতে না চান তবে কেবল পুরো নেমস্পেসটি পূরণ করুন বা আপনি / ভিউজ / ওয়েবেকনফাইগের অধীনে নাম স্থানটি নির্ধারণ করতে পারেন:

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    ...
    <add namespace="MyProject.Language" />
  </namespaces>
</pages>
</system.web.webPages.razor>

এই এমভিসি বাস্তবায়ন উত্স টিউটোরিয়াল: দুর্দান্ত টিউটোরিয়াল ব্লগ

মডেলগুলির জন্য শ্রেণি পাঠাগারগুলিতে ব্যবহার করা

ব্যাক-এন্ড ব্যবহার একই, তবে বৈশিষ্ট্যগুলিতে ব্যবহারের জন্য কেবল উদাহরণ

using MyProject.Language;
namespace MyProject.Core.Models
{
    public class RegisterViewModel
    {
        [Required(ErrorMessageResourceName = "accountEmailRequired", ErrorMessageResourceType = typeof(Resources))]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }
    }
}

আপনার যদি পুনঃনির্ধারণকারী থাকে তবে প্রদত্ত সংস্থানটির নামটি বিদ্যমান কিনা তা স্বয়ংক্রিয়ভাবে পরীক্ষা করে দেখাবে। আপনি যদি সুরক্ষা প্রকারের পছন্দ করেন তবে আপনি এনাম তৈরি করতে টি 4 টেম্পলেট ব্যবহার করতে পারেন

ডাব্লুপিএফ ব্যবহার করা।

অবশ্যই আপনার মাইপ্রজেক্টের একটি রেফারেন্স যুক্ত করুন ang ভাষা নেমস্পেস, আমরা জানি কিভাবে এটি ব্যাক- এন্ডে ব্যবহার করতে হয়।

এক্সএএমএল-তে, একটি উইন্ডো বা ব্যবহারকারীকন্ট্রোলের শিরোনামের অভ্যন্তরে, এমন একটি নাম স্থান উল্লেখ উল্লেখ করুন lang:

<UserControl x:Class="Babywatcher.App.Windows.Views.LoginView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyProject.App.Windows.Views"
              xmlns:lang="clr-namespace:MyProject.Language;assembly=MyProject.Language" <!--this one-->
             mc:Ignorable="d" 
            d:DesignHeight="210" d:DesignWidth="300">

তারপরে, একটি লেবেলের ভিতরে:

    <Label x:Name="lblHeader" Content="{x:Static lang:Resources.w_home_header}" TextBlock.FontSize="20" HorizontalAlignment="Center"/>

যেহেতু এটি দৃ strongly়ভাবে টাইপ করা হয়েছে আপনি নিশ্চিত হন যে উত্সের স্ট্রিংটি বিদ্যমান। আপনার কখনও কখনও সেটআপের সময় প্রকল্পটি পুনরায় সংকলনের প্রয়োজন হতে পারে, ডাব্লুপিএফ কখনও কখনও নতুন নেমস্পেসের সাথে বগি হয়।

ডাব্লুপিএফের জন্য আরও একটি জিনিস, এর ভিতরে ভাষাটি সেট করুন App.xaml.cs। আপনি নিজের প্রয়োগটি করতে পারেন (ইনস্টলেশন চলাকালীন চয়ন করুন) বা সিস্টেমকে সিদ্ধান্ত নিতে দিন।

ইউডাব্লিউপিতে ব্যবহার করা হচ্ছে

ইউডাব্লুপি-তে, মাইক্রোসফ্ট এই সমাধানটি ব্যবহার করে , এর অর্থ আপনার নতুন রিসোর্স ফাইল তৈরি করতে হবে। এছাড়াও আপনি পাঠ্যটি পুনরায় ব্যবহার করতে পারবেন না কারণ তারা চান যে আপনি x:Uidআপনার সংস্থানগুলির এক্সএএমএল-এ আপনার নিয়ন্ত্রণের সেটটি তৈরি করতে পারেন । এবং আপনার সংস্থানগুলিতে আপনাকে Example.Textএকটি TextBlockপাঠ্য পূরণ করতে হবে । আমি সমাধানটি মোটেও পছন্দ করিনি কারণ আমি আমার সংস্থান ফাইলগুলি পুনরায় ব্যবহার করতে চাই। অবশেষে আমি নিম্নলিখিত সমাধান নিয়ে এসেছি। আমি আজই এটি খুঁজে পেয়েছি (2019-09-26) তাই আমি যদি অন্য কিছু দিয়ে ফিরে আসতে পারি তবে যদি এটির সার্থকতা কাজ করে না তবে দেখা যায়।

আপনার প্রকল্পে এটি যুক্ত করুন:

using Windows.UI.Xaml.Resources;

public class MyXamlResourceLoader : CustomXamlResourceLoader
{
    protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
    {
        return MyProject.Language.Resources.ResourceManager.GetString(resourceId);
    }
}

এই যোগ App.xaml.csকন্সট্রাকটর মধ্যে:

CustomXamlResourceLoader.Current = new MyXamlResourceLoader();

আপনি যখনই নিজের অ্যাপ্লিকেশনটিতে যেতে চান, ভাষা পরিবর্তন করতে এটি ব্যবহার করুন:

ApplicationLanguages.PrimaryLanguageOverride = "nl";
Frame.Navigate(this.GetType());

ইউআইকে রিফ্রেশ করার জন্য শেষ লাইনের প্রয়োজন। আমি এখনও এই প্রকল্পে কাজ করার সময় আমি লক্ষ্য করেছি যে এটি 2 বার করার দরকার ছিল। আমি প্রথমবার ব্যবহারকারীর শুরু হওয়ার সাথে সাথে একটি ভাষা নির্বাচন শেষ করব। তবে যেহেতু এটি উইন্ডোজ স্টোরের মাধ্যমে বিতরণ করা হবে, তাই ভাষাটি সাধারণত ভাষার ভাষার সমান।

তারপরে এক্সএএমএল-এ ব্যবহার করুন:

<TextBlock Text="{CustomResource ExampleResourceKey}"></TextBlock>

কৌণিক এ এটি ব্যবহার (JSON রূপান্তর)

এখনকার দিনে উপাদানগুলির সাথে সমন্বিতভাবে কৌণিকের মতো কাঠামো তৈরি করা বেশি সাধারণ, সুতরাং সিএসটিএমএল ছাড়াই। অনুবাদগুলি জসন ফাইলে সংরক্ষণ করা হয়, আমি কীভাবে এটি কাজ করে তা কভার করতে যাচ্ছি না, আমি কৌণিক মাল্টি-ট্রান্সলেশন পরিবর্তে এনজিএক্স-অনুবাদ করার জন্য অত্যন্ত সুপারিশ করব । সুতরাং যদি আপনি অনুবাদগুলি কোনও জেএসওন ফাইলে রূপান্তর করতে চান তবে এটি বেশ সহজ, আমি একটি টি 4 টেম্পলেট স্ক্রিপ্ট ব্যবহার করি যা সংস্থান ফাইলটি একটি জসন ফাইলে রূপান্তর করে। আমি সিনট্যাক্সটি পড়তে এবং এটি সঠিকভাবে ব্যবহার করতে টি 4 এডিটর ইনস্টল করার পরামর্শ দিচ্ছি কারণ আপনার কিছু পরিবর্তন করতে হবে।

কেবলমাত্র 1 টি লক্ষণীয়: ডেটা উত্পন্ন করা, এটি অনুলিপি করা, ডেটা পরিষ্কার করা এবং অন্য ভাষার জন্য এটি তৈরি করা সম্ভব নয়। সুতরাং আপনার নীচের কোডগুলিকে আপনার যত ভাষা আছে তার চেয়ে অনেকবার অনুলিপি করতে হবে এবং '// এখানে ভাষা চয়ন করুন' এর আগে এন্ট্রি পরিবর্তন করতে হবে। বর্তমানে এটি ঠিক করার কোনও সময় নেই তবে সম্ভবত পরে আপডেট করা হবে (আগ্রহী হলে)।

পাথ: মাইপ্রোজেক্ট.ল্যাঙ্গোয়েজ / টি 4 / ক্রিয়েটলোক্যালাইজেশন.এন.টি.

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.ComponentModel.Design" #>
<#@ output extension=".json" #>
<#


var fileNameNl = "../Resources/Resources.resx";
var fileNameEn = "../Resources/Resources.en.resx";
var fileNameDe = "../Resources/Resources.de.resx";
var fileNameTr = "../Resources/Resources.tr.resx";

var fileResultName = "../T4/CreateLocalizationEN.json";//choose language here
var fileResultPath = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "MyProject.Language", fileResultName);
//var fileDestinationPath = "../../MyProject.Web/ClientApp/app/i18n/";

var fileNameDestNl = "nl.json";
var fileNameDestEn = "en.json";
var fileNameDestDe = "de.json";
var fileNameDestTr = "tr.json";

var pathBaseDestination = Directory.GetParent(Directory.GetParent(this.Host.ResolvePath("")).ToString()).ToString();

string[] fileNamesResx = new string[] {fileNameEn }; //choose language here
string[] fileNamesDest = new string[] {fileNameDestEn }; //choose language here

for(int x = 0; x < fileNamesResx.Length; x++)
{
    var currentFileNameResx = fileNamesResx[x];
    var currentFileNameDest = fileNamesDest[x];
    var currentPathResx = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "MyProject.Language", currentFileNameResx);
    var currentPathDest =pathBaseDestination + "/MyProject.Web/ClientApp/app/i18n/" + currentFileNameDest;
    using(var reader = new ResXResourceReader(currentPathResx))
    {
        reader.UseResXDataNodes = true;
#>
        {
<#
            foreach(DictionaryEntry entry in reader)
            {
                var name = entry.Key;
                var node = (ResXDataNode)entry.Value;
                var value = node.GetValue((ITypeResolutionService) null); 
                 if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("\n", "");
                 if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("\r", "");
#>
            "<#=name#>": "<#=value#>",
<#

    
            }
#>
        "WEBSHOP_LASTELEMENT": "just ignore this, for testing purpose"
        }
<#
    }
    File.Copy(fileResultPath, currentPathDest, true);
}


#>

যদি আপনার কাছে মডিউলার অ্যাপ্লিকেশন থাকে এবং আপনি একাধিক ভাষার প্রকল্প তৈরির জন্য আমার পরামর্শ অনুসরণ করেন, তবে আপনাকে তাদের প্রত্যেকের জন্য একটি T4 ফাইল তৈরি করতে হবে। নিশ্চিত করুন যে জসন ফাইলগুলি যৌক্তিকভাবে সংজ্ঞায়িত হয়েছে, এটি হওয়ার দরকার নেই en.json, এটিও হতে পারে example-en.jsonএনজিএক্স-অনুবাদ সহ একাধিক জসন ফাইলগুলি একত্রিত করতে এখানে নির্দেশিকাগুলি অনুসরণ করুন

Xamarin.Android এ ব্যবহার করুন

আপডেটগুলিতে উপরে বর্ণিত হিসাবে, আমি কৌনিক / জেএসওএন দিয়ে যেমন করেছি তেমন পদ্ধতি ব্যবহার করি। তবে অ্যান্ড্রয়েড এক্সএমএল ফাইলগুলি ব্যবহার করে, তাই আমি একটি টি 4 ফাইল লিখেছিলাম যা এই এক্সএমএল ফাইলগুলি তৈরি করে।

পাথ: মাইপ্রজেক্ট.ল্যাঙ্গোয়েজ / টি 4 / ক্রিয়েট অ্যাপলোক্যালাইজেশন.এন.টি.

#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.ComponentModel.Design" #>
<#@ output extension=".xml" #>
<#
var fileName = "../Resources/Resources.en.resx";
var fileResultName = "../T4/CreateAppLocalizationEN.xml";
var fileResultRexPath = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "MyProject.Language", fileName);
var fileResultPath = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "MyProject.Language", fileResultName);

    var fileNameDest = "strings.xml";

    var pathBaseDestination = Directory.GetParent(Directory.GetParent(this.Host.ResolvePath("")).ToString()).ToString();

    var currentPathDest =pathBaseDestination + "/MyProject.App.AndroidApp/Resources/values-en/" + fileNameDest;

    using(var reader = new ResXResourceReader(fileResultRexPath))
    {
        reader.UseResXDataNodes = true;
        #>
        <resources>
        <#

                foreach(DictionaryEntry entry in reader)
                {
                    var name = entry.Key;
                    //if(!name.ToString().Contains("WEBSHOP_") && !name.ToString().Contains("DASHBOARD_"))//only include keys with these prefixes, or the country ones.
                    //{
                    //  if(name.ToString().Length != 2)
                    //  {
                    //      continue;
                    //  }
                    //}
                    var node = (ResXDataNode)entry.Value;
                    var value = node.GetValue((ITypeResolutionService) null); 
                     if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("\n", "");
                     if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("\r", "");
                     if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("&", "&amp;");
                     if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("<<", "");
                     //if (!String.IsNullOrEmpty(value.ToString())) value = value.ToString().Replace("'", "\'");
#>
              <string name="<#=name#>">"<#=value#>"</string>
<#      
                }
#>
            <string name="WEBSHOP_LASTELEMENT">just ignore this</string>
<#
        #>
        </resources>
        <#
        File.Copy(fileResultPath, currentPathDest, true);
    }

#>

অ্যান্ড্রয়েড values-xxফোল্ডারগুলির সাথে কাজ করে , সুতরাং values-enফোল্ডারে ইংরেজির জন্য উপরে । তবে আপনাকে একটি ডিফল্টও তৈরি করতে হবে যা valuesফোল্ডারে যায় । কেবলমাত্র T4 টেমপ্লেটের উপরের অনুলিপি করুন এবং উপরের কোডটিতে ফোল্ডারটি পরিবর্তন করুন।

আপনি সেখানে যান, আপনি এখন আপনার সমস্ত প্রকল্পের জন্য একটি একক সংস্থান ফাইল ব্যবহার করতে পারেন। এটি এক্সেল ডকুমেন্টে সবকিছু রফতানি করা খুব সহজ করে দেয় এবং কাউকে এটি অনুবাদ করতে এবং এটি আবার আমদানি করতে দেয়।

এই আশ্চর্যজনক ভিএস এক্সটেনশনের জন্য বিশেষ ধন্যবাদ যা resxফাইলগুলির সাথে দুর্দান্ত কাজ করে। তার দুর্দান্ত কাজের জন্য তাকে অনুদান দেওয়ার কথা বিবেচনা করুন (এর সাথে আমার কিছু করার নেই, আমি কেবল এক্সটেনশনটি পছন্দ করি)।


1. স্থাপনার পরে আপনি কীভাবে আরও ভাষা যুক্ত করবেন?, মাইল্যাঙ্গুয়েজে আরও সংস্থান যুক্ত করে পুনরায় সংকলন করুন এবং তারপরে পুনরায় চালু করুন? (২) অনুবাদের জন্য আপনি কোন আইডিই বা সরঞ্জাম ব্যবহার করেছেন (উইনফর্মে আমার 40 টিরও বেশি ফর্ম রয়েছে), আপনি কি ভাগ করতে পারবেন? (৩) আমি চেষ্টা করেছিলাম এবং সংস্কৃতিটি আরবিতে পরিবর্তন করার পরে এটি অনুবাদ পায় নি, আমি একটি প্রশ্ন তৈরি করব এবং আপনাকে
স্মিথ

4
1: কেবলমাত্র রিসোর্স.এক্সএক্স.আরএক্সকে ডাইপ্রেটেট করুন এবং এক্সএক্স পরিবর্তন করুন এবং আমার যেখানে স্যুইচ স্টেটমেন্ট রয়েছে সেখানে ভাষা যুক্ত করুন। 2 আমি রেজ্যাক্স ম্যানেজার (টোমেনগার্ট দ্বারা) এক্সটেনশানটি ব্যবহার করি, সরঞ্জামগুলির মাধ্যমে> এক্সটেনশানগুলির মাধ্যমে ইনস্টল করা যায়, একে অপরের পাশের ভাষাগুলি রাখার দুর্দান্ত উপায় তবে প্রকৃত অনুবাদ অন্য কারও দ্বারা করা হয় (রেজেক্সম্যানেজারের সাথে এক্সেল থেকে / এক্সপোর্টে সহজ এক্সপোর্ট এবং আমদানি)। ৩. এবার শেষবারের মতো পাশাপাশি একটি যোগ করে, উপরে তালিকাভুক্ত সমস্ত ফাইল যাচাই করুন তবে কয়েকটি ব্রেকপয়েন্ট। যদিও আমি উইনফোর্মে এটি ব্যবহার করি নি।
কুলারবাইটস

13
আমি আমার নিজের উত্তর upvote করতে পারেন?
ডাব্লুপিএফ-

4
@ টিয়াগোব্রেঙ্ক হাই, কেবলমাত্র এই নির্দিষ্ট পরিস্থিতিতে যদি ইংরাজী আপনার ডিফল্ট ভাষা হয় তবে আপনি একটি রিসোর্স.েন-জিবি.রেক্স ফাইল তৈরি করতে এবং সেখানে 1% পরিবর্তন যুক্ত করতে পারেন। ডিফল্টরূপে, যদি এন-জিবি ভাষা নির্বাচন করা হয় এবং শব্দগুলি অনুবাদ না করা হয়, তবে এটি ডিফল্ট ভাষা (রিসোর্সেসেসেক্স) ব্যবহার করে।
কুলারবাইটস

4
আপনি কীভাবে রিসোর্স ফাইলের কীগুলি কাঠামোগত করেছেন? যেহেতু আমি দেখতে পাচ্ছি যে আপনি কেবল একটি রিসোর্স ফাইল ব্যবহার করেন এবং আপনার মতে আপনার কাছে একটি বিশাল অ্যাপ রয়েছে, কীগুলি কীভাবে বিভক্ত করেছেন? "বৈশিষ্ট্য.মাইমেসেজ", বা "এরিয়া.ফিচার.মাইমেসেজ"
ফ্রান্সেস্কো

21

আমি বেশ কয়েকটি বিভিন্ন পদ্ধতির ব্যবহার করে প্রকল্পগুলি বাস্তবায়িত দেখেছি, প্রত্যেকের নিজস্ব যোগ্যতা এবং ত্রুটি রয়েছে।

  • এটি কনফিগ ফাইলে করেছে (আমার পছন্দ নয়)
  • এটি একটি ডাটাবেস ব্যবহার করে করা হয়েছিল - এটি বেশ ভাল কাজ করেছে, তবে কী বজায় রাখতে হবে তা আপনার জানা ব্যথা।
  • আপনি যেভাবে পরামর্শ দিচ্ছেন সেভাবে একটি ব্যবহৃত রিসোর্স ফাইল এবং আমার বলতে হবে এটি আমার প্রিয় পদ্ধতির।
  • সবচেয়ে মৌলিক এটি একটি স্ট্রিংয়ের পূর্ণ ফাইল অন্তর্ভুক্ত ব্যবহার করে করেছে - কুৎসিত।

আমি বলব যে আপনি যে রিসোর্সটি বেছে নিয়েছেন তা অনেকটা অর্থবোধ করে। অন্যান্য ব্যক্তির উত্তরগুলিও দেখতে আকর্ষণীয় হবে কারণ আমি প্রায়শই ভাবছি যে এর মতো কাজ করার আরও ভাল উপায় আছে কিনা। আমি প্রচুর সংস্থান দেখেছি যা সমস্ত এসও-তে এখানে একটি সহ সম্পদ পদ্ধতি ব্যবহারের দিকে নির্দেশ করে ।


5

আমি মনে করি না এখানে একটি "সেরা উপায়" আছে। এটি আপনি যে প্রযুক্তি এবং অ্যাপ্লিকেশন তৈরি করছেন তার ধরণের উপর নির্ভর করবে।

অন্যান্য পোস্টারগুলির পরামর্শ অনুসারে ওয়েব অ্যাপস ডাটাবেসে তথ্য সংরক্ষণ করতে পারে তবে আমি পৃথক সংস্থান ফাইলগুলি ব্যবহার করার পরামর্শ দিচ্ছি। এটি আপনার উত্স থেকে পৃথক সংস্থান ফাইলগুলি । পৃথক সংস্থান ফাইলগুলি একই ফাইলগুলির জন্য বিতর্ককে হ্রাস করে এবং আপনার প্রকল্পটি বাড়ার সাথে সাথে আপনি দেখতে পাবেন যে স্থানীয়করণটি ব্যবসায়ের যুক্তি থেকে আলাদাভাবে করা হবে। (প্রোগ্রামার এবং অনুবাদক)।

মাইক্রোসফ্ট উইনফর্ম এবং ডাব্লুপিএফ গুরুরা প্রতিটি লোকেলের জন্য কাস্টমাইজ করা পৃথক সংস্থান সংস্থানগুলি ব্যবহার করার পরামর্শ দেন।

কনটেন্টে ইউআই উপাদানগুলিকে আকার দেওয়ার ডাব্লুপিএফের ক্ষমতা প্রয়োজনীয় লেআউটের কাজকে হ্রাস করে: (জাপানি শব্দগুলি ইংরেজি থেকে অনেক ছোট) orter

আপনি যদি ডাব্লুপিএফ বিবেচনা করছেন: আমি এই এমএসডিএন নিবন্ধটি পড়ার পরামর্শ দিচ্ছি সত্যবাদী হওয়ার জন্য আমি ডাব্লুপিএফ স্থানীয়করণ সরঞ্জামগুলি পেয়েছি: এমএসবিল্ড, লোকবামেল, (এবং সম্ভবত একটি এক্সেল স্প্রেডশিট) ব্যবহার করতে ক্লান্তিকর, তবে এটি কার্যকর হয়।

কিছুটা সামান্য সম্পর্কিত: আমার মুখোমুখি একটি সাধারণ সমস্যা হ'ল ত্রুটি কোডগুলি নয়, ত্রুটি বার্তা প্রেরণকারী লিগ্যাসি সিস্টেমগুলিকে সংহত করা (সাধারণত ইংরাজীতে)। এটি হয় উত্তরাধিকারী সিস্টেমে পরিবর্তনগুলি জোর করে, বা আমার নিজস্ব ত্রুটি কোডগুলিতে ব্যাকএন্ড স্ট্রিংগুলি ম্যাপিং করে এবং তারপরে স্থানীয়করণযুক্ত স্ট্রিংগুলিতে ... ইয়েচ করুন। ত্রুটি কোডগুলি স্থানীয়করণের বন্ধু


4

+1 ডাটাবেস

আপনার অ্যাপ্লিকেশানের ফর্মগুলি এমনকি ডাটাবেসে সংশোধন করা হলে উড়তে আবার নিজেকে অনুবাদ করতে পারে।

আমরা এমন একটি সিস্টেম ব্যবহার করেছি যেখানে ভাষা সংস্থান আইডিতে সমস্ত নিয়ন্ত্রণ একটি এক্সএমএল ফাইলে (প্রতিটি ফর্মের এক) ম্যাপ করা হয়েছিল, তবে সমস্ত আইডি ডাটাবেসে ছিল।

মূলত, প্রতিটি নিয়ন্ত্রণ আইডি ধরে রাখার পরিবর্তে (ইন্টারফেস প্রয়োগ করে, বা ভিবি 6-এ ট্যাগ সম্পত্তি ব্যবহার করে) পরিবর্তে, আমরা এই সত্যটি ব্যবহার করেছি যে নেট থেকে, নিয়ন্ত্রণ ট্রি প্রতিবিম্বের মাধ্যমে সহজেই আবিষ্কারযোগ্য rable এমন একটি প্রক্রিয়া যখন ফর্মটি লোড করা হয় তবে এটি অনুপস্থিত থাকলে XML ফাইলটি তৈরি করে। এক্সএমএল ফাইলগুলি তাদের রিসোর্স আইডিতে নিয়ন্ত্রণগুলি মানচিত্র করবে, সুতরাং এটি কেবল ডাটাবেসে পূরণ করা এবং ম্যাপ করা দরকার। এর অর্থ হ'ল কোনও কিছু ট্যাগ না করা থাকলে সংকলিত বাইনারি পরিবর্তন করার প্রয়োজন ছিল না, বা এটি অন্য আইডিতে বিভক্ত করার প্রয়োজন হলে (ইংরেজিতে কিছু শব্দ যা বিশেষ্য এবং ক্রিয়া উভয় ক্ষেত্রেই ব্যবহৃত হতে পারে দুটি ভিন্ন শব্দে অনুবাদ করার প্রয়োজন হতে পারে অভিধানে এবং পুনরায় ব্যবহৃত হবে না, তবে আপনি প্রাথমিক আইডির অ্যাসাইনমেন্টের সময় এটি আবিষ্কার করতে পারবেন না)।

সন্নিবেশকরণ পয়েন্ট সহ একটি পর্ব যখন ব্যবহৃত হয় কেবল তখনই অ্যাপটি আরও বেশি যুক্ত হয়।

ডাটাবেস অনুবাদ সফ্টওয়্যারটি হ'ল অনুপস্থিত অনুবাদগুলি ইত্যাদির মধ্য দিয়ে যাওয়া সহজতর করার জন্য বিভিন্ন ওয়ার্কফ্লো বিকল্প সহ আপনার মূল সিআরইউডি রক্ষণাবেক্ষণের পর্দা was


আমি আপনার পদ্ধতিটি পছন্দ করি, আপনি কি আমাকে বলতে পারবেন কীভাবে এক্সএমএল ফাইল উত্পন্ন হয় এবং তারপরে ডাটাবেসে ম্যাপ করা হয়?
স্মিথ

ফর্ম_ল্ড বা যাই হোক না কেন, অনুবাদ ফাংশনটি ফর্মের উদাহরণ হিসাবে অনুরোধ করা হয়েছিল। এই ফর্মটির জন্য এক্সএমএল ফাইলটি লোড করা হয়েছিল। এটি উপস্থিত না থাকলে এটি তৈরি করা হয়েছিল। আমার হাতে স্কিমা নেই, তবে মূলত, এটি অনুবাদ আইডিতে একটি ফর্মের নিয়ন্ত্রণের নামটি ম্যাপ করে। সুতরাং যে ফর্মটি এক্সএমএল ফাইলে ছিল না তার কোনও নিয়ন্ত্রণ কোনও অনুবাদ আইডি ছাড়াই একটি এন্ট্রি পাবে। যেহেতু তারা চাহিদার ভিত্তিতে তৈরি হবে, আপনি কেবল নিজের ফর্মটি তৈরি করতে পারবেন, অ্যাপটি চালাতে পারবেন যা কোনও অনুপস্থিত নিয়ন্ত্রণের জন্য এক্সএমএল ফাইলটি তৈরি বা আপডেট করবে। তারপরে আইটেমগুলির জন্য অনুবাদ আইডি পূরণ করুন।
ক্যাড রক্স

4

আমি অনুসন্ধান করেছি এবং আমি এটি খুঁজে পেয়েছি:

আপনি যদি ডাব্লুপিএফ বা সিলভারলাইট ব্যবহার করেন তবে আপনার অ্যাপ্রোচটি ডাব্লুপিএফ লোকালাইজেশন এক্সটেনশনটি অনেক কারণে ব্যবহার করতে পারে ।

এটির ওপেন সোর্স এটি নিখরচায় (এবং নিখরচায় থাকবে) সত্যিকারের স্ট্যাবেল অবস্থায় রয়েছে

একটি উইন্ডোজ অ্যাপ্লিকেশন আপনি এই মত কিছু করতে পারে:

public partial class App : Application  
{  
     public App()  
     {             
     }  
 
     protected override void OnStartup(StartupEventArgs e)  
     {  
         Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); ;  
         Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-DE"); ;  
 
          FrameworkElement.LanguageProperty.OverrideMetadata(  
              typeof(FrameworkElement),  
              new FrameworkPropertyMetadata(  
                  XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));  
          base.OnStartup(e);  
    }  
} 

এবং আমি মনে করি একটি ওয়েপ পৃষ্ঠায় এপ্রোচ একই রকম হতে পারে।

শুভকামনা!


2

আমি একাধিক সংস্থান ফাইলের সাথে যেতে চাই। এটি কনফিগার করা এত কঠিন হওয়া উচিত নয়। প্রকৃতপক্ষে আমি সম্প্রতি ফর্ম ল্যাঙ্গুয়েজ রিসোর্স ফাইলগুলির সাথে একযোগে বিশ্বব্যাপী ভাষা ভিত্তিক রিসোর্স ফাইল সেট করার অনুরূপ প্রশ্নের উত্তর দিয়েছি।

ভিজ্যুয়াল স্টুডিও 2008 এর স্থানীয়করণ

আমি বিবেচনা করব যে কমপক্ষে উইনফর্ম বিকাশের জন্য সর্বোত্তম পন্থা।


সংস্থানগুলির একটি অপূর্ণতা হ'ল ভাষা পরিবর্তন করতে আপনাকে পুনরায় চালু করতে হবে। এটি সম্ভবত বেশিরভাগের পক্ষে গ্রহণযোগ্য, তবে এটি আমার পোষা প্রাণীর ...
রোমান স্টারকভ

2

আপনি সিসুলাইজারের মতো বাণিজ্যিক সরঞ্জামগুলি ব্যবহার করতে পারেন । এটি প্রতিটি ভাষার জন্য উপগ্রহ সমাবেশ তৈরি করবে। আপনার কেবলমাত্র মনোযোগ দিতে হবে তা হ'ল শ্রেণীর নামগুলি ফর্ম্যাট করা (যদি আপনি অবলম্বনকারী ব্যবহার করেন)।


0

বেশিরভাগ ওপেনসোর্স প্রকল্পগুলি এই উদ্দেশ্যে গেটটেক্সট ব্যবহার করে। আমি কখনই জানি না এবং এটি কখন নেট নেটওয়ার্কের আগে ব্যবহার করা হয়েছিল।


0

আমরা বহু ভাষা সমর্থনের জন্য একটি কাস্টম সরবরাহকারী ব্যবহার করি এবং সমস্ত পাঠ্যকে একটি ডাটাবেস সারণিতে রাখি। ওয়েব অ্যাপ্লিকেশনটি আপডেট না করে ডাটাবেসে পাঠ্য আপডেট করার সময় আমরা কখনও কখনও ক্যাচিংয়ের সমস্যার মুখোমুখি না হয়ে এটি বেশ কার্যকর।


0

স্ট্যান্ডার্ড রিসোর্স ফাইলগুলি সহজ। যাইহোক, আপনার যদি কোনও ভাষা নির্ভর ডেটা থাকে যেমন লুকের টেবিলগুলি তবে আপনাকে দুটি সংস্থান সেট পরিচালনা করতে হবে।

আমি এটি করিনি, তবে আমার পরবর্তী প্রকল্পে আমি একটি ডাটাবেস সংস্থান সরবরাহকারী প্রয়োগ করব। এমএসডিএন-তে এটি কীভাবে করা যায় তা আমি পেয়েছি:

http://msdn.microsoft.com/en-us/library/aa905797.aspx

আমি এই বাস্তবায়নটিও পেয়েছি:

ডিবিআরসোর্স সরবরাহকারী

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.