RSS

Tag Archives: 多语言

多语言和自定义CSS

最近在一个SharePoint 2010项目中发现,在装了英文、日文语言包之后,在网站设置的语言设置中,选择备用语言的时候,系统返回一个异常,大意是包含自定义样式表(CSS)的网站不支持多语言。

之前一直没太注意到底什么算是“自定义CSS”,经过一番研究,发现了问题:

一般网站引用CSS的时候,引用的都是layouts目录中的文件(比如/_layouts/2052/Styles/corev4.css),这个CSS显然是整个服务器场共用的;但是出问题的这个网站引用的是本网站中的/_styles/corev4.css(这不是个虚拟路径,就是在网站中的一个目录,存在数据库里的)——这个就是所谓的“自定义CSS”。你想啊,人家在layouts里面的CSS是按照语言划分的,不同语言的情况下引用的是不同的CSS,而在_styles里面,全都一样,当然不成了,于是多语言就不干了。

那么下一个问题就是,这个自定义CSS到底是怎么出现的?怎么恢复成非自定义CSS?到底应该怎么去修改默认的CSS?一个一个来。

一、自定义CSS是如何出现的?

其实自定义CSS从SharePoint 2007的时候就出现了,但是由于当时并没有2010这种多语言机制,并没有把这个问题凸显出来。

经过一番调查,发现这个是由于我们的美工在使用SharePoint Designer改CSS的时候造成的。在SPD里面打开一个页面,页面里面自然会列出若干class,而当我们按住Ctrl键点击这些CSS的时候,就会打开对应CSS文件的编辑:

image

而当我们保存这个CSS的时候:

image

看到“自定义样式表”了吧?就是从这儿来的。一旦点了“是”,SharePoint就会把layouts下对应的这个CSS文件保存到网站的_styles目录中(如果之前没这个目录会自动创建一个,注意这是个目录,不是个文档库)。其实这是非常合理的,总不能因为你要修改页面里的一个CSS,就要影响到整个服务器场的所有网站吧?于是就有了这个类似于unghost的过程。

当然,使用对象模型的方式也可以很方便地完成这个过程,只需要一句话:

   1: spWeb.CustomizeCss("corev4.css");

(其实我就是翻SDK翻到的这个方法,然后用reflector确定了那个多语言就是这个东西造成的)

二、如何恢复成非自定义CSS?

既然知道了自定义的方法,恢复就有头绪了。直接写个Console,同样用一句话搞定:

   1: spWeb.RevertCss("corev4.css");

三、到底应该如何自定义CSS?

标准的做法当然不是去修改layouts下的CSS文件(除非你想整个服务器场所有网站都变化)。你可以把你要改的地方单放到一个CSS里,然后设置成网站的备用CSS,见下图:

image

上面这个界面是在网站设置 – 母版页(不是库分类下的那个母版页),这是在开启了发布功能的前提下才会出现的一个链接。如果没有开启发布功能的话,直接进去“/_Layouts/ChangeSiteMasterPage.aspx”这个页面应该也行(我没试过),或者干脆用程序改一下。这个备用CSS会自动放在系统默认的CSS文件之后进行引用,所以会覆盖掉默认的CSS样式(默认样式中有一些是标记了“!important”的,在自定义CSS里想要覆盖这个设置的话也要加上这个)

当然你也可以改母版页,在系统CSS引用(母版页中的SharePoint:CssLink和SharePoint:Theme)之后,使用SharePoint:CssRegistration控件进行引用,这样也可以自动根据不同的语言自动进行切换(具体的写法请自行msdn或者google)

 

Posted by on 2011 年 06 月 17 日 in SharePoint

Leave a comment

Tags: ,

SharePoint程序中的多语言支持

前些天 kaneboy 在博客中写了一篇关于SharePoint UI多语言支持的博客:《SharePoint 2010多语言UI,以及开发人员需要注意的》,本篇内容是对这篇Blog的一些补充和完善。

涂总的blog中主要是在介绍关于列表名称、字段名称等这些内容的多语言设置,在用程序创建一个列表/字段的时候,为了能够支持多语言,应该使用XXXResource属性来代替XXX属性(例如TitleResource代替Title)。实际上,如果我们是在网站中直接创建的这个列表/字段,例如在中文网站中(默认语言),创建了一个叫“QQ号码”的字段;而当我们切换到另一种语言的时候(比如英文),我们直接对这个字段改名为“QQ Number”,这个时候并不会覆盖中文语言的名称,而是只改变当前语言下的字段名称设置。通过这种方式,我们也可以在不同的语言环境中对同一个字段使用不同的名称。

需要注意的是,如果我们在网站设置 – 语言设置中,将“覆盖翻译”设置为“是”的时候,一旦我们在默认语言的网站中更改了字段名称,那么会覆盖掉其他语言网站的名称设置,我们需要重新切换语言,再进行一次设置。见下图:

image

下面介绍一些SharePoint中和多语言编程相关的对象模型

1、如何获取不同语言下,网站中一些默认文本?

通过使用SPResouce的静态方法GetString,该方法有两种重载:

   1: public static string GetString(string name, params Object[] values);
   2: public static string GetString(CultureInfo culture, string name, params Object[] values);

第一种方法是获取当前语言下指定的字符串,第二种是获取指定语言下指定的字符串(通过第一个参数)。

第二个参数就是资源字符串的名称,例如“LanguageNameInLocalizedLanguage”就是使用的语言,如果环境是简体中文,取到的就是“中文 – 简体”,如果环境是英文,取到的就是“English”。

第三个参数是使用的值,如果第二个参数中的字符串包含诸如{0}、{1}这样的占位符,则在第三个参数中指定这些占位符的具体值。

2、如何知道服务器上安装了哪些语言包?

有两种方法可以取得:

   1: spRegionalSettings.InstalledLanguages;
   2: SPRegionalSettings.GlobalInstalledLanguages;

第一种方法要先获取一个SPRegionalSettings对象,可以通过spWeb的RegionalSettings属性获取或者直接使用SPContext.Current.RegionalSettings;第二种方法是SPRegionalSettings的一个静态属性。

两种方法返回的都是SPLanguageCollection类型的对象,在SPLanguage中包含了LCID属性和DisplayName属性可以分别取得语言的lcid和显示名称(经测试,这个显示名称好像就是在默认语言下的显示名称,不会跟着当前环境语言而改变)

3、如何知道当前网站可以使用哪些语言?

在网站设置 – 语言设置中,可以选择当前网站中可以使用的语言,包括默认语言,以及备用语言(如果这边不选中对应的备用语言的话,即使安装了语言包,在网站中也用不了这个语言)。

通过使用spWeb的SupportedUICultures属性,可以获取到当前网站可以使用的语言,这个属性是一个IEnumerable<CultureInfo>类型的对象。需要注意的是,这个属性在沙盒解决方案中是不可用的。

4、如何得知网站的默认语言?

在后台程序中,可以通过spWeb的Language属性(int类型),获取默认语言的lcid。

在前台JavaScript程序中,可以通过_spPageContextInfo.webLanguage来获取这个lcid。

5、如何得知当前网站上正在使用哪种语言?

在后台程序中,可以通过Thread.CurrentThread.CurrentUICulture来获取当前环境的语言地区设置。

在前台JavaScript程序中,可以通过变量g_wsaLCID或者_spPageContextInfo.currentLanguage获取到当前语言的lcid。

 

那么,SharePoint网站支持多语言有哪些方式呢?

一种方式就是从2007沿用下来的,使用变体的方式(仅在server版中才有),这种方式是为每个语言创建一个独立的网站。

另一种方式,就是2010新增的,在同一个网站中对多语言的支持(也是上文反复说明的)。在这种方式下,网站的标题、描述信息,列表的标题、描述信息,字段的标题、描述信息,导航结点,托管元数据都是有多语言支持的。如果想要让一个普通的列表字段内容也支持多语言(在不同语言环境中显示不同的值),那就需要开发自定义字段类型了(2010中,只有托管元数据字段类型是包含多语言支持的),下图是一个开发好的一个多语言单行文本的效果:

编辑画面:

image

中文下的显示画面:

image

英文下的显示画面:

image

 

Posted by on 2011 年 02 月 22 日 in SharePoint

Leave a comment

Tags: