PDA

View Full Version : نحوه ی تعریف معنی کلمات در سایتهای چند زبانه(مثل یه دیکشنری)



hdv212
یک شنبه 26 فروردین 1386, 20:16 عصر
سلام
من تو سایت جستجو کردم در مورد سایتهای چند زبانه و مشکلم حل شد، ولی الان میخوام مثلا تمام عناوینی که تو یه صفحه س و در Resource ذخیره شده رو در یه جدول به همراه مقدارش بدم و کاربر بتونه برای هر عنوان معنی اون رو در قسمت مقدارش بنویسه و ذخیره کنه (فرض کنید مثلا برای زبان فارسی)
تقریبا یه چیزی توی مایه های دیکشنری میشه.
مرسی

rtech
یک شنبه 26 فروردین 1386, 23:13 عصر
فکر کنم شما چیزی مثل ویرایش زبان DotNetNuke میخواهید درسته ؟

hdv212
دوشنبه 27 فروردین 1386, 00:05 صبح
نه بابا .. نحوه ی دسترسی و نمایش و ویرایش فایلهای Resx
همین

nazaninam
دوشنبه 27 فروردین 1386, 00:32 صبح
http://www.codeproject.com/useritems/Editing_a_ResourceFile.asp
فکر کنم مقاله فوق کمکتون کنه

hdv212
دوشنبه 27 فروردین 1386, 01:05 صبح
ایول دستت درد نکنه .. دقیقا همون بود که میخواستم ... امیدوارم مشکلم حل بشه ..

nazaninam
دوشنبه 27 فروردین 1386, 11:42 صبح
دوست عزیز این پروژه داخل C# بخوبی جواب میده !
با یک نکته جالب مواجه شدم ! کلاس ResXResourceReader برای خواند فایل های Resx بکار میره .
این کلاس داخل کتابخانه resources در C# وجود داره ولی در Vb و جود نداره!
از این جالب تر اینه که فقط پروژه های وب این کلاس رو ندارند ،پروژه های ویندوز این کتابخانه را دارند.
کسی نمی تونه بگه چی کار کنم ؟

hdv212
دوشنبه 27 فروردین 1386, 14:52 عصر
منم میخواستم بگم این کتابخانه در سی شارپ هم نیست، یعنی
System.Resources.ResXResourceReader
در سی شارپ نیست و این کلاس رو نمیشناسه، ولی توی لینکی که nazaninam عزیز گذاشتن میشناسه، چکار باید بکنم که توی برنامه ی من هم بشناسه ؟

nazaninam
دوشنبه 27 فروردین 1386, 15:09 عصر
یاااافتم :D
کافیه توی فایل وب کانفیگ تگ زیر رو اضافه کنید :



<assemblies>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>

hdv212
دوشنبه 27 فروردین 1386, 16:11 عصر
آره دستت درد نکنه،همین بود. تازه یه بار هم باید برنامه رو کامپایل کنی..به هر حال همین بود .. مرسی

hdv212
دوشنبه 27 فروردین 1386, 16:34 عصر
بابا یکی بیاد کمک کنه، عجب چیز مزخرفیه این وب سازی. یه مشکل دیگه توی لینکی که nazaninam عزیز گذاشته، یعنی این :
http://www.codeproject.com/useritems/Editing_a_ResourceFile.asp
در قسمت cmbResources_SelectedIndexChanged اونجایی که GridView به Slist بایند میشه پس از کامپایل صفحه و انتخاب یکی از عناصر لیست پیغام خطایی میده مبنی بر اینکه :

The data source for GridView with id 'GridView1' did not have any properties or attributes from which to generate columns. Ensure that your data source has content.

چکار کنم ؟

در ضمن در حالت debug، متغیر slist مقدار داره، ولی نمیدونم چطوری gridView رو به این متغیر بایند کنم که پیغام خطا نده.

Alireza_Salehi
دوشنبه 27 فروردین 1386, 20:10 عصر
فایل های Resx XML هستند با متد ReadXML در دیتاست اون رو بخونید و در دیتاست بریزید،

دیتاست رو هم که بلدید چیکار میشه باهاش کرد!

کارتون هم که تموم شد با WriteXML دوباره بنویسید.

hdv212
دوشنبه 27 فروردین 1386, 22:32 عصر
arsp_2004 عزیز میشه طریقه ی کار با WriteXML رو هم بگی ؟؟ ممنون!

Alireza_Salehi
سه شنبه 28 فروردین 1386, 10:20 صبح
طریقه خاصی نداره ، این متد 8 تا Overload داره که دو تاش مسیر فایل رو میگیره.

به 4 حالت مختلف خروجی این متد ایجاد میشه (اجرا کنید و تفاوت و شباهت هر کدام رو با فایل اصلی ببینید):


Dim ds AsNew DataSet()
ds.ReadXml(MapPath("~/App_GlobalResources/Resource.resx"))
'..........
ds.WriteXml("G:\WriteSchema.xml", XmlWriteMode.WriteSchema)
ds.WriteXml("G:\IgnoreSchema.xml", XmlWriteMode.IgnoreSchema)
ds.WriteXml("G:\DiffGram.xml", XmlWriteMode.DiffGram)
ds.WriteXml("G:\WriteXml.xml")

با توجه به این که در فایل های Resource اطلاعات Schema هم وجود داره (XSD) از متد WriteXML به صورت زیر استفاده کنید:

ds.WriteXml("G:\WriteSchema.xml", XmlWriteMode.WriteSchema

DataSet.WriteXml Method Overload List (http://msdn2.microsoft.com/en-us/library/system.data.dataset.writexml.aspx)

(http://msdn2.microsoft.com/en-us/library/ms135425.aspx)DataSet.WriteXml Method (String, XmlWriteMode) (http://msdn2.microsoft.com/en-us/library/ms135425.aspx)
(http://msdn2.microsoft.com/en-us/library/ms135425.aspx)

البته System.Resources هم مخصوص کار با Resource هاست، که توی اون لینکی که nazaninam گذاشته بود دیدی .
System.Resources Namespace (http://msdn2.microsoft.com/en-us/library/system.resources.aspx)

hdv212
سه شنبه 28 فروردین 1386, 12:28 عصر
یعنی با این کار، dataset بروز شده به فایل XML جاری منعکس میشه ؟؟
یعنی برای ذخیره ی مقادیر نیازی به ذکر نام Element و Node و ... نداریم ؟؟

در ضمن من فایل Resx رو با متد ReadXml خوندم و DataSource مربوط به دیتاگریدمو بهش بایند کردم، به صورت زیر :
ds.ReadXml(MapPath("~//App_LocalResources//Default.aspx.fa.resx"));
GridView2.DataSource = ds;
GridView2.DataBind();

ولی چیزی رو توی دیتاگریدم نشون نمیده، انگار هیچ اتفاقی نیفتاده

Alireza_Salehi
سه شنبه 28 فروردین 1386, 14:48 عصر
یعنی با این کار، dataset بروز شده به فایل XML جاری منعکس میشه ؟؟
یعنی برای ذخیره ی مقادیر نیازی به ذکر نام Element و Node و ... نداریم ؟؟

دیتاست رو به هر طریقی که می تونید دستکاری کنید ، بعد متد WirteXml رو بکار ببرید ، همین !
تغییرات و ... همه در فایل اعمال میشن!


ds.WriteXml("~/App_GlobalResources/Resource.resx", XmlWriteMode.WriteSchema)



ولی چیزی رو توی دیتاگریدم نشون نمیده، انگار هیچ اتفاقی نیفتاده

این فایل های Resource یک تگ root دارند ، در داخل این تگ 5 تگ به شرح زیر قرار می گیرد، که وقتی با متد ReadXML اون رو میخونید به ازای هر تگی(به ازای نام تگ ) یک جدول ایجاد میشه:


<xsd></xsd>
در دیتاست بعد از پر شدن 4 جدول با نام تگ های زیر وجود داره:
<assembly></assembly>
<data></data>
<metadata></metadata>
<resheader></resheader>

تگ xsd برای مشخص کردن Schema جدول ها به کار میره - به ازای این تگ جدولی به دیتاست اضافه نمیشه
داده های مورد نظر در جدول data وجود داره بنابراین:


GridView1.DataSource = ds.Tables("data")

hdv212
سه شنبه 28 فروردین 1386, 15:32 عصر
arsp_2004 عزیز واقعا دستت درد نکنه، مشکلم حل شد ولی توضیحاتی که دادی رو کامل متوجه نشدم، لینک مقاله ای چیزی اگه میشه در همین مورد برام بذار .. در ضمن وقتی دیتاگریدم بایند میشه توسط همون کدی که گفتی به غیر از فیلدهای name و value، چند فیلد دیگه هم هست مثل : comment و type و mimetype و space. چطوری میتونم اینارو مدیریت کنم ؟

hdv212
سه شنبه 28 فروردین 1386, 15:49 عصر
حاجی مشکل مربوط به Column ها حل شد. با این کد میتونید هر ستونی رو که بخواهید از Gridview تون حذف کنید(البته باید ایندکس اون ستون رو درست بدونید)

GridView2.HeaderRow.Cells[i].Visible = false;

ولی هنوز منتظر مقاله هایی که در پست قبلی گفتم ... هستم

hdv212
چهارشنبه 29 فروردین 1386, 12:10 عصر
arsp_2004 جان من منتظر مقاله ها هستم!

Alireza_Salehi
چهارشنبه 29 فروردین 1386, 13:28 عصر
اگر یک فایل Resource رو با XML Editor موجود در ویژوال استودیو (Right Click>Open With...) باز کنید این توضیحات رو میبینید:


<!--


Microsoft ResX Schema


Version 2.0


The primary goals of this format is to allow a simple XML format

that is mostly human readable. The generation and parsing of the

various data types are done through the TypeConverter classes

associated with the data types.


Example:


... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>

There are any number of "resheader" rows that contain simple
name/value pairs.

Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.

The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:

Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.

mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryForma tter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapF ormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->







و در مورد این که این تگها چی هستند : یک سند XML به خودی خود معنا نداره و معنی این که تگها چی هستند و داخلشون چی هست و ترتیب و Syntax یک سند چطور باید باشه رو توسط Schema ی اون سند مشخص می کنند.

در مورد فایل XML مورد بحث ما که همون *.Resx باشه بعد از توضیحات موجود در فایل ،schema سند وجود داره:


<xsd:schemaid="root"xmlns=""xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:importnamespace="http://www.w3.org/XML/1998/namespace" />
<xsd:elementname="root"msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choicemaxOccurs="unbounded">
<xsd:elementname="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="value"type="xsd:string"minOccurs="0" />
</xsd:sequence>
<xsd:attributename="name"use="required"type="xsd:string" />
<xsd:attributename="type"type="xsd:string" />
<xsd:attributename="mimetype"type="xsd:string" />
<xsd:attributeref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:elementname="assembly">
<xsd:complexType>
<xsd:attributename="alias"type="xsd:string" />
<xsd:attributename="name"type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:elementname="data">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="value"type="xsd:string"minOccurs="0"msdata:Ordinal="1" />
<xsd:elementname="comment"type="xsd:string"minOccurs="0"msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attributename="name"type="xsd:string"use="required"msdata:Ordinal="1" />
<xsd:attributename="type"type="xsd:string"msdata:Ordinal="3" />
<xsd:attributename="mimetype"type="xsd:string"msdata:Ordinal="4" />
<xsd:attributeref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:elementname="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="value"type="xsd:string"minOccurs="0"msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attributename="name"type="xsd:string"use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>


مقاله خاصی ندارم ، تفسیر این تگها در شمای فایل موجوده اگر معنیش رو متوجه نمی شید یک کتاب آموزش XML بخونید و دنبال نحوه تعریف شما (schema) بگردید چون توضیحش یه کم وقت گیره.

hdv212
چهارشنبه 29 فروردین 1386, 15:03 عصر
دستت درد نکنه .. ولی من اینا رو میدونم .. منظورم اینه که در این کد :
GridView1.DataSource = ds.Tables("data")
چرا گفتی data ?? چرا نگفتی value ؟
مرسی

Alireza_Salehi
چهارشنبه 29 فروردین 1386, 15:06 عصر
خوب یه داده جدید به فایلت اضافه کن ببین به کجا اضافه میشه!

یه تگ data اضافه میشه ، بنابراین تو جدول Data ریخته میشه.