bug描述:
nautilus从中文语言转换为英文语言,文件管理器右键就不会有“新建文件”了
直入正题:
一、先说说nautilus 是到底怎么做的:
相关源码如下:
config_file = g_build_filename (g_get_user_config_dir (),
"user-dirs.dirs", NULL);
file = g_file_new_for_path (config_file);
cached_xdg_dirs_monitor = g_file_monitor_file (file, 0, NULL, NULL);
g_signal_connect (cached_xdg_dirs_monitor, "changed",
G_CALLBACK (xdg_dir_cache_changed_cb), NULL);
它是读取.config/user-dirs.dirs ,这个变动,那么Templates Desktop Pictures等所有目录均会变化。
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
以上是user-dirs.dirs中定义的目录。
也就是说这个更改语言后的目录并不由nautilus本身控制,它也仅仅是读取值。
同样的,dde的桌面右键中的新建 模板目录,也是读取user-dirs.dirs的。
二、再来说说user-dirs.dirs 是怎么回事。
当你手动在文件管理器中改变templates等目录的名字时,user-dirs.dirs里面的值会相应改变。
也就是说可以有以下解决方案:
我可以检测locale 然后rename Templates等文件名,可以解决这个bug。
但是问题来了,接下:
三:再来说说nautilus为何要仅仅以读取user-dirs.dirs目录为标准。
先说个题外话,其实nautilus留了一条备用的路,代码如下:
char *
nautilus_get_xdg_dir (const char *type)
{
int i;
if (cached_xdg_dirs == NULL) {
update_xdg_dir_cache ();
}
for (i = 0 ; cached_xdg_dirs != NULL && cached_xdg_dirs[i].type != NULL; i++) {
if (strcmp (cached_xdg_dirs[i].type, type) == 0) {
return g_strdup (cached_xdg_dirs[i].path);
}
}
if (strcmp ("DESKTOP", type) == 0) {
return g_build_filename (g_get_home_dir (), DESKTOP_DIRECTORY_NAME, NULL);
}
if (strcmp ("TEMPLATES", type) == 0) {
return g_build_filename (g_get_home_dir (), "Templates", NULL);
}
return g_strdup (g_get_home_dir ());
}
它是先读user-dirs.dirs,如果里面没有设定相应的值,那么就直接返回home目录下的对应文件夹,看得出,备用方案很戳,它只读了 ~/Templates ~/Pictures, 没有读~/模板 ~/图片
回归正题,
大家可以看出nautilus是有一套标准的,就是以user-dirs.dirs 里面的为标准。
我相信这套标准应该不只是nautilus遵循的,应该是很多程序都遵循的标准,这点@夏彬 应该知道。
五、然后再说说我个人对nautilus为何遵循这套标准的理解。
这里首先要@夏彬 问三个问题,这个我不知道
1.当切换语言时,user-dirs.dirs 里面中英文切换是由谁设定的,nautilus吗? 还是系统的什么设定的?
2.同样的,当我手动在文件管理器中重命名templates等时,user-dirs.dirs对应的值会自动改为我重名命的值。 这个过程是user-dirs.dirs监听了templates等这些特殊文件,还是nautilus自己更改的。(显然,我认为nautilus肯定不会去更改user-dirs.dirs中的值,否则,它就是自己在破坏自己遵循的标准了!)
3.说白了,我想知道user-dirs.dirs是不是监听了对应的特殊文件? 然后nautilus监听了user-dirs.dirs中的值。(后面这个我是确定的,前面这个就不知道了)
问题问完了,再继续说,下面对这套标准的解释,不依赖于三个问题的答案。
1.如果我用二中的解决方案修复了这个bug(根据上面的分析和测试,肯定是可行的)那么bug会更加很严重:
假设用户在桌面放了很多文件,其中有一个是他用户自行设置为开机启动(通过终端设置的),那么当切换语言后,因为我是更改了“Desktop”的名称,那么显然就不能启动了。
这只是一个开机启动的案例,再说一个,假设用户把一个小的程序直接安装在桌面(windows小白经常在桌面新建一个“安装目录”,然后直接把qq什么的装里面,大学经常见到这样有才的女生),那么当更改语言后,这个程序显然就不能执行了。
2. 这就是为何nautilus遵循use-dirs.dirs标准的原因
我相信写nautilus的人(我不知道是谁),肯定知道这个bug,但是他还是想到解决这个用户习惯和用户方便难题的解决方案---遵循一个标准即可!
六、再来说说windows对这种事情是怎么解决的
大家都知道windows上有 “我的文档” 这个目录,默认是在c:/usr/中的,但是现在很多人喜欢把这个目录更改到d:/我的文档 下面。因为很多东西,如qq聊天记录、eclipse开发工程、收藏夹等等都在这里面
显然如果微软检测d:/我的文档 是否存在,如果存在直接设置为这个目录即可,但是微软没有这么做,因为这样做的话,虽然方便了用户,但是破坏了自己遵循的标准(默认在c:/usr下面,当然多个用户时,那就更能说明这个标准的正确性了!)
微软把这个难题最后给了用户自己,这也是正确的,最后的选择权在用户自己手上,是否更改路径由用户自己决定
同样的,usr-dirs.dirs在用户自己重命名Templates等后,会自动更改对应值,它也是在遵循自己的标准,同时把最后的选择权给了用户自己。
七、 最后
说了好多好多,希望大家能讨论出是否遵循这个标准,如果不遵循,请说说原因。
最后我还是说说我个人的最后的解决方案吧:
1.更改locale后(假设由en_US 到 zh_CN), Templates、Desktop 还是会保留,同时会新建 “模板” “桌面” 两个文件夹,且usr-dirs.dirs同样值为对应的值(此时会自动更改为"模板"等),且新建的文件夹中是空的。---------这些所有的,就是现在nautilus的解决方案
2.我们增加一步:
上面操作完成后,将Templats目录中的文件全部复制到新建的“模板”目录中去。
但是:Desktop、Picture中都不复制。
原因:请看看你的Picture中的文件多不多,有复制的必要吗?(剪切或者重命名的方案,上面所有的话已经解释了不应采纳的原因了) 再对于小白用户,桌面上的文件甚至比D盘的东西还多,能复制吗?切换locale后复制这么多不会卡死吗?
为何只需要复制Templates目录:
模板目录的确很特殊,新建是用户常用的操作,而很多时候,用户把好的ppt模板(例如我们深之度ppt模板)直接放在模板目录下,就是为了方便,不需要每次都添加背景图片。 且模板目录中文件不会很大(office文档也大不起来),复制时间也不会很长,不会在切换locale后卡死。
欢迎讨论,欢迎吐槽
1052

被折叠的 条评论
为什么被折叠?



