diff --git a/config/alfresco/messages/action-config_zh_CN.properties b/config/alfresco/messages/action-config_zh_CN.properties new file mode 100755 index 0000000000..e58b7d8805 --- /dev/null +++ b/config/alfresco/messages/action-config_zh_CN.properties @@ -0,0 +1,233 @@ +# Action parameter constraints +ac-compare-operations.equals=\u7B49\u4E8E +ac-compare-operations.contains=\u5305\u542B +ac-compare-operations.begins=\u5F00\u59CB\u81EA +ac-compare-operations.ends=\u7ED3\u675F\u4E8E +ac-compare-operations.greater_than=\u5927\u4E8E +ac-compare-operations.greater_than_equal=\u5927\u4E8E\u6216\u7B49\u4E8E +ac-compare-operations.less_than=\u5C0F\u4E8E +ac-compare-operations.less_than_equal=\u5C0F\u4E8E\u6216\u7B49\u4E8E + +ac-content-properties.mime_type=MIME \u7C7B\u578B +ac-content-properties.encoding=\u7F16\u7801 +ac-content-properties.size=\u5927\u5C0F + +# Action conditions + +no-condition.title=\u6240\u6709\u9879 +no-condition.description=\u6B64\u6761\u4EF6\u5C06\u5339\u914D\u6DFB\u52A0\u5230\u6B64\u7A7A\u95F4\u7684\u6240\u6709\u9879\u3002 \u5982\u679C\u5E0C\u671B\u5411\u6DFB\u52A0\u5230\u6B64\u7A7A\u95F4\u7684\u6240\u6709\u9879\u5E94\u7528\u67D0\u9879\u64CD\u4F5C\uFF0C\u8BF7\u4F7F\u7528\u6B64\u6761\u4EF6\u3002 + +compare-property-value.title=\u540D\u79F0\u4E2D\u5305\u542B\u503C +compare-property-value.description=\u6B64\u89C4\u5219\u5E94\u7528\u4E8E\u6240\u6709\u540D\u79F0\u4E2D\u6709\u5305\u542B\u7279\u5B9A\u503C\u7684\u9879\u3002 +compare-property-value.property.display-label=\u5C5E\u6027 +compare-property-value.content-property.display-label=\u5185\u5BB9\u5C5E\u6027 +compare-property-value.value.display-label=\u503C +compare-property-value.operation.display-label=\u6BD4\u8F83\u64CD\u4F5C + +in-category.title=\u6709\u7C7B\u522B +in-category.description=\u6B64\u89C4\u5219\u5E94\u7528\u4E8E\u6240\u6709\u6709\u6307\u5B9A\u7C7B\u522B\u503C\u7684\u9879\u3002 +in-category.category-aspect.display-label=\u7C7B\u522B\u5207\u9762 +in-category.category-value.display-label=\u7C7B\u522B\u503C + +is-subtype.title=\u7C7B\u578B\u6216\u5B50\u7C7B\u578B\u7684\u5185\u5BB9 +is-subtype.description=\u6B64\u89C4\u5219\u5E94\u7528\u4E8E\u6240\u6709\u5C5E\u4E8E\u6307\u5B9A\u7C7B\u578B\u6216\u5176\u5B50\u7C7B\u578B\u7684\u9879 +is-subtype.type.display-label=\u7C7B\u578B + +has-aspect.title=\u6709\u5207\u9762 +has-aspect.description=\u6B64\u89C4\u5219\u5E94\u7528\u4E8E\u6240\u6709\u5DF2\u5E94\u7528\u6307\u5B9A\u5207\u9762\u7684\u9879\u3002 +has-aspect.aspect.display-label=\u5207\u9762 + +compare-mime-type.title=MIME \u7C7B\u578B\u7684\u5185\u5BB9 +compare-mime-type.description=\u6B64\u89C4\u5219\u5E94\u7528\u4E8E\u6240\u6709\u5177\u6709\u6307\u5B9A MIME \u7C7B\u578B\u5185\u5BB9\u7684\u9879\u3002 +compare-mime-type.property.display-label=\u5C5E\u6027 +compare-mime-type.value.display-label=MIME \u7C7B\u578B + +composite-condition.title=\u7EFC\u5408\u6761\u4EF6 +composite-condition.description=\u7EFC\u5408\u82E5\u5E72\u6761\u4EF6\u4EE5\u521B\u5EFA\u66F4\u590D\u6742\u7684\u6761\u4EF6\u3002 + +compare-date-property.title=\u6709\u65E5\u671F\u503C\u7684\u5C5E\u6027 +compare-date-property.description=\u6BD4\u8F83\u5143\u6570\u636E\u3001\u5207\u9762\u6216\u7C7B\u578B\u7684\u65E5\u671F\u5C5E\u6027 + +compare-integer-property.title=\u6709\u6570\u5B57\u503C\u7684\u5C5E\u6027 +compare-integer-property.description=\u6BD4\u8F83\u5143\u6570\u636E\u3001\u5207\u9762\u6216\u7C7B\u578B\u7684\u6570\u5B57\u5C5E\u6027 + +compare-text-property.title=\u6709\u6587\u672C\u503C\u7684\u5C5E\u6027 +compare-text-property.description=\u6BD4\u8F83\u5143\u6570\u636E\u3001\u5207\u9762\u6216\u7C7B\u578B\u7684\u6587\u672C\u5C5E\u6027 + +has-tag.title=\u6709\u6807\u8BB0 +has-tag.description=\u6709\u4E00\u4E2A\u5DF2\u5E94\u7528\u4E8E\u67D0\u4E2A\u8282\u70B9\u7684\u6807\u8BB0\u3002 +has-tag.tag.display-label=\u6807\u8BB0 + +# Actions + +add-features.title=\u6DFB\u52A0\u5207\u9762 +add-features.description=\u5C06\u5411\u5339\u914D\u9879\u6DFB\u52A0\u4E00\u4E2A\u5207\u9762\u3002 +add-features.aspect-name.display-label=\u5207\u9762 + +remove-features.title=\u79FB\u9664\u5207\u9762 +remove-features.description=\u5C06\u4ECE\u5339\u914D\u9879\u79FB\u9664\u4E00\u4E2A\u5207\u9762\u3002 +remove-features.aspect-name.display-label=\u5207\u9762 + +simple-workflow.title=\u6DFB\u52A0\u7B80\u5355\u5DE5\u4F5C\u6D41\u7A0B +simple-workflow.description=\u5C06\u5411\u5339\u914D\u9879\u6DFB\u52A0\u4E00\u4E2A\u7B80\u5355\u5DE5\u4F5C\u6D41\u7A0B\u3002 \u4ECE\u800C\u53EF\u8BA9\u6B64\u9879\u79FB\u81F3\u5176\u4ED6\u7A7A\u95F4\uFF0C\u4EE5\u4FBF\u5B8C\u6210\u5DE5\u4F5C\u6D41\u7A0B\u4E2D\u7684\u4E0B\u4E00\u6B65\u3002 \u5982\u679C\u5E0C\u671B\u6267\u884C\u62D2\u7EDD\u6B65\u9AA4\uFF0C\u4E5F\u53EF\u4E3A\u5176\u6307\u5B9A\u8981\u79FB\u81F3\u7684\u7A7A\u95F4\u3002 +simple-workflow.approve-step.display-label=\u6279\u51C6\u6B65\u9AA4 +simple-workflow.approve-folder.display-label=\u6279\u51C6\u6B65\u9AA4\u6587\u4EF6\u5939 +simple-workflow.approve-move.display-label=\u6279\u51C6\u79FB\u52A8 +simple-workflow.reject-step.display-label=\u62D2\u7EDD\u6B65\u9AA4 +simple-workflow.reject-folder.display-label=\u62D2\u7EDD\u6B65\u9AA4\u6587\u4EF6\u5939 +simple-workflow.reject-move.display-label=\u62D2\u7EDD\u79FB\u52A8 + +link-category.title=\u94FE\u63A5\u5230\u7C7B\u522B +link-category.description=\u5C06\u5411\u5339\u914D\u9879\u5E94\u7528\u4E00\u4E2A\u7C7B\u522B\u3002 +link-category.category-aspect.display-label=\u7C7B\u522B\u5207\u9762 +link-category.category-value.display-label=\u7C7B\u522B\u503C + +transform.title=\u8F6C\u6362\u548C\u590D\u5236\u5185\u5BB9 +transform.description=\u5C06\u8F6C\u6362\u5339\u914D\u7684\u5185\u5BB9\uFF0C\u7136\u540E\u5C06\u7ED3\u679C\u590D\u5236\u5230\u7279\u5B9A\u7A7A\u95F4 +transform.mime-type.display-label=MIME \u7C7B\u578B +transform.destination-folder.display-label=\u76EE\u6807\u6587\u4EF6\u5939 +transform.assoc-type.display-label=\u5173\u8054\u7C7B\u578B +transform.assoc-name.display-label=\u5173\u8054\u540D\u79F0 +transform.overwrite-copy.display-label=\u8986\u76D6\u526F\u672C + +transform-image.title=\u8F6C\u6362\u548C\u590D\u5236\u56FE\u50CF +transform-image.description=\u5C06\u8F6C\u6362\u5339\u914D\u7684\u56FE\u50CF\uFF0C\u7136\u540E\u5C06\u7ED3\u679C\u590D\u5236\u5230\u7279\u5B9A\u7A7A\u95F4 +transform-image.mime-type.display-label=MIME \u7C7B\u578B +transform-image.destination-folder.display-label=\u76EE\u6807\u6587\u4EF6\u5939 +transform-image.assoc-type.display-label=\u5173\u8054\u7C7B\u578B +transform-image.assoc-name.display-label=\u5173\u8054\u540D\u79F0 +transform-image.overwrite-copy.display-label=\u8986\u76D6\u526F\u672C +transform-image.convert-command.display-label=\u8F6C\u6362\u547D\u4EE4 + +copy.title=\u590D\u5236 +copy.description=\u5C06\u628A\u5339\u914D\u9879\u590D\u5236\u5230\u53E6\u4E00\u4E2A\u7A7A\u95F4\u3002 +copy.destination-folder.display-label=\u76EE\u6807\u6587\u4EF6\u5939 +copy.assoc-type.display-label=\u5173\u8054\u7C7B\u578B +copy.assoc-name.display-label=\u5173\u8054\u540D\u79F0 +copy.deep-copy.display-label=\u6DF1\u5C42\u590D\u5236 +copy.overwrite-copy.display-label=\u8986\u76D6\u526F\u672C + +move.title=\u79FB\u52A8 +move.description=\u5C06\u628A\u5339\u914D\u9879\u79FB\u52A8\u5230\u53E6\u4E00\u4E2A\u7A7A\u95F4\u3002 +move.destination-folder.display-label=\u76EE\u6807\u6587\u4EF6\u5939 +move.assoc-type.display-label=\u5173\u8054\u7C7B\u578B +move.assoc-name.display-label=\u5173\u8054\u540D\u79F0 + +mail.title=\u53D1\u9001\u7535\u5B50\u90AE\u4EF6 +mail.description=\u5982\u679C\u5185\u5BB9\u5339\u914D\uFF0C\u5C06\u5411\u4E00\u5217\u7528\u6237\u53D1\u9001\u4E00\u5C01\u7535\u5B50\u90AE\u4EF6\u3002 +mail.to.display-label=\u6536\u4EF6\u4EBA +mail.to_many.display-label=\u6536\u4EF6\u4EBA +mail.subject.display-label=\u4E3B\u9898 +mail.text.display-label=\u6B63\u6587 +mail.from.display-label=\u53D1\u4EF6\u4EBA +mail.template.display-label=\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +mail.template_model.display-label=\u7535\u5B50\u90AE\u4EF6\u6A21\u677F\u7684\u66F4\u591A\u53C2\u6570 +mail.ignore_send_failure.display-label=\u5FFD\u7565\u53D1\u9001\u5931\u8D25 + +check-in.title=\u7B7E\u5165 +check-in.description=\u5C06\u7B7E\u5165\u5339\u914D\u7684\u5185\u5BB9\u3002 +check-in.description.display-label=\u8BF4\u660E +check-in.minorChange.display-label=\u6B21\u8981\u66F4\u6539 + +check-out.title=\u7B7E\u51FA +check-out.description=\u5C06\u7B7E\u51FA\u5339\u914D\u7684\u5185\u5BB9\u3002 +check-out.destination-folder.display-label=\u76EE\u6807\u6587\u4EF6\u5939 +check-out.assoc-type.display-label=\u5173\u8054\u7C7B\u578B +check-out.assoc-name.display-label=\u5173\u8054\u540D\u79F0 + +set-property-value.title=\u8BBE\u7F6E\u5C5E\u6027\u503C +set-property-value.description=\u5C06\u628A\u67D0\u4E2A\u5C5E\u6027\u7684\u503C\u8BBE\u7F6E\u4E3A\u6307\u5B9A\u503C\u3002 +set-property-value.property.display-label=\u5C5E\u6027 +set-property-value.value.display-label=\u503C + +import.title=\u5BFC\u5165 +import.description=\u5C06 Alfresco \u5185\u5BB9\u5305\u5BFC\u5165\u5230\u5B58\u50A8\u5E93\u4E2D\u3002 +import.encoding.display-label=\u7F16\u7801 +import.destination.display-label=\u76EE\u6807 + +extract-metadata.title=\u63D0\u53D6\u5E38\u7528\u5143\u6570\u636E\u5B57\u6BB5 +extract-metadata.description=\u4ECE\u5E38\u7528\u5185\u5BB9\u7C7B\u578B\u5BFC\u5165\u6807\u9898\u3001\u4F5C\u8005\u548C\u8BF4\u660E\u5143\u6570\u636E\u5B57\u6BB5\u3002 + +specialise-type.title=\u4E13\u95E8\u5316\u7C7B\u578B +specialise-type.description=\u5C06\u628A\u5339\u914D\u9879\u4E13\u95E8\u5316\u4E3A\u6307\u5B9A\u7C7B\u578B\u3002 +specialise-type.type-name.display-label=\u7C7B\u578B + +export.title=\u5BFC\u51FA\u7A7A\u95F4 +export.description=\u5C06\u7A7A\u95F4\u53CA\u5176\u5B50\u7EA7\uFF08\u53EF\u9009\uFF09\u5BFC\u51FA\u5230 Alfresco \u5BFC\u51FA\u5305\u3002 +export.package.description=\u7A7A\u95F4 ''{0}'' \u7684 Alfresco \u5185\u5BB9\u5305\u3002 +export.root.package.description=\u6574\u4E2A\u5B58\u50A8\u5E93\u7684 Alfresco \u5185\u5BB9\u5305\u3002 +export.store.package.description=\u5E93 ''{0}'' \u7684 Alfresco \u5B58\u50A8\u5E93\u5BFC\u51FA\u3002 +export.generic.package.description=Alfresco \u5B58\u50A8\u5E93\u5BFC\u51FA\u3002 +export.package.error=\u67E5\u627E\u8981\u5BFC\u51FA\u7684\u4E34\u65F6\u6587\u4EF6\u5931\u8D25 + +script.title=\u6267\u884C\u811A\u672C +script.description=\u6267\u884C JavaScript \u6587\u4EF6\u4EE5\u6267\u884C\u65B0\u5EFA\u6587\u4EF6\u6216\u6587\u4EF6\u5939\u7B49\u4EFB\u52A1\u3002 +script.script-ref.display-label=\u811A\u672C + +counter.title=\u589E\u91CF\u8BA1\u6570\u5668 +counter.counter=\u9012\u589E\u6B64\u9879\u7684\u8BA1\u6570\u5668\u5C5E\u6027\u3002 + +execute-all-rules.title=\u6267\u884C\u6240\u6709\u89C4\u5219 +execute-all-rules.description=\u5BF9\u5B50\u9879\u6267\u884C\u6240\u6709\u89C4\u5219\u3002 + +start-workflow.title=\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B +start-workflow.description=\u5C06\u4E3A\u5339\u914D\u9879\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B\u3002 +start-workflow.workflowName.display-label=\u5DE5\u4F5C\u6D41\u7A0B\u540D\u79F0 +start-workflow.endStartTask.display-label=\u4EFB\u52A1 +start-workflow.startTaskTransition.display-label=\u8F6C\u6362 + +cancel-workflow.title=\u53D6\u6D88\u5DE5\u4F5C\u6D41\u7A0B +cancel-workflow.description=\u53D6\u6D88\u5DE5\u4F5C\u6D41\u7A0B ID \u5217\u8868\u3002 +cancel-workflow.workflow-id-list.display-label=\u5DE5\u4F5C\u6D41\u7A0B ID \u5217\u8868 + +# WCM Actions + +simple-avm-submit.title=\u7B80\u5355\u76F4\u63A5\u63D0\u4EA4 +simple-avm-submit.description=\u5C06\u628A\u5339\u914D\u9879\u4E2D\u7684\u6240\u6709\u8F83\u65B0\u7684\u8282\u70B9\u63D0\u4EA4\u5230\u76F8\u5E94\u7684\u9884\u53D1\u5E03\u3002 + +simple-avm-promote.title=\u7B80\u5355\u6C99\u76D2\u5347\u7EA7 +simple-avm-promote.description=\u5C06\u628A\u5339\u914D\u9879\u4E2D\u7684\u6240\u6709\u8F83\u65B0\u7684\u8282\u70B9\u5347\u7EA7\u5230\u6307\u5B9A\u76EE\u6807\u6C99\u76D2\u3002 +simple-avm-promote.target-store.display-label=\u76EE\u6807 AVM \u5E93\u7684\u540D\u79F0\u3002 + +avm-revert-store.title=\u8FD8\u539F\u5E93\u4E2D\u7684\u5355\u4E2A\u8282\u70B9\u3002 +avm-revert-store.description=\u5C06\u628A\u5305\u542B\u53C2\u6570\u8282\u70B9\u53CA\u5176\u4EE5\u4E0B\u8282\u70B9\u7684\u6240\u6709\u8282\u70B9\u8FD8\u539F\u4E3A\u4E0A\u4E00\u4E2A\u7248\u672C\u3002 +avm-revert-store.version.display-label=\u8981\u8FD8\u539F\u5230\u7684\u7248\u672C\u3002 + +avm-revert-list.title=\u8FD8\u539F\u5E93\u4E2D\u7684\u4E00\u5217\u8282\u70B9\u3002 +avm-revert-list.description=\u5C06\u8FD8\u539F\u5217\u8868\u4E2D\u5305\u542B\u7684\u6240\u6709\u8282\u70B9\u3002 +avm-revert-list.version.display-label=\u8981\u8FD8\u539F\u5230\u7684\u7248\u672C\u3002 +avm-revert-list.node-list.display-label=\u5B57\u7B26\u4E32\u7F16\u7801\u7684\u5F85\u8FD8\u539F\u8282\u70B9\u5217\u8868\u3002 +avm-revert-list.flatten.display-label=\u662F\u5426\u5728\u8FD8\u539F\u4E4B\u540E\u6241\u5E73\u5316\u4E3A\u9884\u53D1\u5E03\u5E93\u3002 +avm-revert-list.store.display-label=\u6B63\u5728\u8FD8\u539F\u7684\u5E93\u7684\u540D\u79F0\uFF0C\u53EA\u6709\u6267\u884C\u6241\u5E73\u5316\u65F6\u624D\u9700\u8981\u3002 +avm-revert-list.staging.display-label=\u8981\u6241\u5E73\u5316\u5230\u7684\u9884\u53D1\u5E03\u5E93\u7684\u540D\u79F0\u3002 +avm-revert-list.flatten-path.display-label=\u5E94\u6241\u5E73\u5316\u7684\u5E93\u76F8\u5BF9\u8DEF\u5F84\u3002 + +avm-revert-to-version.title=\u5C06\u8282\u70B9\u8FD8\u539F\u4E3A\u7279\u5B9A\u7248\u672C\u3002 +avm-revert-to-version.description=\u5C06\u628A\u8282\u70B9\u8FD8\u539F\u4E3A\u8BE5\u8282\u70B9\u7684\u7279\u5B9A\u7248\u672C\u3002 +avm-revert-to-version.to-revert.display-label=\u8981\u8FD8\u539F\u5230\u7684\u7248\u672C\u7684 AVM \u8282\u70B9\u63CF\u8FF0\u7B26\u3002 + +avm-undo-list.title=\u5728\u5BF9\u9884\u53D1\u5E03\u900F\u660E\u7684\u5E93\u4E2D\u521B\u5EFA\u8282\u70B9\u5217\u8868\u3002 +avm-undo-list.description=\u5145\u5F53\u7528\u6237\u6C99\u76D2\u7684\u9519\u8BEF\u64E6\u9664\u5668\u3002 +avm-undo-list.node-list.display-label=\u5B57\u7B26\u4E32\u7F16\u7801\u7684\u5F85\u8FD8\u539F\u8282\u70B9\u5217\u8868\u3002 + +avm-deploy-website.title=\u5C06\u7F51\u7AD9\u90E8\u7F72\u5230\u8FDC\u7A0B\u670D\u52A1\u5668\u3002 +avm-deploy-website.description=\u5C06\u628A\u7AD9\u70B9\u90E8\u7F72\u5230\u8FDC\u7A0B\u670D\u52A1\u5668\u3002 +avm-deploy-website.webproject.display-label=\u90E8\u7F72\u7684\u6765\u6E90 Web \u9879\u76EE\u7684 NodeRef\u3002 +avm-deploy-website.server.display-label=\u90E8\u7F72\u7684\u76EE\u6807\u670D\u52A1\u5668\u7684 NodeRef\u3002 +avm-deploy-website.attempt.display-label=\u6B64\u90E8\u7F72\u6240\u5C5E\u90E8\u7F72\u5C1D\u8BD5\u7684 NodeRef\u3002 +avm-deploy-website.callback.display-label=DeploymentCallback \u4FA6\u542C\u5668\u5BF9\u8C61\u3002 +avm-deploy-website.delay.display-label=\u5E94\u7528\u4E8E\u90E8\u7F72\u5F00\u59CB\u9636\u6BB5\u7684\u53EF\u9009\u5EF6\u8FDF\u3002 + +start-avm-workflow.title=\u542F\u52A8 WCM \u5DE5\u4F5C\u6D41\u7A0B +start-avm-workflow.description=\u542F\u52A8\u9700\u8981 AVM \u5DE5\u4F5C\u6D41\u7A0B\u5305\u7684\u5DE5\u4F5C\u6D41\u7A0B +start-avm-workflow.store-name.display-label=\u542F\u52A8\u4EFB\u52A1\u7684\u5E93\u540D +start-avm-workflow.workflow-name.display-label=\u8981\u8C03\u7528\u7684 WCM \u5DE5\u4F5C\u6D41\u7A0B\u7684\u540D\u79F0\u3002 + +copy-to-web-project.title=\u5C06\u9879\u590D\u5236\u5230 Web \u9879\u76EE\u4E2D\u7684\u6587\u4EF6\u5939 +copy-to-web-project.description=\u5C06\u628A\u5339\u914D\u9879\u590D\u5236\u5230 Web \u9879\u76EE\u4E2D\u7684\u6587\u4EF6\u5939\u3002 + +create-version.title=\u65B0\u5EFA\u7248\u672C +create-version.description=\u521B\u5EFA\u65B0\u7248\u672C +create-version.description.display-label=\u7248\u672C\u8BF4\u660E +create-version.minor-change.display-label=\u4E3B\u8981\u66F4\u6539 + diff --git a/config/alfresco/messages/action-service_zh_CN.properties b/config/alfresco/messages/action-service_zh_CN.properties new file mode 100755 index 0000000000..df4738ec6f --- /dev/null +++ b/config/alfresco/messages/action-service_zh_CN.properties @@ -0,0 +1,9 @@ +# Action service externalised display strings + +compare_property_value_evaluator.invalid_operation=\u4E0D\u80FD\u5C06\u64CD\u4F5C {0} \u5E94\u7528\u4E8E\u7C7B\u578B\u4E3A {1} \u7684\u5C5E\u6027\u3002 +compare_property_value_evaluator.no_content_property=\u4E0E\u7C7B\u578B\u5185\u5BB9\u7684\u5C5E\u6027\u6BD4\u8F83\u65F6\uFF0C\u5FC5\u987B\u6307\u5B9A\u5185\u5BB9\u5C5E\u6027\u3002 +numeric_property_value_comparator.invalid_operation=\u4E0D\u80FD\u5C06\u64CD\u4F5C {0} \u5E94\u7528\u4E8E\u6570\u503C\u5C5E\u6027\u3002 +text_property_value_comparator.invalid_operation=\u4E0D\u80FD\u5C06\u64CD\u4F5C {0} \u5E94\u7528\u4E8E\u6587\u672C\u5C5E\u6027\u3002 +date_property_value_comparator.invalid_operation=\u4E0D\u80FD\u5C06\u64CD\u4F5C {0} \u5E94\u7528\u4E8E\u65E5\u671F\u5C5E\u6027\u3002 +compare_mime_type_evaluator.not_a_content_type=\u6307\u5B9A\u5C5E\u6027\u7684\u7C7B\u578B\u4E0D\u662F\u5185\u5BB9\uFF0C\u6240\u4EE5\u4E0D\u80FD\u6BD4\u8F83 MIME \u7C7B\u578B\u3002 +compare_mime_type_evaluator.no_property_definition_found=\u65E0\u6CD5\u627E\u5230\u6307\u5B9A\u5C5E\u6027\u7684\u5B9A\u4E49\uFF0C\u56E0\u6B64\u4E0D\u80FD\u6BD4\u8F83 MIME \u7C7B\u578B\u3002 diff --git a/config/alfresco/messages/activiti-engine-messages_zh_CN.properties b/config/alfresco/messages/activiti-engine-messages_zh_CN.properties new file mode 100755 index 0000000000..a396e677be --- /dev/null +++ b/config/alfresco/messages/activiti-engine-messages_zh_CN.properties @@ -0,0 +1,54 @@ +activiti.engine.mandatory.properties.missing=\u672A\u63D0\u4F9B\u5FC5\u9700\u7684\u4EFB\u52A1\u5C5E\u6027\uFF01 {0} +activiti.engine.deploy.workflow.error=\u90E8\u7F72\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.is.workflow.deployed.error=\u786E\u5B9A\u662F\u5426\u5DF2\u90E8\u7F72\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.undeploy.workflow.error=\u53D6\u6D88\u90E8\u7F72\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 {0} \u5931\u8D25\u3002 +activiti.engine.undeploy.workflow.unexisting.error=\u53D6\u6D88\u90E8\u7F72\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 {0} \u5931\u8D25\u3002 +activiti.engine.get.workflow.definition.error=\u68C0\u7D22\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.get.workflow.definition.by.id.error=\u68C0\u7D22 ID {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.get.workflow.definition.by.name.error=\u68C0\u7D22\u540D\u79F0 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.get.all.workflow.definitions.by.name.error=\u68C0\u7D22\u5DE5\u4F5C\u6D41\u7A0B {0} \u7684\u6240\u6709\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.get.workflow.definition.image.error=\u68C0\u7D22 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u56FE\u50CF\u5931\u8D25\u3002 +activiti.engine.get.workflow.definition.unexisting.image.error=\u68C0\u7D22 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49\u56FE\u50CF\u5931\u8D25\uFF0C\u8BE5\u5B9A\u4E49\u4E0D\u5B58\u5728\u3002 +activiti.engine.get.task.definitions.error=\u68C0\u7D22\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.get.process.definition.error=\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 {0} \u4E0D\u5B58\u5728\u3002 +activiti.engine.start.workflow.error=\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B {0} \u5931\u8D25\u3002 +activiti.engine.start.workflow.no.start.task.error=\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B {0} \u5931\u8D25\uFF0C\u5C1A\u672A\u4E3A\u8FDB\u7A0B\u5B9A\u4E49\u5B9A\u4E49\u4EFB\u4F55\u542F\u52A8\u4EFB\u52A1\u3002 +activiti.engine.get.workflows.error=\u68C0\u7D22\u5B9A\u4E49 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B\u5931\u8D25\u3002 +activiti.engine.get.active.workflows.error=\u68C0\u7D22\u5B9A\u4E49 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B\u5931\u8D25\u3002 +activiti.engine.get.completed.workflows.error=\u68C0\u7D22\u5B9A\u4E49 {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B\u5931\u8D25\u3002 +activiti.engine.get.workflow.instance.by.id.error=\u68C0\u7D22 ID \u4E3A {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B\u5931\u8D25\u3002 +activiti.engine.get.process.instance.error=\u4E0D\u5B58\u5728 ID \u4E3A {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B\u3002 +activiti.engine.get.workflow.paths.error=\u68C0\u7D22\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {0} \u7684\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84\u5931\u8D25\u3002 +activiti.engine.get.path.properties.error=\u68C0\u7D22\u8DEF\u5F84 {0} \u7684\u5C5E\u6027\u5931\u8D25\u3002 +activiti.engine.cancel.workflow.error=\u53D6\u6D88\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {0} \u5931\u8D25\u3002 +activiti.engine.cancel.unexisting.workflow.error=\u53D6\u6D88\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {0} \u5931\u8D25\u3002 +activiti.engine.delete.workflow.error=\u5220\u9664\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {0} \u5931\u8D25\u3002 +activiti.engine.delete.unexisting.workflow.error=\u5220\u9664\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {0} \u5931\u8D25\u3002 +activiti.engine.signal.transition.error=\u4ECE\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84 {1} \u53D1\u9001\u8F6C\u6362 {0} \u7684\u4FE1\u53F7\u5931\u8D25\u3002 +activiti.engine.event.unsupported=\u4E0D\u652F\u6301\u5728 Activiti \u5F15\u64CE\u5185\u8FD0\u884C\u7684 WorkflowPaths \u4E0A\u89E6\u53D1\u4E8B\u4EF6\u3002 +activiti.engine.fire.event.error=\u5728\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84 {1} \u4E0A\u89E6\u53D1\u4E8B\u4EF6 {0} \u5931\u8D25\u3002 +activiti.engine.get.tasks.for.path.error=\u68C0\u7D22\u6307\u6D3E\u7ED9\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84 {0} \u7684\u4EFB\u52A1\u5931\u8D25\u3002 +activiti.engine.get.timers.error=\u65E0\u6CD5\u68C0\u7D22\u5DE5\u4F5C\u6D41\u7A0B {0} \u7684\u4EFB\u4F55\u8BA1\u65F6\u5668\u3002 +activiti.engine.find.completed.task.instances.error=\u68C0\u7D22\u64CD\u4F5C\u4EBA\u5458 {0} \u7684\u5DF2\u5B8C\u6210\u4EFB\u52A1\u5B9E\u4F8B\u5217\u8868\u5931\u8D25\u3002 +activiti.engine.get.assigned.tasks.error=\u68C0\u7D22\u6307\u6D3E\u7ED9\u72B6\u6001\u4E3A {1} \u7684\u6388\u6743 {0} \u7684\u4EFB\u52A1\u5931\u8D25\u3002 +activiti.engine.get.pooled.tasks.error=\u68C0\u7D22\u6388\u6743 {0} \u7684\u5165\u6C60\u4EFB\u52A1\u5931\u8D25\u3002 +activiti.engine.query.tasks.error=\u67E5\u8BE2\u4EFB\u52A1\u5931\u8D25\u3002 \u67E5\u8BE2\uFF1A{0}\u3002 +activiti.engine.get.task.instance.error=\u4EFB\u52A1\u5B9E\u4F8B {0} \u4E0D\u5B58\u5728\u3002 +activiti.engine.update.task.error=\u66F4\u65B0\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 {0} \u5931\u8D25\u3002 +activiti.engine.update.task.unexisting.error=\u66F4\u65B0\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 {0} \u5931\u8D25\uFF0C\u6B64\u4EFB\u52A1\u4E0D\u5B58\u5728\u3002 +activiti.engine.update.starttask.illegal.error=\u66F4\u65B0\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 {0} \u5931\u8D25\uFF0C\u4E0D\u80FD\u5728 Activiti \u4E2D\u66F4\u65B0\u542F\u52A8\u4EFB\u52A1\u3002 +activiti.engine.end.task.invalid.transition=\u8F6C\u6362 {0} \u5BF9\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 {1} \u65E0\u6548\uFF0C\u4EC5\u5141\u8BB8\u8F6C\u6362 {2}\u3002 +activiti.engine.end.task.unexisting.error=\u4E3A\u4EFB\u52A1 {0} \u53D1\u9001\u8F6C\u6362\u4FE1\u53F7\u5931\u8D25\uFF0C\u6B64\u4EFB\u52A1\u4E0D\u5B58\u5728\u3002 +activiti.engine.end.task.error=\u4ECE\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 {1} \u53D1\u9001\u8F6C\u6362 {0} \u7684\u4FE1\u53F7\u5931\u8D25\u3002 +activiti.engine.get.task.by.id.error=\u68C0\u7D22\u4EFB\u52A1 {0} \u5931\u8D25\u3002 +activiti.engine.compile.process.definition.zip.error=\u89E3\u6790\u6765\u81EA Activiti zip \u5B58\u6863\u6D41\u7684\u8FDB\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.compile.process.definition.xml.error=\u89E3\u6790\u6765\u81EA Activiti xml \u6D41\u7684\u8FDB\u7A0B\u5B9A\u4E49\u5931\u8D25\u3002 +activiti.engine.compile.process.definition.unsupported.error=\u89E3\u6790\u8FDB\u7A0B\u5B9A\u4E49\u5931\u8D25 - MIME \u7C7B\u578B {0} \u4E0D\u53D7\u652F\u6301 +activiti.engine.get.activiti.id.error=ID {0} \u7684\u683C\u5F0F\u65E0\u6548\u3002 +activiti.engine.get.workflow.token.invalid=\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84 {0} \u65E0\u6548\u3002 +activiti.engine.get.workflow.token.is.null=\u5DE5\u4F5C\u6D41\u7A0B\u8DEF\u5F84 {0} \u4E0D\u5B58\u5728\u3002 +activiti.engine.set.task.properties.invalid.value=\u503C {0} \u5BF9\u4EFB\u52A1\u5C5E\u6027 {1} \u65E0\u6548\u3002 +activiti.engine.package.already.associated.error=\u65E0\u6CD5\u5C06\u5DE5\u4F5C\u6D41\u7A0B\u5305 {0} \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {1} \u5173\u8054\uFF0C\u56E0\u4E3A\u6B64\u5305\u5DF2\u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {2} \u5173\u8054\u3002 +activiti.engine.convert.value.error=\u65E0\u6CD5\u5C06 Activiti \u503C {0} \u8F6C\u6362\u4E3A Alfresco \u503C\uFF0C\u56E0\u4E3A\u6B64\u503C\u4E0D\u53EF\u5E8F\u5217\u5316\u3002 +activiti.engine.get.company.home.invalid=\u516C\u53F8\u4E3B\u8DEF\u5F84 {0} \u65E0\u6548\u3002 +activiti.engine.get.company.home.multiple=\u516C\u53F8\u4E3B\u8DEF\u5F84 {0} \u65E0\u6548\u3002 \u5E94\u8BE5\u6709 1 \u4E2A\u5339\u914D\u9879\uFF0C\u7ED3\u679C\u627E\u5230\u4E86 {1} \u4E2A\u5339\u914D\u9879\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/activities-service_zh_CN.properties b/config/alfresco/messages/activities-service_zh_CN.properties new file mode 100755 index 0000000000..76a11bdd06 --- /dev/null +++ b/config/alfresco/messages/activities-service_zh_CN.properties @@ -0,0 +1,3 @@ +# Activities (Activity Service / Feeds) + +activities.feed.notifier.email.subject=Alfresco {0}\uFF1A\u6700\u8FD1\u7684\u6D3B\u52A8 \ No newline at end of file diff --git a/config/alfresco/messages/activity-list_zh_CN.properties b/config/alfresco/messages/activity-list_zh_CN.properties new file mode 100755 index 0000000000..f3a8a748b1 --- /dev/null +++ b/config/alfresco/messages/activity-list_zh_CN.properties @@ -0,0 +1 @@ +# dummy file to allow repository context (activities feed notification) to start without slingshot - will be overwritten by build \ No newline at end of file diff --git a/config/alfresco/messages/application-model_zh_CN.properties b/config/alfresco/messages/application-model_zh_CN.properties new file mode 100755 index 0000000000..915fc0f4ee --- /dev/null +++ b/config/alfresco/messages/application-model_zh_CN.properties @@ -0,0 +1,42 @@ +# Display labels for System Model + +app_applicationmodel.description=Alfresco \u5E94\u7528\u7A0B\u5E8F\u6A21\u578B + +app_applicationmodel.type.app_glossary.title=\u6570\u636E\u5B57\u5178 +app_applicationmodel.type.app_glossary.description=\u6570\u636E\u5B57\u5178 + +app_applicationmodel.type.app_configurations.title=\u914D\u7F6E +app_applicationmodel.type.app_configurations.description=\u914D\u7F6E + +app_applicationmodel.aspect.app_uifacets.title=UI \u65B9\u9762 +app_applicationmodel.aspect.app_uifacets.description=UI \u65B9\u9762 +app_applicationmodel.property.app_icon.title=\u56FE\u6807 +app_applicationmodel.property.app_icon.description=\u56FE\u6807 + +app_applicationmodel.aspect.app_inlineeditable.title=\u53EF\u76F4\u63A5\u7F16\u8F91 +app_applicationmodel.aspect.app_inlineeditable.description=\u53EF\u76F4\u63A5\u7F16\u8F91 +app_applicationmodel.property.app_editInline.title=\u76F4\u63A5\u7F16\u8F91 +app_applicationmodel.property.app_editInline.description=\u76F4\u63A5\u7F16\u8F91 + +app_applicationmodel.aspect.app_workflow.title=\u5DE5\u4F5C\u6D41\u7A0B +app_applicationmodel.aspect.app_workflow.description=\u5DE5\u4F5C\u6D41\u7A0B + +app_applicationmodel.aspect.app_simpleworkflow.title=\u5DE5\u4F5C\u6D41\u7A0B +app_applicationmodel.aspect.app_simpleworkflow.description=\u5DE5\u4F5C\u6D41\u7A0B +app_applicationmodel.property.app_approveStep.title=\u6279\u51C6\u6B65\u9AA4 +app_applicationmodel.property.app_approveStep.description=\u6279\u51C6\u6B65\u9AA4 +app_applicationmodel.property.app_approveFolder.title=\u6279\u51C6\u6587\u4EF6\u5939 +app_applicationmodel.property.app_approveFolder.description=\u6279\u51C6\u6587\u4EF6\u5939 +app_applicationmodel.property.app_approveMove.title=\u79FB\u52A8\u6216\u590D\u5236 +app_applicationmodel.property.app_approveMove.description=\u79FB\u52A8\u6216\u590D\u5236 +app_applicationmodel.property.app_rejectStep.title=\u62D2\u7EDD\u6B65\u9AA4 +app_applicationmodel.property.app_rejectStep.description=\u62D2\u7EDD\u6B65\u9AA4 +app_applicationmodel.property.app_rejectFolder.title=\u62D2\u7EDD\u6587\u4EF6\u5939 +app_applicationmodel.property.app_rejectFolder.description=\u62D2\u7EDD\u6587\u4EF6\u5939 +app_applicationmodel.property.app_rejectMove.title=\u79FB\u52A8\u6216\u590D\u5236 +app_applicationmodel.property.app_rejectMove.description=\u79FB\u52A8\u6216\u590D\u5236 + +app_applicationmodel.aspect.app_configurable.title=\u53EF\u914D\u7F6E +app_applicationmodel.aspect.app_configurable.description=\u53EF\u914D\u7F6E +app_applicationmodel.association.app_configurations.title=\u914D\u7F6E +app_applicationmodel.association.app_configurations.description=\u914D\u7F6E diff --git a/config/alfresco/messages/avm-messages_zh_CN.properties b/config/alfresco/messages/avm-messages_zh_CN.properties new file mode 100755 index 0000000000..1d72402645 --- /dev/null +++ b/config/alfresco/messages/avm-messages_zh_CN.properties @@ -0,0 +1,9 @@ +# AVM related messages + +expiredcontent.workflow.title=''{0}'' \u4E2D\u7684\u5DF2\u5230\u671F\u5185\u5BB9 +avmlockservice.locked=\u60A8\u65E0\u6743\u8BBF\u95EE ''{0}''\uFF0C\u5F53\u524D\u5DF2\u88AB\u7528\u6237 ''{1}'' \u9501\u5B9A\u3002 +avmlockservice.accessdenied=\u7528\u6237 ''{0}'' \u5C1D\u8BD5\u5728\u4E0D\u5177\u6709\u5199\u6743\u9650\u7684\u60C5\u51B5\u4E0B\u9501\u5B9A\u5DE5\u4F5C\u6D41\u7A0B\u5E93\u4E2D\u7684\u8282\u70B9\u3002 +testserver.taken=\u60A8\u9009\u5B9A\u7684\u6D4B\u8BD5\u670D\u52A1\u5668 ''{0}'' \u5DF2\u5206\u914D\u7ED9\u53E6\u4E00\u4F4D\u7528\u6237\uFF1B\u5982\u679C\u53EF\u80FD\uFF0C\u8BF7\u9009\u62E9\u5176\u4ED6\u670D\u52A1\u5668\u5E76\u91CD\u8BD5\u3002 + +avm.cycle.create=\u5C06\u521B\u5EFA\u5FAA\u73AF\u3002 +avm.cycle.lookup=\u5FAA\u73AF\u67E5\u627E\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties b/config/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties new file mode 100755 index 0000000000..1a7269f6c2 --- /dev/null +++ b/config/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties @@ -0,0 +1,14 @@ +content.template.calculates_if_the_document=\u8BA1\u7B97\u662F\u5426\u5DF2\u4E3A\u6587\u6863\u5E94\u7528\u4E86\u53EF\u672C\u5730\u5316\u5207\u9762 +content.template.displays_useful_information=\u663E\u793A\u6709\u5173\u5F53\u524D\u6587\u6863\u7684\u6709\u7528\u4FE1\u606F +content.template.displays_a_list_of_the_documents=\u663E\u793A\u5F53\u524D\u7528\u6237\u4E3B\u7A7A\u95F4\u5185\u7684\u6587\u6863\u5217\u8868 +content.template.displays_a_list_of_spaces=\u663E\u793A\u5F53\u524D\u7528\u6237\u4E3B\u7A7A\u95F4\u5185\u7684\u7A7A\u95F4\u5217\u8868 +content.template.shows_a_simple_summary_page=\u663E\u793A\u6709\u5173\u5F53\u524D\u7528\u6237\u53CA\u5176\u4E3B\u7A7A\u95F4\u7684\u7B80\u5355\u6458\u8981\u9875 +content.template.calculates_if_the_document_has=\u8BA1\u7B97\u662F\u5426\u5DF2\u4E3A\u6587\u6863\u5E94\u7528\u4E86\u53EF\u7FFB\u8BD1\u5207\u9762 +content.template.displays_a_list_of_the_documents_in_the_current_space=\u663E\u793A\u5F53\u524D\u7A7A\u95F4\u4E2D\u8FC7\u53BB 7 \u5929\u5185\u521B\u5EFA\u6216\u4FEE\u6539\u7684\u6587\u6863\u5217\u8868 +content.template.example_of_various_lists=\u6587\u6863\u3001\u7A7A\u95F4\u548C\u5F53\u524D\u7528\u6237\u76F8\u5173\u6458\u8981\u4FE1\u606F\u7684\u5404\u79CD\u5217\u8868\u793A\u4F8B +content.template.displays_a_list_of_the_documents_in_the_current_user_Home_Space=\u663E\u793A\u5F53\u524D\u7528\u6237\u4E3B\u7A7A\u95F4\u5185\u7684\u6587\u6863\u5217\u8868\u3002 \u6587\u672C\u6587\u6863\u7684\u5185\u5BB9\u76F4\u63A5\u663E\u793A\uFF0C\u800C JPG \u5185\u5BB9\u5219\u663E\u793A\u4E3A\u5C0F\u578B\u7F29\u7565\u56FE\u3002 +content.template.displays_the_audit_trail=\u663E\u793A\u67D0\u4E2A\u5BF9\u8C61\u7684\u5BA1\u6838\u8BB0\u5F55\u3002 +email.template.email_template_for_notifying_users=\u89C4\u5219\u6216\u64CD\u4F5C\u4E2D\u7528\u4E8E\u901A\u77E5\u7528\u6237\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +email.template.email_template_for_notifying_users_of_an_Invite=\u7528\u4E8E\u901A\u77E5\u7528\u6237\u83B7\u9080\u8BBF\u95EE\u67D0\u4E2A\u7A7A\u95F4\u6216\u6587\u6863\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +rss.template.renders_a_valid_rss=\u5448\u73B0\u4E00\u4E2A\u6709\u6548\u7684 RSS2.0 XML \u6587\u6863\uFF0C\u5176\u4E2D\u663E\u793A\u5F53\u524D\u7A7A\u95F4\u4E2D\u8FC7\u53BB 7 \u5929\u5185\u521B\u5EFA\u6216\u4FEE\u6539\u7684\u6587\u6863\u3002 \u6B64\u6A21\u677F\u5728\u4F7F\u7528\u4E4B\u524D\u5E94\u8FDB\u884C\u914D\u7F6E\uFF0C\u4EE5\u4FBF\u4F7F\u7528\u9002\u5F53\u7684\u670D\u52A1\u5668\u548C\u7AEF\u53E3\u3002 +rss.template.rss_recent_docs=RSS \u6700\u8FD1\u6587\u6863 \ No newline at end of file diff --git a/config/alfresco/messages/bootstrap-example-javascripts_zh_CN.properties b/config/alfresco/messages/bootstrap-example-javascripts_zh_CN.properties new file mode 100755 index 0000000000..559fd2579e --- /dev/null +++ b/config/alfresco/messages/bootstrap-example-javascripts_zh_CN.properties @@ -0,0 +1,14 @@ +# Javascript Exapmples Localization + +javascripts.example.backup.title=\u5907\u4EFD\u811A\u672C +javascripts.example.backup.description=\u7B80\u5355\u6587\u6863\u5907\u4EFD\u811A\u672C +javascripts.example.test.title=\u793A\u4F8B\u6D4B\u8BD5\u811A\u672C +javascripts.example.test.description=\u5404\u79CD API \u8C03\u7528\u7684\u793A\u4F8B +javascripts.example.backupandlog.title=\u5907\u4EFD\u548C\u8BB0\u5F55\u811A\u672C +javascripts.example.backupandlog.description=\u5907\u4EFD\u6587\u4EF6\u5E76\u8BB0\u5F55\u65E5\u671F\u548C\u65F6\u95F4 +javascripts.example.appendcopyright.title=\u4E3A\u6587\u4EF6\u9644\u52A0\u7248\u6743\u4FE1\u606F +javascripts.example.appendcopyright.description=\u4E3A\u6587\u672C\u6587\u4EF6\u6216 HTML \u6587\u4EF6\u9644\u52A0\u7248\u6743\u4FE1\u606F\u884C +javascripts.example.testreturnvalue.title=\u8FD4\u56DE\u503C\u793A\u4F8B +javascripts.example.testreturnvalue.description=\u4E3A\u547D\u4EE4 servlet \u4ECE\u811A\u672C\u8FD4\u56DE\u503C +javascripts.example.alfrescodocs.title=Alfresco Lucene \u641C\u7D22 +javascripts.example.alfrescodocs.description=\u641C\u7D22\u5E76\u8BB0\u5F55\u5176\u4E2D\u5305\u542B Alfresco \u6587\u672C\u7684\u6240\u6709\u6587\u6863 diff --git a/config/alfresco/messages/bootstrap-imapScripts_zh_CN.properties b/config/alfresco/messages/bootstrap-imapScripts_zh_CN.properties new file mode 100755 index 0000000000..d705b8691b --- /dev/null +++ b/config/alfresco/messages/bootstrap-imapScripts_zh_CN.properties @@ -0,0 +1,12 @@ +imap.command_processor.name=command-processor.js +imap.command_processor.title=\u547D\u4EE4\u5904\u7406\u5668 +imap.command_processor.description=\u7535\u5B50\u90AE\u4EF6\u547D\u4EE4\u5904\u7406\u5668\u811A\u672C + +imap.command_search.name=command-search.js +imap.command_search.title=\u641C\u7D22\u547D\u4EE4 +imap.command_search.description=\u7535\u5B50\u90AE\u4EF6\u641C\u7D22\u547D\u4EE4\u811A\u672C + +imap.command_utils.name=command-utils.js +imap.command_utils.title=\u547D\u4EE4\u5B9E\u7528\u7A0B\u5E8F +imap.command_utils.description=\u7535\u5B50\u90AE\u4EF6\u547D\u4EE4\u5B9E\u7528\u7A0B\u5E8F + \ No newline at end of file diff --git a/config/alfresco/messages/bootstrap-javascripts_zh_CN.properties b/config/alfresco/messages/bootstrap-javascripts_zh_CN.properties new file mode 100755 index 0000000000..dc1ca4d253 --- /dev/null +++ b/config/alfresco/messages/bootstrap-javascripts_zh_CN.properties @@ -0,0 +1,17 @@ +javascripts.backup.description=\u7B80\u5355\u6587\u6863\u5907\u4EFD\u811A\u672C +javascripts.backup.title=\u5907\u4EFD\u811A\u672C + +javascripts.examle_test.description=\u5404\u79CD Alfresco API \u8C03\u7528\u7684\u793A\u4F8B +javascripts.examle_test.title=\u793A\u4F8B\u6D4B\u8BD5\u811A\u672C + +javascripts.backup_and_log.description=\u5907\u4EFD\u6587\u4EF6\u5E76\u8BB0\u5F55\u65E5\u671F\u548C\u65F6\u95F4 +javascripts.backup_and_log.title=\u5907\u4EFD\u548C\u8BB0\u5F55\u811A\u672C + +javascripts.append_copyright.description=\u4E3A\u6587\u672C\u6587\u4EF6\u6216 HTML \u6587\u4EF6\u9644\u52A0\u7248\u6743\u4FE1\u606F\u884C +javascripts.append_copyright.title=\u4E3A\u6587\u4EF6\u9644\u52A0\u7248\u6743\u4FE1\u606F + +javascripts.lucene_search.description=\u641C\u7D22\u548C\u8BB0\u5F55\u5176\u4E2D\u5305\u542B Alfresco \u6587\u672C\u7684\u6240\u6709\u6587\u6863 +javascripts.lucene_search.title=Alfresco Lucene \u641C\u7D22 + +javascripts.return_value.description=\u4E3A\u547D\u4EE4 servlet \u4ECE\u811A\u672C\u8FD4\u56DE\u503C +javascripts.return_value.title=\u8FD4\u56DE\u503C\u793A\u4F8B \ No newline at end of file diff --git a/config/alfresco/messages/bootstrap-readme-template_zh_CN.properties b/config/alfresco/messages/bootstrap-readme-template_zh_CN.properties new file mode 100755 index 0000000000..9ef1d4ce6b --- /dev/null +++ b/config/alfresco/messages/bootstrap-readme-template_zh_CN.properties @@ -0,0 +1,2 @@ +readme.template.description=\u663E\u793A\u81EA\u8FF0\u6587\u4EF6\uFF08\u540D\u79F0\u4E3A readme.html \u6216 readme.ftl\uFF09\u7684\u5185\u5BB9 +readme.template.title=readme.ftl diff --git a/config/alfresco/messages/bootstrap-spaces_zh_CN.properties b/config/alfresco/messages/bootstrap-spaces_zh_CN.properties new file mode 100755 index 0000000000..b872a61205 --- /dev/null +++ b/config/alfresco/messages/bootstrap-spaces_zh_CN.properties @@ -0,0 +1,163 @@ +# Labels used in bootstrap Space definitions + +spaces.company_home.name=\u516C\u53F8\u4E3B\u9875 +spaces.company_home.description=\u516C\u53F8\u7684\u6839\u7A7A\u95F4 + +spaces.dictionary.name=\u6570\u636E\u5B57\u5178 +spaces.dictionary.description=\u7528\u6237\u7BA1\u7406\u7684\u5B9A\u4E49 + +spaces.imapConfig.name=IMAP \u914D\u7F6E +spaces.imapConfig.description=IMAP \u914D\u7F6E + +spaces.imap_templates.name=\u6A21\u677F +spaces.imap_templates.description=IMAP \u6240\u751F\u6210\u6D88\u606F\u7684\u6A21\u677F + +spaces.imap_templates.emailbody_textplain.description=\u7528\u4E8E\u751F\u6210"multipart/alternative" IMAP \u6D88\u606F\u6B63\u6587\uFF08"text/plain"\u90E8\u5206\uFF09\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F\u3002 +spaces.imap_templates.emailbody_texthtml.description=\u7528\u4E8E\u751F\u6210"multipart/alternative" IMAP \u6D88\u606F\u6B63\u6587\uFF08"text/html"\u90E8\u5206\uFF09\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F\u3002 + +spaces.emailActions.name=\u7535\u5B50\u90AE\u4EF6\u64CD\u4F5C +spaces.emailActions.description=\u7535\u5B50\u90AE\u4EF6\u64CD\u4F5C + +spaces.searchAction.name=\u641C\u7D22 +spaces.searchAction.description=\u641C\u7D22 + +spaces.templates.name=\u7A7A\u95F4\u6A21\u677F +spaces.templates.description=\u7A7A\u95F4\u6587\u4EF6\u5939\u6A21\u677F + +spaces.templates.content.name=\u6F14\u793A\u6A21\u677F +spaces.templates.content.description=\u6F14\u793A\u6A21\u677F + +spaces.templates.email.name=\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.templates.email.description=\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.invite_templates.email.name=\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.invite_templates.email.description=\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.notify_templates.email.name=\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.notify_templates.email.description=\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.rss.name=RSS \u6A21\u677F +spaces.templates.rss.description=RSS \u6A21\u677F + +spaces.actions.scheduled_actions.name=\u8BA1\u5212\u7684\u64CD\u4F5C +spaces.actions.scheduled_actions.description=\u8BA1\u5212\u4F55\u65F6\u6267\u884C\u6301\u4E45\u5316\u64CD\u4F5C + +spaces.publishing.root.name=\u53D1\u5E03\u6839 +spaces.publishing.root.description=PublishingService \u7684\u6839\u6587\u4EF6\u5939\u3002 + +spaces.rendition.rendering_actions.name=\u5448\u73B0\u64CD\u4F5C\u7A7A\u95F4 +spaces.rendition.rendering_actions.description=\u7CFB\u7EDF\u7528\u4E8E\u4F7F\u5448\u73B0\u64CD\u4F5C\u6301\u4E45\u5316\u7684\u7A7A\u95F4\u3002 + +spaces.replication.replication_actions.name=\u590D\u5236\u64CD\u4F5C\u7A7A\u95F4 +spaces.replication.replication_actions.description=\u7CFB\u7EDF\u7528\u4E8E\u4F7F\u590D\u5236\u64CD\u4F5C\u6301\u4E45\u5316\u7684\u7A7A\u95F4\u3002 + +spaces.savedsearches.name=\u4FDD\u5B58\u7684\u641C\u7D22 +spaces.savedsearches.description=\u4FDD\u5B58\u7684\u641C\u7D22 + +spaces.guest_home.name=\u8BBF\u5BA2\u4E3B\u9875 +spaces.guest_home.description=\u8BBF\u5BA2\u6839\u7A7A\u95F4 + +spaces.scripts.name=\u811A\u672C +spaces.scripts.description=JavaScript \u6587\u4EF6 + +spaces.scripts.example.workflow.name=start-pooled-review-workflow.js +spaces.scripts.example.workflow.title=\u542F\u52A8\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6\u5DE5\u4F5C\u6D41\u7A0B +spaces.scripts.example.workflow.description=\u4E3A\u6587\u6863\u6240\u5C5E\u7AD9\u70B9\u7684\u6240\u6709\u6210\u5458\u542F\u52A8\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6\u5DE5\u4F5C\u6D41\u7A0B + +spaces.wcm.name=Web \u9879\u76EE +spaces.wcm.description=Web \u5185\u5BB9\u7BA1\u7406\u7A7A\u95F4 + +spaces.wcm_content_forms.name=Web \u7A97\u4F53 +spaces.wcm_content_forms.description=Web \u5185\u5BB9\u7A97\u4F53 + +spaces.user_homes.name=\u7528\u6237\u4E3B\u7A7A\u95F4 +spaces.user_homes.description=\u7528\u6237\u4E3B\u7A7A\u95F4 + +spaces.content_forms.name=\u7A97\u4F53 +spaces.content_forms.description=\u5185\u5BB9\u7A97\u4F53 + +spaces.sites.name=\u7AD9\u70B9 +spaces.sites.description=\u7AD9\u70B9\u5408\u4F5C\u7A7A\u95F4 + +spaces.templates.email.invite.name=\u9080\u8BF7 +spaces.templates.email.invite.description=\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.imap_home.name=IMAP \u4E3B\u7A7A\u95F4 +spaces.imap_home.description=IMAP \u4E3B\u7A7A\u95F4 + +spaces.templates.email.invite1.name=\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.templates.email.invite1.description=\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.email.notify.name=\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.templates.email.notify.description=\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.email.generate_the_invite_email.description=\u7528\u4E8E\u4E3A Alfresco Share \u751F\u6210\u9080\u8BF7\u7535\u5B50\u90AE\u4EF6\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.email.generate_the_wf_notification_email.description=\u7528\u4E8E\u901A\u77E5\u7528\u6237\u6709\u5173\u65B0\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1\u4E8B\u9879\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +email.template.email_template_for_notifying_users=\u89C4\u5219\u6216\u64CD\u4F5C\u4E2D\u7528\u4E8E\u901A\u77E5\u7528\u6237\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +email.template.email_template_for_notifying_users.sample=\u89C4\u5219\u6216\u64CD\u4F5C\u4E2D\u7528\u4E8E\u901A\u77E5\u7528\u6237\u7684\u6837\u672C\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +email.template.email_template_for_notifying_users_of_an_Invite=\u7528\u4E8E\u901A\u77E5\u7528\u6237\u83B7\u9080\u8BBF\u95EE\u67D0\u4E2A\u7A7A\u95F4\u6216\u6587\u6863\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +email.templates.email_template_for_notifying_new_users=\u7528\u4E8E\u901A\u77E5\u65B0\u7528\u6237\u6709\u5173\u5176\u5E10\u6237\u4E8B\u9879\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.email.following.name=\u5173\u6CE8\u7535\u5B50\u90AE\u4EF6\u6A21\u677F +spaces.templates.email.following.description=\u5173\u6CE8\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +email.templates.email_template_for_following_notifications=\u7528\u4E8E\u751F\u6210\u5173\u6CE8\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +version.default=\u9ED8\u8BA4\u7248\u672C +version.french=\u6CD5\u8BED\u7248\u672C +version.german=\u5FB7\u8BED\u7248\u672C +version.italian=\u610F\u5927\u5229\u8BED\u7248\u672C +version.japanese=\u65E5\u8BED\u7248\u672C +version.spanish=\u897F\u73ED\u7259\u8BED\u7248\u672C +version.dutch=\u8377\u5170\u8BED\u7248\u672C + +spaces.web.client.extension.name=Web \u5BA2\u6237\u7AEF\u6269\u5C55 +spaces.web.client.extension.title=\u5B9A\u5236\u7684 Web \u5BA2\u6237\u7AEF +spaces.web.client.extension.description=\u5B9A\u5236\u7684 Web \u5BA2\u6237\u7AEF + +spaces.models.name=\u6A21\u578B +spaces.models.title=\u5B9A\u5236\u7684\u6A21\u578B +spaces.models.description=\u5B9A\u5236\u7684\u6A21\u578B + +spaces.messages.name=\u6D88\u606F +spaces.messages.title=\u5B9A\u5236\u7684\u6D88\u606F +spaces.messages.description=\u5B9A\u5236\u7684\u6D88\u606F + +spaces.workflow.definitions.name=\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 +spaces.workflow.definitions.title=\u5B9A\u5236\u7684\u5DE5\u4F5C\u6D41\u7A0B\u8FDB\u7A0B\u5B9A\u4E49 +spaces.workflow.definitions.description=\u5B9A\u5236\u7684\u5DE5\u4F5C\u6D41\u7A0B\u8FDB\u7A0B\u5B9A\u4E49 + +spaces.templates.email.activities.name=\u6D3B\u52A8 +spaces.templates.email.activities.description=\u6D3B\u52A8\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.templates.email.generate_the_activities_email.description=\u7528\u4E8E\u4E3A Alfresco Share \u751F\u6210\u6D3B\u52A8\u7535\u5B50\u90AE\u4EF6\u7684\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.transfers.name=\u4F20\u8F93 +spaces.transfers.title=\u4F20\u8F93 +spaces.transfers.description=\u4F20\u8F93\u5B50\u7CFB\u7EDF\u6240\u7528\u6587\u4EF6\u5939 + +spaces.transfer_groups.name=\u4F20\u8F93\u76EE\u6807\u7EC4 +spaces.transfer_groups.title=\u4F20\u8F93\u76EE\u6807\u7EC4 +spaces.transfer_groups.description=\u5305\u542B\u4F20\u8F93\u76EE\u6807\u7EC4\u7684\u6587\u4EF6\u5939 + +spaces.transfer_groups_default.name=\u9ED8\u8BA4\u7EC4 +spaces.transfer_groups_default.title=\u9ED8\u8BA4\u7EC4 +spaces.transfer_groups_default.description=\u8BF7\u5C06\u60A8\u7684\u4F20\u8F93\u76EE\u6807\u653E\u5728\u6B64\u6587\u4EF6\u5939\u4E2D + +spaces.transfer_temp.name=\u4E34\u65F6 +spaces.transfer_temp.title=\u4E34\u65F6 +spaces.transfer_temp.description=\u4F20\u8F93\u671F\u95F4\u7528\u4E8E\u5B58\u50A8\u4E34\u65F6\u8282\u70B9\u7684\u6587\u4EF6\u5939 + +spaces.inbound_transfer_records.name=\u5165\u7AD9\u4F20\u8F93\u8BB0\u5F55 +spaces.inbound_transfer_records.title=\u5165\u7AD9\u4F20\u8F93\u8BB0\u5F55 +spaces.inbound_transfer_records.description=\u5176\u4E2D\u5305\u542B\u5165\u7AD9\u4F20\u8F93\u8BB0\u5F55\u7684\u6587\u4EF6\u5939 + +spaces.templates.email.workflowNotification.name=\u5DE5\u4F5C\u6D41\u7A0B\u901A\u77E5 +spaces.templates.email.workflowNotification.description=\u5DE5\u4F5C\u6D41\u7A0B\u901A\u77E5\u7535\u5B50\u90AE\u4EF6\u6A21\u677F + +spaces.nodeTemplatesSpace.name=\u8282\u70B9\u6A21\u677F +spaces.nodeTemplatesSpace.description=Share \u7684\u6A21\u677F\u8282\u70B9 - \u65B0\u5EFA\u6587\u6863 diff --git a/config/alfresco/messages/bootstrap-templates_zh_CN.properties b/config/alfresco/messages/bootstrap-templates_zh_CN.properties new file mode 100755 index 0000000000..da4abbbe86 --- /dev/null +++ b/config/alfresco/messages/bootstrap-templates_zh_CN.properties @@ -0,0 +1,14 @@ +# Labels used in bootstrap Template definitions + +templates.space.project=\u8F6F\u4EF6\u5DE5\u7A0B\u9879\u76EE +templates.space.documentation=\u6587\u6863 +templates.space.drafts=\u8349\u7A3F +templates.space.pending_approval=\u5F85\u51B3\u6279\u51C6 +templates.space.published=\u5DF2\u53D1\u5E03 +templates.space.samples=\u6837\u672C +templates.document.system_overview.title=\u7CFB\u7EDF\u6982\u8FF0 +templates.document.system_overview.name=system-overview.html +templates.space.discussions=\u8BA8\u8BBA +templates.space.ui_design=UI \u8BBE\u8BA1 +templates.space.presentations=\u6F14\u793A +templates.space.quality_assurance=\u8D28\u91CF\u4FDD\u8BC1 \ No newline at end of file diff --git a/config/alfresco/messages/bootstrap-tutorial_zh_CN.properties b/config/alfresco/messages/bootstrap-tutorial_zh_CN.properties new file mode 100755 index 0000000000..3dc803917b --- /dev/null +++ b/config/alfresco/messages/bootstrap-tutorial_zh_CN.properties @@ -0,0 +1,9 @@ +# Labels used in bootstrap Tutorial definitions + +tutorial.space.name=Alfresco \u6559\u7A0B +tutorial.space.description=Alfresco \u5E94\u7528\u7A0B\u5E8F\u9010\u6B65\u6307\u5357 + +tutorial.document.name=Alfresco-Tutorial.pdf +tutorial.document.title=Alfresco \u6559\u7A0B +tutorial.document.description=\u5165\u95E8\u6307\u5357 + diff --git a/config/alfresco/messages/bootstrap-webScriptsExtensions_zh_CN.properties b/config/alfresco/messages/bootstrap-webScriptsExtensions_zh_CN.properties new file mode 100755 index 0000000000..44ef35233b --- /dev/null +++ b/config/alfresco/messages/bootstrap-webScriptsExtensions_zh_CN.properties @@ -0,0 +1,5 @@ +webscriptsextentions.customized_web_scripts=\u5B9A\u5236\u7684 Web \u811A\u672C +webscriptsextentions.url_addressable_web_service_extensions=URL \u53EF\u5BFB\u5740 Web \u670D\u52A1\u6269\u5C55 +webscriptsextentions.web_scripts_extensions=Web \u811A\u672C\u6269\u5C55 +webscriptsextentions.how_to_customize_an_existing_web_script=\u73B0\u6709 Web \u811A\u672C\u7684\u5B9A\u5236\u65B9\u6CD5 + diff --git a/config/alfresco/messages/bootstrap-webScripts_zh_CN.properties b/config/alfresco/messages/bootstrap-webScripts_zh_CN.properties new file mode 100755 index 0000000000..ca1f700b44 --- /dev/null +++ b/config/alfresco/messages/bootstrap-webScripts_zh_CN.properties @@ -0,0 +1,4 @@ +webscripts.url_addressable_web_services=URL \u53EF\u5BFB\u5740 Web \u670D\u52A1 +webscripts.web_scripts=Web \u811A\u672C +webscripts.what_are_web_scripts=Web \u811A\u672C\u662F\u4EC0\u4E48\uFF1F\u5982\u4F55\u5F00\u53D1 Web \u811A\u672C\uFF1F + diff --git a/config/alfresco/messages/bpm-messages_zh_CN.properties b/config/alfresco/messages/bpm-messages_zh_CN.properties new file mode 100755 index 0000000000..b69d1b4d3d --- /dev/null +++ b/config/alfresco/messages/bpm-messages_zh_CN.properties @@ -0,0 +1,91 @@ +# Display labels for base Business Process Model + +bpm_businessprocessmodel.title=\u4E1A\u52A1\u6D41\u7A0B\u6A21\u578B +bpm_businessprocessmodel.description=\u6240\u6709\u4E1A\u52A1\u6D41\u7A0B\u7684\u57FA\u672C\u5B9A\u4E49 + +# Default transition +bpm_businessprocessmodel.transition.title=\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1 +bpm_businessprocessmodel.transition.description=\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1 + +# Base Task +bpm_businessprocessmodel.type.bpm_task.title=\u4EFB\u52A1 +bpm_businessprocessmodel.type.bpm_task.description=\u4EFB\u52A1 +bpm_businessprocessmodel.property.bpm_taskId.title=\u6807\u8BC6\u7B26 +bpm_businessprocessmodel.property.bpm_taskId.description=\u6807\u8BC6\u7B26 +bpm_businessprocessmodel.property.bpm_startDate.title=\u5F00\u59CB\u65E5\u671F +bpm_businessprocessmodel.property.bpm_startDate.description=\u5F00\u59CB\u65E5\u671F +bpm_businessprocessmodel.property.bpm_completionDate.title=\u5B8C\u6210\u65E5\u671F +bpm_businessprocessmodel.property.bpm_completionDate.description=\u5B8C\u6210\u65E5\u671F +bpm_businessprocessmodel.property.bpm_dueDate.title=\u622A\u6B62\u65E5\u671F +bpm_businessprocessmodel.property.bpm_dueDate.description=\u622A\u6B62\u65E5\u671F +bpm_businessprocessmodel.property.bpm_status.title=\u72B6\u6001 +bpm_businessprocessmodel.property.bpm_status.description=\u72B6\u6001 +bpm_businessprocessmodel.property.bpm_priority.title=\u4F18\u5148\u7EA7 +bpm_businessprocessmodel.property.bpm_priority.description=\u4F18\u5148\u7EA7 +bpm_businessprocessmodel.property.bpm_percentComplete.title=\u5B8C\u6210\u767E\u5206\u6BD4 +bpm_businessprocessmodel.property.bpm_percentComplete.description=\u5B8C\u6210\u767E\u5206\u6BD4 +bpm_businessprocessmodel.property.bpm_comment.title=\u8BC4\u8BBA +bpm_businessprocessmodel.property.bpm_comment.description=\u8BC4\u8BBA +bpm_businessprocessmodel.association.bpm_pooledActors.title=\u5165\u6C60\u7528\u6237 +bpm_businessprocessmodel.association.bpm_pooledActors.description=\u6C60 + +# Workflow Task +bpm_businessprocessmodel.type.bpm_workflowTask.title=\u5DE5\u4F5C\u6D41\u7A0B\u4EFB\u52A1 +bpm_businessprocessmodel.type.bpm_workflowTask.description=\u5DE5\u4F5C\u6D41\u7A0B\u6307\u6D3E\u7684\u4EFB\u52A1 +bpm_businessprocessmodel.property.bpm_workflowDefinitionId.title=\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 ID +bpm_businessprocessmodel.property.bpm_workflowDefinitionId.description=\u5DE5\u4F5C\u6D41\u7A0B\u5B9A\u4E49 ID +bpm_businessprocessmodel.property.bpm_workflowInstanceId.title=\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B ID +bpm_businessprocessmodel.property.bpm_workflowInstanceId.description=\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B ID +bpm_businessprocessmodel.property.bpm_context.title=\u4EFB\u52A1\u4E0A\u4E0B\u6587 +bpm_businessprocessmodel.property.bpm_context.description=\u5728\u5176\u4E2D\u6307\u6D3E\u4E86\u6B64\u4EFB\u52A1\u7684\u4E0A\u4E0B\u6587 +bpm_businessprocessmodel.property.bpm_description.title=\u8BF4\u660E +bpm_businessprocessmodel.property.bpm_description.description=\u9700\u5B58\u6863\u5185\u5BB9\u7684\u8BF4\u660E +bpm_businessprocessmodel.property.bpm_outcome.title=\u7ED3\u679C +bpm_businessprocessmodel.property.bpm_outcome.description=\u5DF2\u51B3\u5B9A\u5982\u4F55\u5B8C\u6210\u4EFB\u52A1 +bpm_businessprocessmodel.property.bpm_completedItems.title=\u5DF2\u5B8C\u6210\u9879 +bpm_businessprocessmodel.property.bpm_completedItems.description=\u6807\u8BB0\u4E3A\u5DF2\u5B8C\u6210\u7684\u5305\u9879 +bpm_businessprocessmodel.property.bpm_packageActionGroup.title=\u5305\u64CD\u4F5C +bpm_businessprocessmodel.property.bpm_packageActionGroup.description=\u53EF\u5BF9\u5DE5\u4F5C\u6D41\u7A0B\u5305\u6267\u884C\u7684\u64CD\u4F5C +bpm_businessprocessmodel.property.bpm_packageItemActionGroup.title=\u5305\u9879\u64CD\u4F5C +bpm_businessprocessmodel.property.bpm_packageItemActionGroup.description=\u53EF\u5BF9\u5DE5\u4F5C\u6D41\u7A0B\u5305\u9879\u884C\u7684\u64CD\u4F5C +bpm_businessprocessmodel.association.bpm_package.title=\u5185\u5BB9\u5305 +bpm_businessprocessmodel.association.bpm_package.description=\u7ECF\u8FC7\u5DE5\u4F5C\u6D41\u7A0B\u4F20\u9012\u7684\u5185\u5BB9\u96C6\u5408 +bpm_businessprocessmodel.aspect.bpm_workflowPackage.title=\u5DE5\u4F5C\u6D41\u7A0B\u5305 +bpm_businessprocessmodel.aspect.bpm_workflowPackage.description=\u7ECF\u8FC7\u5DE5\u4F5C\u6D41\u7A0B\u4F20\u9012\u7684\u5185\u5BB9\u96C6\u5408 + +#Activiti Workflow Start Task +bpm_businessprocessmodel.type.bpm_activitiStartTask.title=\u5DE5\u4F5C\u6D41\u7A0B\u542F\u52A8\u4EFB\u52A1 +bpm_businessprocessmodel.type.bpm_activitiStartTask.description=\u7528\u4E8E\u6536\u96C6\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B\u6240\u9700\u4FE1\u606F\u7684\u4EFB\u52A1 + +bpm_businessprocessmodel.type.bpm_startTask.title=\u5DE5\u4F5C\u6D41\u7A0B\u542F\u52A8\u4EFB\u52A1 +bpm_businessprocessmodel.type.bpm_startTask.description=\u7528\u4E8E\u6536\u96C6\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B\u6240\u9700\u4FE1\u606F\u7684\u4EFB\u52A1 +bpm_businessprocessmodel.property.bpm_workflowDescription.title=\u8BF4\u660E +bpm_businessprocessmodel.property.bpm_workflowDescription.description=\u8BF4\u660E +bpm_businessprocessmodel.property.bpm_workflowDueDate.title=\u5DE5\u4F5C\u6D41\u7A0B\u622A\u6B62\u65E5\u671F +bpm_businessprocessmodel.property.bpm_workflowDueDate.description=\u5DE5\u4F5C\u6D41\u7A0B\u622A\u6B62\u65E5\u671F +bpm_businessprocessmodel.property.bpm_workflowPriority.title=\u5DE5\u4F5C\u6D41\u7A0B\u4F18\u5148\u7EA7 +bpm_businessprocessmodel.property.bpm_workflowPriority.description=\u5DE5\u4F5C\u6D41\u7A0B\u4F18\u5148\u7EA7 +bpm_businessprocessmodel.property.bpm_sendEMailNotifications.title=\u53D1\u9001\u7535\u5B50\u90AE\u4EF6\u901A\u77E5 +bpm_businessprocessmodel.property.bpm_sendEMailNotifications.description=\u53D1\u9001\u7535\u5B50\u90AE\u4EF6\u901A\u77E5 +bpm_businessprocessmodel.association.bpm_assignee.title=\u5DE5\u4F5C\u6D41\u7A0B\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_assignee.description=\u5DE5\u4F5C\u6D41\u7A0B\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_assignees.title=\u5DE5\u4F5C\u6D41\u7A0B\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_assignees.description=\u5DE5\u4F5C\u6D41\u7A0B\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_groupAssignee.title=\u5DE5\u4F5C\u6D41\u7A0B\u7EC4\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_groupAssignee.description=\u5DE5\u4F5C\u6D41\u7A0B\u7EC4\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_groupAssignees.title=\u5DE5\u4F5C\u6D41\u7A0B\u7EC4\u88AB\u6307\u6D3E\u8005 +bpm_businessprocessmodel.association.bpm_groupAssignees.description=\u5DE5\u4F5C\u6D41\u7A0B\u7EC4\u88AB\u6307\u6D3E\u8005 + +# Error Messages +workflow.get.task.definition.metadata.error=\u67E5\u627E\u4EFB\u52A1\u7C7B\u578B\u5B9A\u4E49 {0} \u5931\u8D25\u3002 +workflow.package.already.associated.error=\u6B64\u8282\u70B9\u5DF2\u88AB\u7528\u4F5C\u5DE5\u4F5C\u6D41\u7A0B\u5305\uFF01 NodeRef\uFF1A{0} + +# List constraint display labels +listconstraint.bpm_allowedPriority.1=\u9AD8 +listconstraint.bpm_allowedPriority.2=\u4E2D +listconstraint.bpm_allowedPriority.3=\u4F4E +listconstraint.bpm_allowedStatus.Not\ Yet\ Started=\u5C1A\u672A\u5F00\u59CB +listconstraint.bpm_allowedStatus.In\ Progress=\u6B63\u5728\u8FDB\u884C +listconstraint.bpm_allowedStatus.On\ Hold= \u5DF2\u6682\u505C +listconstraint.bpm_allowedStatus.Cancelled=\u5DF2\u53D6\u6D88 +listconstraint.bpm_allowedStatus.Completed=\u5DF2\u5B8C\u6210 diff --git a/config/alfresco/messages/categories_zh_CN.properties b/config/alfresco/messages/categories_zh_CN.properties new file mode 100755 index 0000000000..61377ea32e --- /dev/null +++ b/config/alfresco/messages/categories_zh_CN.properties @@ -0,0 +1,6 @@ +message.changeCategoryName.success=\u5DF2\u6210\u529F\u66F4\u6539\u7C7B\u522B\u540D\u79F0 +message.changeCategoryName.solr.success=\u7C7B\u522B\u66F4\u65B0\u5DF2\u6210\u529F\u5165\u5217\u4E8E SOLR \u8FDB\u884C\u66F4\u6539\u3002 \u8BF7\u6CE8\u610F\uFF0C\u53EF\u80FD\u9700\u8981\u4E00\u6BB5\u65F6\u95F4\u624D\u80FD\u5B8C\u6210\u66F4\u65B0\uFF1B\u66F4\u65B0\u4E4B\u540E\uFF0C\u60A8\u9700\u8981\u5148\u5237\u65B0\uFF0C\u624D\u80FD\u770B\u5230\u66F4\u6539 +message.addCategory.success=\u5DF2\u6210\u529F\u6DFB\u52A0\u7C7B\u522B +message.addCategory.solr.success=\u65B0\u7C7B\u522B\u5DF2\u6210\u529F\u5165\u5217 SOLR \u8FDB\u884C\u6DFB\u52A0\u3002 \u8BF7\u6CE8\u610F\uFF0C\u53EF\u80FD\u9700\u8981\u4E00\u6BB5\u65F6\u95F4\u624D\u80FD\u5B8C\u6210\u6DFB\u52A0\uFF1B\u6DFB\u52A0\u4E4B\u540E\uFF0C\u60A8\u9700\u8981\u5148\u5237\u65B0\uFF0C\u624D\u80FD\u770B\u5230\u66F4\u6539 +message.removeCategory.success=\u5DF2\u6210\u529F\u79FB\u9664\u7C7B\u522B\u3002 +message.removeCategory.solr.success=\u7C7B\u522B\u5220\u9664\u5DF2\u6210\u529F\u5165\u5217 SOLR \u8FDB\u884C\u79FB\u9664\u3002 \u8BF7\u6CE8\u610F\uFF0C\u53EF\u80FD\u9700\u8981\u4E00\u6BB5\u65F6\u95F4\u624D\u80FD\u5B8C\u6210\u5220\u9664\uFF1B\u5220\u9664\u4E4B\u540E\uFF0C\u60A8\u9700\u8981\u5148\u5237\u65B0\uFF0C\u624D\u80FD\u770B\u5230\u66F4\u6539 \ No newline at end of file diff --git a/config/alfresco/messages/coci-service_zh_CN.properties b/config/alfresco/messages/coci-service_zh_CN.properties new file mode 100755 index 0000000000..b49e15dc7f --- /dev/null +++ b/config/alfresco/messages/coci-service_zh_CN.properties @@ -0,0 +1,11 @@ +# coci service externalised display strings + +coci_service.working_copy_label=\uFF08\u5DE5\u4F5C\u526F\u672C\uFF09 +coci_service.err_bad_copy=\u65E0\u6CD5\u627E\u5230\u539F\u59CB\u8282\u70B9\u3002 \u53EF\u80FD\u526F\u672C\u5DF2\u635F\u574F\u6216\u539F\u59CB\u8282\u70B9\u5DF2\u88AB\u5220\u9664\u6216\u79FB\u52A8\u3002 +coci_service.err_not_owner=\u6B64\u7528\u6237\u4E0D\u662F\u5DE5\u4F5C\u526F\u672C\u7684\u6240\u6709\u8005\uFF0C\u6240\u4EE5\u4E0D\u80FD\u7B7E\u5165\u6B64\u5DE5\u4F5C\u526F\u672C\u3002 +coci_service.err_workingcopy_checkout=\u65E0\u6CD5\u7B7E\u51FA\u5DE5\u4F5C\u526F\u672C\u3002 +coci_service.err_not_authenticated=\u65E0\u6CD5\u627E\u5230 CheckOutCheckIn \u670D\u52A1\u6240\u9700\u7684\u5F53\u524D\u5DF2\u901A\u8FC7\u8EAB\u4EFD\u9A8C\u8BC1\u7684\u7528\u6237\u8BE6\u7EC6\u4FE1\u606F\u3002 +coci_service.err_workingcopy_has_no_mimetype=\u5DE5\u4F5C\u526F\u672C\u8282\u70B9 ({0}) \u65E0 MIME \u7C7B\u578B +coci_service.err_already_checkedout=\u6B64\u8282\u70B9\u5DF2\u7B7E\u51FA\u3002 +coci_service.err_cannot_rename=\u65E0\u6CD5\u5C06 {0} \u91CD\u547D\u540D\u4E3A {1}\u3002 +coci_service.discussion_for={0} \u8BA8\u8BBA diff --git a/config/alfresco/messages/content-filter-languages_zh_CN.properties b/config/alfresco/messages/content-filter-languages_zh_CN.properties new file mode 100755 index 0000000000..ea4df71eb4 --- /dev/null +++ b/config/alfresco/messages/content-filter-languages_zh_CN.properties @@ -0,0 +1,194 @@ +## Translations of ISO 639-1 languages codes + +content_filter_lang.aa=\u963F\u6CD5\u5C14\u8BED +content_filter_lang.ab=\u963F\u5E03\u54C8\u5179\u8BED +content_filter_lang.ae=\u963F\u7EF4\u65AF\u9640\u6587 +content_filter_lang.af=\u5357\u975E\u8377\u5170\u8BED +content_filter_lang.ak=\u5E93\u963F\u8BED +content_filter_lang.am=\u963F\u59C6\u54C8\u62C9\u8BED +content_filter_lang.an=\u963F\u62C9\u8D21\u8BED +content_filter_lang.ar=\u963F\u4F4D\u4F2F\u8BED +content_filter_lang.as=\u963F\u8428\u59C6\u8BED +content_filter_lang.av=\u963F\u74E6\u5C14\u8BED +content_filter_lang.ay=\u827E\u9A6C\u62C9\u8BED +content_filter_lang.az=\u963F\u585E\u62DC\u7586\u8BED +content_filter_lang.ba=\u5DF4\u4EC0\u57FA\u5C14\u8BED +content_filter_lang.be=\u767D\u4FC4\u7F57\u65AF\u8BED +content_filter_lang.bg=\u4FDD\u52A0\u5229\u4E9A\u8BED +content_filter_lang.bh=\u6BD4\u54C8\u91CC\u8BED +content_filter_lang.bi=\u6BD4\u65AF\u514B\u8BED +content_filter_lang.bm=\u73ED\u5DF4\u62C9\u66FC\u4E01\u54E5\u8BED +content_filter_lang.bn=\u5B5F\u52A0\u62C9\u8BED +content_filter_lang.bo=\u85CF\u8BED +content_filter_lang.br=\u5E03\u5217\u5854\u5C3C\u8BED +content_filter_lang.bs=\u6CE2\u65AF\u5C3C\u4E9A\u8BED +content_filter_lang.ca=\u52A0\u6CF0\u7F57\u5C3C\u4E9A\u8BED\u3001\u5DF4\u4F26\u897F\u4E9A\u8BED +content_filter_lang.ce=\u8F66\u81E3\u8BED +content_filter_lang.ch=\u67E5\u83AB\u6D1B\u8BED +content_filter_lang.co=\u79D1\u897F\u5609\u8BED +content_filter_lang.cr=\u514B\u91CC\u8BED +content_filter_lang.cs=\u6377\u514B\u65AF\u6D1B\u4F10\u514B\u8BED +content_filter_lang.cu=\u65AF\u62C9\u592B\u8BED +content_filter_lang.cv=\u695A\u74E6\u4EC0\u8BED +content_filter_lang.cy=\u5A01\u5C14\u58EB\u8BED +content_filter_lang.da=\u4E39\u9EA6\u8BED +content_filter_lang.de=\u5FB7\u8BED +content_filter_lang.dv=\u9A6C\u5C14\u4EE3\u592B\u8BED +content_filter_lang.dz=\u5B97\u5361\u8BED +content_filter_lang.ee=\u57C3\u7EF4\u8BED +content_filter_lang.el=\u5E0C\u814A\u8BED +content_filter_lang.en=\u82F1\u8BED +content_filter_lang.eo=\u4E16\u754C\u8BED +content_filter_lang.es=\u897F\u73ED\u7259\u8BED +content_filter_lang.et=\u7231\u6C99\u5C3C\u4E9A\u8BED +content_filter_lang.eu=\u5DF4\u65AF\u514B\u8BED +content_filter_lang.fa=\u6CE2\u65AF\u8BED +content_filter_lang.ff=\u5BCC\u62C9\u5C3C\u8BED +content_filter_lang.fi=\u82AC\u5170\u8BED +content_filter_lang.fj=\u6590\u6D4E\u8BED +content_filter_lang.fo=\u6CD5\u7F57\u8BED +content_filter_lang.fr=\u6CD5\u8BED +content_filter_lang.fy=\u897F\u5F17\u91CC\u897F\u4E9A\u8BED +content_filter_lang.ga=\u7231\u5C14\u5170\u8BED +content_filter_lang.gd=\u76D6\u5C14\u8BED +content_filter_lang.gl=\u52A0\u5229\u897F\u4E9A\u8BED +content_filter_lang.gn=\u74DC\u62C9\u5C3C\u8BED +content_filter_lang.gu=\u53E4\u5409\u7279\u62C9\u8BED +content_filter_lang.gv=\u9A6C\u6069\u5C9B\u8BED +content_filter_lang.ha=\u8C6A\u6492\u8BED +content_filter_lang.he=\u5E0C\u4F2F\u6765\u8BED +content_filter_lang.hi=\u5317\u5370\u5EA6\u8BED +content_filter_lang.ho=\u5E0C\u5229\u6469\u9640\u8BED +content_filter_lang.hr=\u514B\u7F57\u5730\u4E9A\u8BED +content_filter_lang.ht=\u6D77\u5730\u514B\u91CC\u5965\u5C14\u8BED +content_filter_lang.hu=\u5308\u7259\u5229\u8BED +content_filter_lang.hy=\u4E9A\u7F8E\u5C3C\u4E9A\u8BED +content_filter_lang.hz=\u8D6B\u96F7\u7F57\u8BED +content_filter_lang.ia=\u62C9\u4E01\u56FD\u9645\u8BED +content_filter_lang.id=\u5370\u5EA6\u5C3C\u897F\u4E9A\u8BED +content_filter_lang.ie=\u56FD\u9645\u8BED +content_filter_lang.ig=\u4F0A\u535A\u8BED +content_filter_lang.ii=\u56DB\u5DDD\u8BDD +content_filter_lang.ik=\u5370\u52AA\u76AE\u8036\u5580\u8BED +content_filter_lang.io=\u4F0A\u591A\u8BED +content_filter_lang.is=\u51B0\u5C9B\u8BED +content_filter_lang.it=\u610F\u5927\u5229\u8BED +content_filter_lang.iu=\u56E0\u7EBD\u7279\u8BED +content_filter_lang.ja=\u65E5\u8BED +content_filter_lang.jv=\u722A\u54C7\u8BED +content_filter_lang.ka=\u683C\u9C81\u5409\u4E9A\u8BED +content_filter_lang.kg=\u521A\u679C\u8BED +content_filter_lang.ki=\u57FA\u5E93\u5C24\u8BED\u3001\u57FA\u5E93\u5C24\u8BED +content_filter_lang.kj=\u5BBD\u5C3C\u4E9A\u739B\u8BED\u3001\u5E93\u74E6\u4E9A\u9A6C\u8BED +content_filter_lang.kk=\u54C8\u8428\u514B\u65CF +content_filter_lang.kl=\u683C\u9675\u5170\u8BED\u3001\u683C\u9675\u5170\u8BED +content_filter_lang.km=\u9AD8\u68C9\u8BED +content_filter_lang.kn=\u57C3\u7EB3\u5FB7\u8BED +content_filter_lang.ko=\u97E9\u8BED +content_filter_lang.kr=\u5361\u52AA\u91CC\u8BED +content_filter_lang.ks=\u514B\u4EC0\u7C73\u5C14\u8BED +content_filter_lang.ku=\u5E93\u5C14\u5FB7\u8BED +content_filter_lang.kv=\u79D1\u7C73\u8BED +content_filter_lang.kw=\u5EB7\u6C83\u5C14\u51EF\u5C14\u7279\u8BED +content_filter_lang.ky=\u5409\u5C14\u5409\u65AF\u8BED +content_filter_lang.la=\u62C9\u4E01\u8BED +content_filter_lang.lb=\u5362\u68EE\u5821\u8BED\u3001\u5362\u68EE\u5821\u8BED\u3001 +content_filter_lang.lg=\u5E72\u8FBE\u8BED +content_filter_lang.li=\u6797\u5821\u8BED\u3001\u6797\u5821\u8BED\u3001\u6797\u5821\u8BED +content_filter_lang.ln=\u6797\u52A0\u62C9\u8BED +content_filter_lang.lo=\u8001\u631D\u8BED +content_filter_lang.lt=\u7ACB\u9676\u5B9B\u8BED +content_filter_lang.lu=\u5362\u5DF4\u2014\u52A0\u4E39\u52A0\u8BED +content_filter_lang.lv=\u62C9\u8131\u7EF4\u4E9A\u8BED +content_filter_lang.mg=\u9A6C\u5C14\u52A0\u4EC0\u8BED +content_filter_lang.mh=\u9A6C\u7ECD\u5C14\u7FA4\u5C9B\u8BED +content_filter_lang.mi=\u6BDB\u5229\u8BED +content_filter_lang.mk=\u9A6C\u5176\u987F\u8BED +content_filter_lang.ml=\u9A6C\u62C9\u96C5\u62C9\u59C6\u8BED +content_filter_lang.mn=\u8499\u53E4\u8BED +content_filter_lang.mo=\u6469\u5C14\u8FBE\u7EF4\u4E9A\u8BED +content_filter_lang.mr=\u9A6C\u62C9\u5730\u8BED +content_filter_lang.ms=\u9A6C\u6765\u8BED +content_filter_lang.mt=\u9A6C\u8033\u4ED6\u8BED +content_filter_lang.my=\u7F05\u7538\u8BED +content_filter_lang.na=\u7459\u9C81\u8BED +content_filter_lang.nb=\u632A\u5A01\u6CE2\u514B\u9ED8\u5C14\u8BED +content_filter_lang.nd=\u5317\u6069\u5FB7\u8D1D\u52D2\u8BED +content_filter_lang.ne=\u5C3C\u6CCA\u5C14\u8BED +content_filter_lang.ng=\u6069\u4E1C\u52A0\u8BED +content_filter_lang.nl=\u8377\u5170\u8BED +content_filter_lang.nn=\u632A\u5A01\u5C3C\u8BFA\u65AF\u514B\u8BED +content_filter_lang.no=\u632A\u5A01\u8BED +content_filter_lang.nr=\u5357\u6069\u5FB7\u8D1D\u52D2\u8BED +content_filter_lang.nv=\u7EB3\u74E6\u970D\u8BED\u3001\u7EB3\u74E6\u970D\u8BED +content_filter_lang.ny=\u9F50\u5207\u74E6\u8BED\u3001\u5207\u74E6\u8BED\u3001\u5C3C\u626C\u624E\u8BED +content_filter_lang.oc=\u5965\u514B\u8BED (post 1500)\u3001\u666E\u7F57\u65FA\u65AF\u8BED +content_filter_lang.oj=\u5965\u5409\u5E03\u74E6\u8BED +content_filter_lang.om=\u5965\u7F57\u83AB\u5E93\u5E0C\u7279\u8BED +content_filter_lang.or=\u5965\u91CC\u96C5\u8BED +content_filter_lang.os=\u5965\u585E\u68AF\u8BED\u3001\u5965\u585E\u7279\u8BED +content_filter_lang.pa=\u65C1\u906E\u666E\u8BED\u3001\u65C1\u906E\u666E\u8BED +content_filter_lang.pi=\u5DF4\u5229\u8BED +content_filter_lang.pl=\u6CE2\u5170\u8BED +content_filter_lang.ps=\u666E\u4EC0\u56FE\u8BED +content_filter_lang.pt=\u8461\u8404\u7259\u8BED +content_filter_lang.qu=\u76D6\u4E18\u4E9A\u8BED +content_filter_lang.rm=\u91CC\u6258\u7F57\u66FC\u65AF\u8BED +content_filter_lang.rn=\u9686\u8FEA\u8BED +content_filter_lang.ro=\u7F57\u9A6C\u5C3C\u4E9A\u8BED +content_filter_lang.ru=\u4FC4\u8BED +content_filter_lang.rw=\u91D1\u4E9A\u65FA\u8FBE\u8BED +content_filter_lang.sa=\u68B5\u8BED +content_filter_lang.sc=\u6492\u4E01\u8BED +content_filter_lang.sd=\u4FE1\u5FB7\u8BED +content_filter_lang.se=\u5317\u8428\u6469\u65AF\u8BED +content_filter_lang.sg=\u6851\u6208\u8BED +content_filter_lang.si=\u50E7\u4F3D\u7F57\u8BED\u3001\u50E7\u4F3D\u7F57\u8BED +content_filter_lang.sk=\u65AF\u6D1B\u4F10\u514B\u8BED +content_filter_lang.sl=\u65AF\u6D1B\u6587\u5C3C\u4E9A\u8BED +content_filter_lang.sm=\u8428\u6469\u4E9A\u8BED +content_filter_lang.sn=\u4FEE\u7EB3\u8BED +content_filter_lang.so=\u7D22\u9A6C\u91CC\u8BED +content_filter_lang.sq=\u963F\u5C14\u5DF4\u5C3C\u4E9A\u8BED +content_filter_lang.sr=\u585E\u5C14\u7EF4\u4E9A\u8BED +content_filter_lang.ss=\u65AF\u5A01\u58EB\u8BED +content_filter_lang.st=\u7D22\u6258\u8BED\uFF08\u5357\u90E8\uFF09 +content_filter_lang.su=\u5DFD\u4ED6\u8BED +content_filter_lang.sv=\u745E\u5178\u8BED +content_filter_lang.sw=\u65AF\u74E6\u5E0C\u91CC\u8BED +content_filter_lang.ta=\u6CF0\u7C73\u5C14\u8BED +content_filter_lang.te=\u6CF0\u5362\u56FA\u8BED +content_filter_lang.tg=\u5854\u5409\u514B\u8BED +content_filter_lang.th=\u6CF0\u8BED +content_filter_lang.ti=\u63D0\u683C\u91CC\u5C3C\u4E9A\u8BED +content_filter_lang.tk=\u571F\u5E93\u66FC\u8BED +content_filter_lang.tl=\u5854\u52A0\u8DEF\u8BED +content_filter_lang.tn=\u8328\u74E6\u7EB3\u8BED +content_filter_lang.to=\u6C64\u52A0\u8BED\uFF08\u6C64\u52A0\u7FA4\u5C9B\uFF09 +content_filter_lang.tr=\u571F\u8033\u5176\u8BED +content_filter_lang.tr=\u571F\u8033\u5176\u8BED +content_filter_lang.ts=\u806A\u52A0\u8BED +content_filter_lang.tt=\u9791\u977C\u8BED +content_filter_lang.tw=\u5951\u7EF4\u8BED +content_filter_lang.ty=\u5854\u5E0C\u63D0\u8BED +content_filter_lang.ug=\u7EF4\u543E\u5C14\u8BED\u3001\u7EF4\u543E\u5C14\u8BED +content_filter_lang.uk=\u4E4C\u514B\u5170\u8BED +content_filter_lang.ur=\u4E4C\u5C14\u90FD\u8BED +content_filter_lang.uz=\u4E4C\u5179\u522B\u514B\u8BED +content_filter_lang.ve=\u6587\u8FBE\u8BED +content_filter_lang.vi=\u8D8A\u5357\u8BED +content_filter_lang.vo=\u6C83\u62C9\u666E\u514B\u8BED +content_filter_lang.wa=\u74E6\u9F99\u8BED +content_filter_lang.wo=\u6C83\u6D1B\u592B\u8BED +content_filter_lang.xh=\u79D1\u8428\u8BED +content_filter_lang.yi=\u610F\u7B2C\u7EEA\u8BED +content_filter_lang.yo=\u7EA6\u9C81\u5DF4\u8BED +content_filter_lang.za=\u58EE\u8BED\u3001\u58EE\u8BED +content_filter_lang.zh=\u6C49\u8BED +content_filter_lang.zu=\u7956\u9C81\u8BED + +## Duplicate messages to take in account the old +## ISO code. +content_filter_lang.iw=\u5E0C\u4F2F\u6765\u8BED +content_filter_lang.in=\u5370\u5EA6\u5C3C\u897F\u4E9A\u8BED +content_filter_lang.ji=\u610F\u7B2C\u7EEA\u8BED \ No newline at end of file diff --git a/config/alfresco/messages/content-model_zh_CN.properties b/config/alfresco/messages/content-model_zh_CN.properties new file mode 100755 index 0000000000..b99751fefb --- /dev/null +++ b/config/alfresco/messages/content-model_zh_CN.properties @@ -0,0 +1,360 @@ +# Display labels for Content Domain Model + +cm_contentmodel.description=Alfresco \u5185\u5BB9\u57DF\u6A21\u578B + +cm_contentmodel.type.cm_object.title=\u5BF9\u8C61 +cm_contentmodel.type.cm_object.description=\u57FA\u5185\u5BB9\u57DF\u5BF9\u8C61 +cm_contentmodel.property.cm_name.title=\u540D\u79F0 +cm_contentmodel.property.cm_name.description=\u540D\u79F0 + +cm_contentmodel.type.cm_folder.title=\u6587\u4EF6\u5939 +cm_contentmodel.type.cm_folder.description=\u6587\u4EF6\u5939 +cm_contentmodel.property.cm_orderedchildren.title=\u6709\u5E8F\u5B50\u7EA7 +cm_contentmodel.property.cm_orderedchildren.description=\u6307\u793A\u6587\u4EF6\u5939\u7684\u5B50\u7EA7\u662F\u5426\u5DF2\u6392\u5E8F +cm_contentmodel.association.cm_contains.title=\u5305\u542B +cm_contentmodel.association.cm_contains.description=\u5305\u542B + +cm_contentmodel.type.cm_content.title=\u5185\u5BB9 +cm_contentmodel.type.cm_content.description=\u57FA\u5185\u5BB9\u5BF9\u8C61 +cm_contentmodel.property.cm_content.title=\u5185\u5BB9 +cm_contentmodel.property.cm_content.description=\u5185\u5BB9 + +cm_contentmodel.type.cm_linkfile.title=\u6587\u4EF6\u94FE\u63A5 +cm_contentmodel.type.cm_linkfile.description=\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\u6587\u4EF6 +cm_contentmodel.property.cm_path.title=\u94FE\u63A5\u6587\u4EF6\u8DEF\u5F84 +cm_contentmodel.property.cm_path.description=\u88AB\u94FE\u63A5\u6587\u4EF6\u7684\u8DEF\u5F84 + +cm_contentmodel.type.cm_savedquery.title=\u4FDD\u5B58\u7684\u67E5\u8BE2 +cm_contentmodel.type.cm_savedquery.description=\u4FDD\u5B58\u7684\u67E5\u8BE2 + +cm_contentmodel.type.cm_systemfolder.title=\u7CFB\u7EDF\u6587\u4EF6\u5939 +cm_contentmodel.type.cm_systemfolder.description=\u7528\u4E8E\u5B58\u653E\u7CFB\u7EDF\u7EA7\u9879\u7684\u6587\u4EF6\u5939 + +cm_contentmodel.type.cm_person.title=\u4EBA\u5458 +cm_contentmodel.type.cm_person.description=\u4EBA\u5458 + +cm_contentmodel.property.cm_userName.title=\u7528\u6237\u540D +cm_contentmodel.property.cm_userName.description=\u4EBA\u5458\u7684\u7528\u6237\u540D +cm_contentmodel.property.cm_homeFolder.title=\u4E3B\u6587\u4EF6\u5939 +cm_contentmodel.property.cm_homeFolder.description=\u4EBA\u5458\u7684\u4E3B\u6587\u4EF6\u5939 +cm_contentmodel.property.cm_firstName.title=\u540D\u5B57 +cm_contentmodel.property.cm_firstName.description=\u4EBA\u5458\u7684\u540D\u5B57 +cm_contentmodel.property.cm_lastName.title=\u59D3\u6C0F +cm_contentmodel.property.cm_lastName.description=\u4EBA\u5458\u7684\u59D3\u6C0F +cm_contentmodel.property.cm_middleName.title=\u4E2D\u95F4\u540D +cm_contentmodel.property.cm_middleName.description=\u4EBA\u5458\u7684\u4E2D\u95F4\u540D +cm_contentmodel.property.cm_email.title=\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +cm_contentmodel.property.cm_email.description=\u4EBA\u5458\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +cm_contentmodel.property.cm_homeFolderProvider.title=\u4E3B\u6587\u4EF6\u5939\u63D0\u4F9B\u8005 +cm_contentmodel.property.cm_homeFolderProvider.description=\u4E3B\u6587\u4EF6\u5939\u63D0\u4F9B\u8005 +cm_contentmodel.property.cm_defaultHomeFolderPath.title=\u4E3B\u6587\u4EF6\u5939\u8DEF\u5F84 +cm_contentmodel.property.cm_defaultHomeFolderPath.description=\u4EBA\u5458\u4E3B\u6587\u4EF6\u5939\u7684\u8DEF\u5F84 +cm_contentmodel.property.cm_presenceProvider.title=\u5728\u7EBF\u72B6\u6001\u63D0\u4F9B\u8005 +cm_contentmodel.property.cm_presenceProvider.description=\u5728\u7EBF\u72B6\u6001\u63D0\u4F9B\u8005 +cm_contentmodel.property.cm_presenceUsername.title=\u5728\u7EBF\u72B6\u6001\u7528\u6237\u540D +cm_contentmodel.property.cm_presenceUsername.description=\u5728\u7EBF\u72B6\u6001\u7528\u6237\u540D +cm_contentmodel.property.cm_jobtitle.title=\u804C\u4F4D +cm_contentmodel.property.cm_jobtitle.description=\u4EBA\u5458\u7684\u804C\u4F4D +cm_contentmodel.property.cm_location.title=\u4F4D\u7F6E +cm_contentmodel.property.cm_location.description=\u4EBA\u5458\u7684\u4F4D\u7F6E +cm_contentmodel.property.cm_persondescription.title=\u6458\u8981 +cm_contentmodel.property.cm_persondescription.description=\u4EBA\u5458\u7684\u6458\u8981 +cm_contentmodel.property.cm_telephone.title=\u7535\u8BDD +cm_contentmodel.property.cm_telephone.description=\u4EBA\u5458\u7684\u7535\u8BDD\u53F7\u7801 +cm_contentmodel.property.cm_mobile.title=\u79FB\u52A8\u7535\u8BDD +cm_contentmodel.property.cm_mobile.description=\u4EBA\u5458\u7684\u79FB\u52A8\u7535\u8BDD\u53F7\u7801 +cm_contentmodel.property.cm_organizationId.title=\u7EC4\u7EC7 ID +cm_contentmodel.property.cm_organizationId.description=\u4EBA\u5458\u7684\u7EC4\u7EC7 ID +cm_contentmodel.property.cm_organization.title=\u516C\u53F8 +cm_contentmodel.property.cm_organization.description=\u4EBA\u5458\u7684\u516C\u53F8 +cm_contentmodel.property.cm_companyaddress1.title=\u5730\u5740 +cm_contentmodel.property.cm_companyaddress1.description=\u4EBA\u5458\u7684\u516C\u53F8\u5730\u5740\u7B2C\u4E00\u884C +cm_contentmodel.property.cm_companyaddress2.title=\u5730\u5740\u7B2C 2 \u884C +cm_contentmodel.property.cm_companyaddress2.description=\u4EBA\u5458\u7684\u516C\u53F8\u5730\u5740\u7B2C\u4E8C\u884C +cm_contentmodel.property.cm_companyaddress3.title=\u5730\u5740\u7B2C 3 \u884C +cm_contentmodel.property.cm_companyaddress3.description=\u4EBA\u5458\u7684\u516C\u53F8\u5730\u5740\u7B2C\u4E09\u884C +cm_contentmodel.property.cm_companypostcode.title=\u90AE\u653F\u7F16\u7801 +cm_contentmodel.property.cm_companypostcode.description=\u4EBA\u5458\u7684\u516C\u53F8\u90AE\u653F\u7F16\u7801 +cm_contentmodel.property.cm_companytelephone.title=\u7535\u8BDD +cm_contentmodel.property.cm_companytelephone.description=\u4EBA\u5458\u7684\u516C\u53F8\u7535\u8BDD\u53F7\u7801 +cm_contentmodel.property.cm_companyfax.title=\u4F20\u771F +cm_contentmodel.property.cm_companyfax.description=\u4EBA\u5458\u7684\u516C\u53F8\u4F20\u771F\u53F7\u7801 +cm_contentmodel.property.cm_companyemail.title=\u7535\u5B50\u90AE\u4EF6 +cm_contentmodel.property.cm_companyemail.description=\u4EBA\u5458\u7684\u516C\u53F8\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +cm_contentmodel.property.cm_skype.title=Skype +cm_contentmodel.property.cm_skype.description=\u4EBA\u5458\u7684 Skype \u7528\u6237 ID +cm_contentmodel.property.cm_instantmsg.title=IM +cm_contentmodel.property.cm_instantmsg.description=\u4EBA\u5458\u7684\u5373\u65F6\u6D88\u606F\u7528\u6237 ID +cm_contentmodel.property.cm_userStatus.title=\u72B6\u6001 +cm_contentmodel.property.cm_userStatus.description=\u4EBA\u5458\u7684\u5F53\u524D\u72B6\u6001 +cm_contentmodel.property.cm_userStatusTime.title=\u72B6\u6001\u65F6\u95F4 +cm_contentmodel.property.cm_userStatusTime.description=\u4EBA\u5458\u72B6\u6001\u7684\u4E0A\u6B21\u66F4\u65B0\u65F6\u95F4 +cm_contentmodel.property.cm_googleusername.title=Google \u7528\u6237\u540D +cm_contentmodel.property.cm_googleusername.description=\u4EBA\u5458\u7684 Google \u7528\u6237\u540D +cm_contentmodel.property.cm_sizeCurrent.title=\u4F7F\u7528\u91CF +cm_contentmodel.property.cm_sizeCurrent.description=\u4EBA\u5458\u6B63\u5728\u4F7F\u7528\u7684\u78C1\u76D8\u7A7A\u95F4\u91CF +cm_contentmodel.property.cm_sizeQuota.title=\u914D\u989D +cm_contentmodel.property.cm_sizeQuota.description=\u4EBA\u5458\u53EF\u4F7F\u7528\u7684\u6700\u5927\u78C1\u76D8\u7A7A\u95F4\u91CF +cm_contentmodel.property.cm_emailFeedId.title=\u7535\u5B50\u90AE\u4EF6\u8BA2\u9605\u6E90 ID +cm_contentmodel.property.cm_emailFeedId.description=\u4EBA\u5458\u7684\u7535\u5B50\u90AE\u4EF6\u8BA2\u9605\u6E90 ID \u7684 ID +cm_contentmodel.association.cm_avatar.title=\u7528\u6237\u6807\u8BC6\u56FE +cm_contentmodel.association.cm_avatar.description=\u4EBA\u5458\u7684\u7528\u6237\u6807\u8BC6\u56FE + +cm_contentmodel.type.cm_category_root.title=\u7C7B\u522B\u6839 +cm_contentmodel.type.cm_category_root.description=\u6839\u7C7B\u522B +cm_contentmodel.association.cm_categories.title=\u7C7B\u522B +cm_contentmodel.association.cm_categories.description=\u7C7B\u522B\u6839\u5185\u7684\u7C7B\u522B + +cm_contentmodel.type.cm_category.title=\u7C7B\u522B +cm_contentmodel.type.cm_category.description=\u7C7B\u522B +cm_contentmodel.association.cm_subcategories.title=\u7C7B\u522B +cm_contentmodel.association.cm_subcategories.description=\u7C7B\u522B\u5185\u7684\u5B50\u7C7B\u522B + +cm_contentmodel.aspect.cm_titled.title=\u5E26\u6807\u9898 +cm_contentmodel.aspect.cm_titled.description=\u5E26\u6807\u9898 +cm_contentmodel.property.cm_title.title=\u6807\u9898 +cm_contentmodel.property.cm_title.description=\u5185\u5BB9\u6807\u9898 +cm_contentmodel.property.cm_description.title=\u8BF4\u660E +cm_contentmodel.property.cm_description.description=\u5185\u5BB9\u8BF4\u660E + +cm_contentmodel.aspect.cm_auditable.title=\u53EF\u5BA1\u6838 +cm_contentmodel.aspect.cm_auditable.description=\u53EF\u5BA1\u6838 +cm_contentmodel.property.cm_created.title=\u521B\u5EFA\u65E5\u671F +cm_contentmodel.property.cm_created.description=\u521B\u5EFA\u65E5\u671F +cm_contentmodel.property.cm_creator.title=\u521B\u5EFA\u8005 +cm_contentmodel.property.cm_creator.description=\u521B\u5EFA\u6B64\u9879\u7684\u4EBA\u5458 +cm_contentmodel.property.cm_modified.title=\u4FEE\u6539\u65E5\u671F +cm_contentmodel.property.cm_modified.description=\u4E0A\u6B21\u4FEE\u6539\u6B64\u9879\u7684\u65F6\u95F4 +cm_contentmodel.property.cm_modifier.title=\u4FEE\u6539\u8005 +cm_contentmodel.property.cm_modifier.description=\u4E0A\u6B21\u4FEE\u6539\u6B64\u9879\u7684\u4EBA\u5458 +cm_contentmodel.property.cm_accessed.title=\u4E0A\u6B21\u8BBF\u95EE\u65E5\u671F +cm_contentmodel.property.cm_accessed.description=\u4E0A\u6B21\u8BBF\u95EE\u6B64\u9879\u7684\u65F6\u95F4 + +cm_contentmodel.aspect.cm_author.title=\u4F5C\u8005 +cm_contentmodel.aspect.cm_author.description=\u4F5C\u8005 +cm_contentmodel.property.cm_author.title=\u4F5C\u8005 +cm_contentmodel.property.cm_author.description=\u4F5C\u8005 + +cm_contentmodel.aspect.cm_localizable.title=\u53EF\u672C\u5730\u5316 +cm_contentmodel.aspect.cm_localizable.description=\u53EF\u672C\u5730\u5316 +cm_contentmodel.property.cm_locale.title=\u533A\u57DF\u8BBE\u7F6E +cm_contentmodel.property.cm_locale.description=\u533A\u57DF\u8BBE\u7F6E + +cm_contentmodel.aspect.cm_translatable.title=\u53EF\u7FFB\u8BD1 +cm_contentmodel.aspect.cm_translatable.description=\u53EF\u7FFB\u8BD1 +cm_contentmodel.association.cm_translations.title=\u7FFB\u8BD1 +cm_contentmodel.association.cm_translations.description=\u7FFB\u8BD1 + +cm_contentmodel.aspect.cm_transformable.title=\u53EF\u8F6C\u6362 +cm_contentmodel.aspect.cm_transformable.description=\u53EF\u8F6C\u6362 +cm_contentmodel.association.cm_formats.title=\u683C\u5F0F +cm_contentmodel.association.cm_formats.description=\u8F6C\u6362\u540E\u7684\u9879 + +cm_contentmodel.aspect.cm_templatable.title=\u53EF\u8BBE\u7F6E\u6A21\u677F +cm_contentmodel.aspect.cm_templatable.description=\u53EF\u8BBE\u7F6E\u6A21\u677F +cm_contentmodel.property.cm_template.title=\u6A21\u677F +cm_contentmodel.property.cm_template.description=\u6A21\u677F + +cm_contentmodel.aspect.cm_complianceable.title=\u53EF\u5408\u89C4 +cm_contentmodel.aspect.cm_complianceable.description=\u53EF\u5408\u89C4 +cm_contentmodel.property.cm_removeAfter.title=\u79FB\u9664\u5F00\u59CB\u65F6\u95F4 +cm_contentmodel.property.cm_removeAfter.description=\u79FB\u9664\u5F00\u59CB\u65F6\u95F4 + +cm_contentmodel.aspect.cm_ownable.title=\u53EF\u62E5\u6709 +cm_contentmodel.aspect.cm_ownable.description=\u53EF\u62E5\u6709 +cm_contentmodel.property.cm_owner.title=\u6240\u6709\u8005 +cm_contentmodel.property.cm_owner.description=\u6240\u6709\u8005 + +cm_contentmodel.aspect.cm_dublincore.title=\u90FD\u67CF\u6797\u6838\u5FC3 +cm_contentmodel.aspect.cm_dublincore.description=\u90FD\u67CF\u6797\u6838\u5FC3 +cm_contentmodel.property.cm_publisher.title=\u53D1\u5E03\u8005 +cm_contentmodel.property.cm_publisher.description=\u53D1\u5E03\u8005 +cm_contentmodel.property.cm_contributor.title=\u8D21\u732E\u8005 +cm_contentmodel.property.cm_contributor.description=\u8D21\u732E\u8005 +cm_contentmodel.property.cm_type.title=\u7C7B\u578B +cm_contentmodel.property.cm_type.description=\u7C7B\u578B +cm_contentmodel.property.cm_identifier.title=\u6807\u8BC6\u7B26 +cm_contentmodel.property.cm_identifier.description=\u6807\u8BC6\u7B26 +cm_contentmodel.property.cm_dcsource.title=\u6E90 +cm_contentmodel.property.cm_dcsource.description=\u6E90 +cm_contentmodel.property.cm_coverage.title=\u8986\u76D6 +cm_contentmodel.property.cm_coverage.description=\u8986\u76D6 +cm_contentmodel.property.cm_rights.title=\u6743\u9650 +cm_contentmodel.property.cm_rights.description=\u6743\u9650 +cm_contentmodel.property.cm_subject.title=\u4E3B\u9898 +cm_contentmodel.property.cm_subject.description=\u4E3B\u9898 + +cm_contentmodel.aspect.cm_basable.title=\u53EF\u4F5C\u4E3A\u57FA +cm_contentmodel.aspect.cm_basable.description=\u53EF\u4F5C\u4E3A\u57FA +cm_contentmodel.association.cm_basis.title=\u57FA\u7840 +cm_contentmodel.association.cm_basis.description=\u57FA\u7840 + +cm_contentmodel.aspect.cm_partable.title=\u53EF\u62C6\u5206 +cm_contentmodel.aspect.cm_partable.description=\u53EF\u62C6\u5206 +cm_contentmodel.association.cm_parts.title=\u90E8\u5206 +cm_contentmodel.association.cm_parts.description=\u90E8\u5206 + +cm_contentmodel.aspect.cm_referencing.title=\u5F15\u7528 +cm_contentmodel.aspect.cm_referencing.description=\u5F15\u7528 +cm_contentmodel.association.cm_references.title=\u5F15\u7528 +cm_contentmodel.association.cm_references.description=\u5F15\u7528 + +cm_contentmodel.aspect.cm_replacable.title=\u53EF\u66FF\u6362 +cm_contentmodel.aspect.cm_replacable.description=\u53EF\u66FF\u6362 +cm_contentmodel.association.cm_replaces.title=\u66FF\u6362 +cm_contentmodel.association.cm_replaces.description=\u66FF\u6362 + +cm_contentmodel.aspect.cm_effectivity.title=\u6709\u6548\u6027 +cm_contentmodel.aspect.cm_effectivity.description=\u6709\u6548\u6027 +cm_contentmodel.property.cm_from.title=\u6709\u6548\u5F00\u59CB\u65F6\u95F4 +cm_contentmodel.property.cm_from.description=\u6709\u6548\u5F00\u59CB\u65F6\u95F4 +cm_contentmodel.property.cm_to.title=\u6709\u6548\u622A\u6B62\u65F6\u95F4 +cm_contentmodel.property.cm_to.description=\u6709\u6548\u622A\u6B62\u65F6\u95F4 + +cm_contentmodel.aspect.cm_summarizable.title=\u53EF\u6458\u8981 +cm_contentmodel.aspect.cm_summarizable.description=\u53EF\u6458\u8981 +cm_contentmodel.property.cm_summary.title=\u6458\u8981 +cm_contentmodel.property.cm_summary.description=\u6458\u8981 + +cm_contentmodel.aspect.cm_countable.title=\u53EF\u8BA1\u6570 +cm_contentmodel.aspect.cm_countable.description=\u53EF\u8BA1\u6570 +cm_contentmodel.property.cm_hits.title=\u547D\u4E2D\u6570 +cm_contentmodel.property.cm_hits.description=\u547D\u4E2D\u6570 + +cm_contentmodel.aspect.cm_copiedFrom.title=\u590D\u5236\u6765\u6E90 +cm_contentmodel.aspect.cm_copiedFrom.description=\u590D\u5236\u6765\u6E90 +cm_contentmodel.property.cm_source.title=\u6E90 +cm_contentmodel.property.cm_source.description=\u6E90 + +cm_contentmodel.aspect.cm_workingcopy.title=\u5DE5\u4F5C\u526F\u672C +cm_contentmodel.aspect.cm_workingcopy.description=\u5DE5\u4F5C\u526F\u672C +cm_contentmodel.property.cm_workingCopyOwner.title=\u5DE5\u4F5C\u526F\u672C\u6240\u6709\u8005 +cm_contentmodel.property.cm_workingCopyOwner.description=\u5DE5\u4F5C\u526F\u672C\u6240\u6709\u8005 + +cm_contentmodel.aspect.cm_versionable.title=\u53EF\u8BBE\u7F6E\u7248\u672C +cm_contentmodel.aspect.cm_versionable.description=\u53EF\u8BBE\u7F6E\u7248\u672C +cm_contentmodel.property.cm_versionLabel.title=\u7248\u672C\u6807\u7B7E +cm_contentmodel.property.cm_versionLabel.description=\u7248\u672C\u6807\u7B7E +cm_contentmodel.property.cm_autoVersion.title=\u81EA\u52A8\u7248\u672C +cm_contentmodel.property.cm_autoVersion.description=\u81EA\u52A8\u7248\u672C +cm_contentmodel.property.cm_initialVersion.title=\u521D\u59CB\u7248\u672C +cm_contentmodel.property.cm_initialVersion.description=\u521D\u59CB\u7248\u672C + +cm_contentmodel.aspect.cm_lockable.title=\u53EF\u9501\u5B9A +cm_contentmodel.aspect.cm_lockable.description=\u53EF\u9501\u5B9A +cm_contentmodel.property.cm_lockOwner.title=\u9501\u5B9A\u6240\u6709\u8005 +cm_contentmodel.property.cm_lockOwner.description=\u9501\u5B9A\u6240\u6709\u8005 +cm_contentmodel.property.cm_lockType.title=\u9501\u5B9A\u7C7B\u578B +cm_contentmodel.property.cm_lockType.description=\u9501\u5B9A\u7C7B\u578B +cm_contentmodel.property.cm_expiryDate.title=\u5230\u671F\u65E5\u671F +cm_contentmodel.property.cm_expiryDate.description=\u5230\u671F\u65E5\u671F +cm_contentmodel.property.cm_lockIsDeep.title=\u6DF1\u5EA6\u9501\u5B9A +cm_contentmodel.property.cm_lockIsDeep.description=\u6DF1\u5EA6\u9501\u5B9A + +cm_contentmodel.aspect.cm_subscribable.title=\u53EF\u8BA2\u9605 +cm_contentmodel.aspect.cm_subscribable.description=\u53EF\u8BA2\u9605 +cm_contentmodel.association.cm_subscribedBy.title=\u8BA2\u9605\u8005 +cm_contentmodel.association.cm_subscribedBy.description=\u8BA2\u9605\u8005 + +cm_contentmodel.aspect.cm_classifiable.title=\u53EF\u5206\u7C7B +cm_contentmodel.aspect.cm_classifiable.description=\u53EF\u5206\u7C7B + +cm_contentmodel.aspect.cm_generalclassifiable.title=\u53EF\u5206\u7C7B +cm_contentmodel.aspect.cm_generalclassifiable.description=\u53EF\u5206\u7C7B +cm_contentmodel.property.cm_categories.title=\u7C7B\u522B +cm_contentmodel.property.cm_categories.description=\u7C7B\u522B + +cm_contentmodel.aspect.cm_taggable.title=\u53EF\u8BBE\u7F6E\u6807\u8BB0 +cm_contentmodel.aspect.cm_taggable.description=\u53EF\u8BBE\u7F6E\u6807\u8BB0 +cm_contentmodel.property.cm_taggable.title=\u6807\u8BB0 +cm_contentmodel.property.cm_taggable.description=\u6807\u8BB0 + +cm_contentmodel.aspect.cm_attachable.title=\u53EF\u9644\u52A0 +cm_contentmodel.aspect.cm_attachable.description=\u5141\u8BB8\u9644\u52A0\u5176\u4ED6\u5B58\u50A8\u5E93\u5BF9\u8C61 +cm_contentmodel.association.cm_attachments.title=\u9644\u4EF6 +cm_contentmodel.association.cm_attachments.description=\u9644\u52A0\u7684\u5B58\u50A8\u5E93\u5BF9\u8C61 + +cm_contentmodel.aspect.cm_emailed.title=\u7535\u5B50\u90AE\u4EF6\u65B9\u5F0F +cm_contentmodel.aspect.cm_emailed.description=\u7535\u5B50\u90AE\u4EF6\u65B9\u5F0F +cm_contentmodel.property.cm_originator.title=\u59CB\u53D1\u4EBA +cm_contentmodel.property.cm_originator.description=\u59CB\u53D1\u4EBA +cm_contentmodel.property.cm_addressee.title=\u6536\u4EF6\u4EBA +cm_contentmodel.property.cm_addressee.description=\u6536\u4EF6\u4EBA +cm_contentmodel.property.cm_addressees.title=\u6536\u4EF6\u4EBA +cm_contentmodel.property.cm_addressees.description=\u6536\u4EF6\u4EBA +cm_contentmodel.property.cm_subjectline.title=\u4E3B\u9898 +cm_contentmodel.property.cm_subjectline.description=\u4E3B\u9898 +cm_contentmodel.property.cm_sentdate.title=\u53D1\u9001\u65E5\u671F +cm_contentmodel.property.cm_sentdate.description=\u53D1\u9001\u65E5\u671F + +cm_contentmodel.aspect.cm_geographic.title=\u5730\u7406 +cm_contentmodel.aspect.cm_geographic.description=\u5730\u7406 +cm_contentmodel.property.cm_latitude.title=\u7EAC\u5EA6 +cm_contentmodel.property.cm_latitude.description=\u7EAC\u5EA6 +cm_contentmodel.property.cm_longitude.title=\u7ECF\u5EA6 +cm_contentmodel.property.cm_longitude.description=\u7ECF\u5EA6 + +cm_contentmodel.aspect.exif_exif.title=EXIF +cm_contentmodel.aspect.exif_exif.description=\u6807\u51C6 EXIF \u5143\u6570\u636E\u7684\u5B50\u96C6 +cm_contentmodel.property.exif_dateTimeOriginal.title=\u65E5\u671F\u548C\u65F6\u95F4 +cm_contentmodel.property.exif_dateTimeOriginal.description=\u539F\u59CB\u56FE\u50CF\u7684\u751F\u6210\u65E5\u671F\u548C\u65F6\u95F4 +cm_contentmodel.property.exif_pixelXDimension.title=\u56FE\u50CF\u5BBD\u5EA6 +cm_contentmodel.property.exif_pixelXDimension.description=\u56FE\u50CF\u7684\u5BBD\u5EA6\uFF08\u50CF\u7D20\uFF09 +cm_contentmodel.property.exif_pixelYDimension.title=\u56FE\u50CF\u9AD8\u5EA6 +cm_contentmodel.property.exif_pixelYDimension.description=\u56FE\u50CF\u7684\u9AD8\u5EA6\uFF08\u50CF\u7D20\uFF09 +cm_contentmodel.property.exif_exposureTime.title=\u66DD\u5149\u65F6\u95F4 +cm_contentmodel.property.exif_exposureTime.description=\u66DD\u5149\u65F6\u95F4\uFF08\u79D2\uFF09 +cm_contentmodel.property.exif_fNumber.title=\u5149\u5708\u503C +cm_contentmodel.property.exif_fNumber.description=\u5149\u5708\u503C +cm_contentmodel.property.exif_flash.title=\u6FC0\u6D3B\u95EA\u5149\u706F +cm_contentmodel.property.exif_flash.description=\u62CD\u6444\u7167\u7247\u65F6\u662F\u5426\u6FC0\u6D3B\u4E86\u95EA\u5149\u706F +cm_contentmodel.property.exif_focalLength.title=\u7126\u8DDD +cm_contentmodel.property.exif_focalLength.description=\u955C\u5934\u7684\u7126\u8DDD\uFF08\u6BEB\u7C73\uFF09 +cm_contentmodel.property.exif_isoSpeedRatings.title=ISO \u901F\u5EA6 +cm_contentmodel.property.exif_isoSpeedRatings.description=ISO \u901F\u5EA6 +cm_contentmodel.property.exif_manufacturer.title=\u76F8\u673A\u5236\u9020\u5546 +cm_contentmodel.property.exif_manufacturer.description=\u7528\u4E8E\u62CD\u6444\u6B64\u7167\u7247\u7684\u76F8\u673A\u7684\u5236\u9020\u5546 +cm_contentmodel.property.exif_model.title=\u76F8\u673A\u578B\u53F7 +cm_contentmodel.property.exif_model.description=\u7528\u4E8E\u62CD\u6444\u6B64\u7167\u7247\u7684\u76F8\u673A\u7684\u578B\u53F7 +cm_contentmodel.property.exif_software.title=\u76F8\u673A\u8F6F\u4EF6 +cm_contentmodel.property.exif_software.description=\u7528\u4E8E\u62CD\u6444\u6B64\u7167\u7247\u7684\u76F8\u673A\u4E0A\u5B89\u88C5\u7684\u8F6F\u4EF6 +cm_contentmodel.property.exif_orientation.title=\u65B9\u5411 +cm_contentmodel.property.exif_orientation.description=\u7167\u7247\u7684\u65B9\u5411 +cm_contentmodel.property.exif_xResolution.title=\u6C34\u5E73\u5206\u8FA8\u7387 +cm_contentmodel.property.exif_xResolution.description=\u6C34\u5E73\u5206\u8FA8\u7387\uFF08\u5355\u4F4D\u50CF\u7D20\uFF09 +cm_contentmodel.property.exif_yResolution.title=\u5782\u76F4\u5206\u8FA8\u7387 +cm_contentmodel.property.exif_yResolution.description=\u5782\u76F4\u5206\u8FA8\u7387\uFF08\u5355\u4F4D\u50CF\u7D20\uFF09 +cm_contentmodel.property.exif_resolutionUnit.title=\u5206\u8FA8\u7387\u5355\u4F4D +cm_contentmodel.property.exif_resolutionUnit.description=\u7528\u4E8E\u6C34\u5E73\u548C\u5782\u76F4\u5206\u8FA8\u7387\u7684\u5355\u4F4D + +cm_contentmodel.aspect.audio_audio.title=\u97F3\u9891 +cm_contentmodel.aspect.audio_audio.description=\u6807\u51C6 xmpDM \u97F3\u9891\u5143\u6570\u636E\u7684\u5B50\u96C6 +cm_contentmodel.property.audio_album.title=\u4E13\u8F91 +cm_contentmodel.property.audio_album.description=\u4E13\u8F91 +cm_contentmodel.property.audio_artist.title=\u827A\u672F\u5BB6 +cm_contentmodel.property.audio_artist.description=\u8868\u6F14\u6B64\u4F5C\u54C1\u7684\u827A\u672F\u5BB6 +cm_contentmodel.property.audio_composer.title=\u4F5C\u66F2\u5BB6 +cm_contentmodel.property.audio_composer.description=\u4E3A\u6B64\u4F5C\u54C1\u4F5C\u66F2\u7684\u4F5C\u66F2\u5BB6 +cm_contentmodel.property.audio_engineer.title=\u5DE5\u7A0B\u5E08 +cm_contentmodel.property.audio_engineer.description=\u5F55\u97F3\u5DE5\u7A0B\u5E08 +cm_contentmodel.property.audio_genre.title=\u6D41\u6D3E +cm_contentmodel.property.audio_genre.description=\u97F3\u4E50\u7684\u6D41\u6D3E +cm_contentmodel.property.audio_trackNumber.title=\u97F3\u8F68\u53F7 +cm_contentmodel.property.audio_trackNumber.description=\u4F5C\u54C1\u5728\u4E13\u8F91\u4E2D\u7684\u97F3\u8F68\u53F7 +cm_contentmodel.property.audio_releaseDate.title=\u53D1\u884C\u65E5\u671F +cm_contentmodel.property.audio_releaseDate.description=\u53D1\u884C\u65E5\u671F +cm_contentmodel.property.audio_sampleRate.title=\u91C7\u6837\u7387 +cm_contentmodel.property.audio_sampleRate.description=\u91C7\u6837\u7387 +cm_contentmodel.property.audio_sampleType.title=\u91C7\u6837\u7C7B\u578B +cm_contentmodel.property.audio_sampleType.description=\u97F3\u9891\u91C7\u6837\u7C7B\u578B\uFF0C\u901A\u5E38\u4E3A 8Int\u300116Int\u300132Int \u6216 32Float \u4E4B\u4E00 +cm_contentmodel.property.audio_channelType.title=\u58F0\u9053\u7C7B\u578B +cm_contentmodel.property.audio_channelType.description=\u97F3\u9891\u58F0\u9053\u7C7B\u578B\uFF0C\u901A\u5E38\u4E3A\u5355\u58F0\u9053\u3001\u7ACB\u4F53\u58F0\u30015.1 \u6216 7.1 \u4E4B\u4E00 +cm_contentmodel.property.audio_compressor.title=\u538B\u7F29\u683C\u5F0F +cm_contentmodel.property.audio_compressor.description=\u6240\u7528\u97F3\u9891\u538B\u7F29\u683C\u5F0F\uFF0C\u5982 MP3 \u6216 FLAC + +cm_contentmodel.aspect.cm_indexControl.title=\u7D22\u5F15\u63A7\u4EF6 +cm_contentmodel.aspect.cm_indexControl.description=\u63A7\u5236\u7D22\u5F15\u884C\u4E3A +cm_contentmodel.property.cm_isIndexed.title=\u5DF2\u5EFA\u7ACB\u7D22\u5F15 +cm_contentmodel.property.cm_isIndexed.description=\u662F\u5426\u5DF2\u4E3A\u6B64\u8282\u70B9\u5EFA\u7ACB\u7D22\u5F15\u5E76\u53EF\u901A\u8FC7\u641C\u7D22\u67E5\u627E\u3002 +cm_contentmodel.property.cm_isContentIndexed.title=\u662F\u5426\u5DF2\u4E3A\u5185\u5BB9\u5EFA\u7ACB\u7D22\u5F15 +cm_contentmodel.property.cm_isContentIndexed.description=\u662F\u5426\u5DF2\u4E3A\u8282\u70B9\u7684 d:content \u5C5E\u6027\u5EFA\u7ACB\u7D22\u5F15\uFF1F diff --git a/config/alfresco/messages/content-service_zh_CN.properties b/config/alfresco/messages/content-service_zh_CN.properties new file mode 100755 index 0000000000..a32712f8ee --- /dev/null +++ b/config/alfresco/messages/content-service_zh_CN.properties @@ -0,0 +1,26 @@ +# Content-related messages + +content.content_missing=The node''s content is missing: \n node: {0} \n reader: {1} \n Please contact your system administrator. +content.runtime_exec.property_moved=The property ''errorCodes'' has moved down onto the RuntimeExec class + +index.recovery.out_of_date=The indexes are not synchronized with the database. +index.tracking.starting=Index recovery started. +index.tracking.complete=Index recovery completed. +index.tracking.progress=\tProcessing transactions around {0}. +index.recovery.starting=Index recovery started: {0} transactions. +index.recovery.complete=Index recovery completed. +index.recovery.progress=\t{0} % complete. +index.recovery.terminated=Index recovery terminated. + +node.archive.msg.busy=A bulk purge or restore operation is currently in progress + +content.http_reader.err.no_connection=Unable to connect to remote Alfresco server via HTTP: {0} +content.http_reader.err.no_authentication=The HTTP reader was unable to authenticate on the remote server: {0} \n +content.http_reader.err.check_cluster=Please ensure that 'replicateUpdates' and 'replicateUpdatesViaCopy' is enabled for the cache 'org.alfresco.cache.ticketsCache'. Check that the general cluster configuration is correct and working. +content.http_reader.err.unrecognized=An unrecognized error occurred when attempting to download content from remote server:\n Server: {0} \n Content: {1} \n HTTP Response: {2} + +metadata.extraction.err.type_conversion=Metadata extraction failed because an extracted value failed to convert to the required type: \n Extractor: {0} \n Target Property QName: {1} \n Required Type: {2} \n Extracted Value: {3} + +transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. + +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/copy-service_zh_CN.properties b/config/alfresco/messages/copy-service_zh_CN.properties new file mode 100755 index 0000000000..d7c176568c --- /dev/null +++ b/config/alfresco/messages/copy-service_zh_CN.properties @@ -0,0 +1,3 @@ +# copy service externalised display strings + +copy_service.copy_of_label={0} \u7684\u526F\u672C \ No newline at end of file diff --git a/config/alfresco/messages/data-list-model_zh_CN.properties b/config/alfresco/messages/data-list-model_zh_CN.properties new file mode 100755 index 0000000000..0565c2748d --- /dev/null +++ b/config/alfresco/messages/data-list-model_zh_CN.properties @@ -0,0 +1,114 @@ +# Display labels for Share Data Lists Model +dl_datalistmodel.description=Alfresco Share \u6570\u636E\u5217\u8868\u6A21\u578B + +dl_datalistmodel.type.dl_dataList.title=\u6570\u636E\u5217\u8868\u6587\u4EF6\u5939\u7C7B\u578B +dl_datalistmodel.type.dl_dataList.description=\u7528\u4E8E\u5B58\u50A8 dl:dataListItemType \u5C5E\u6027\u4E2D\u6307\u5B9A\u7C7B\u578B\u7684\u6570\u636E\u5217\u8868\u9879\u3002 +dl_datalistmodel.property.dl_dataListItemType.title=\u6570\u636E\u5217\u8868\u9879\u7C7B\u578B +dl_datalistmodel.property.dl_dataListItemType.description=\u7528\u4E8E\u786E\u5B9A\u5728\u6570\u636E\u5217\u8868\u5185\u65B0\u5EFA\u9879\u65F6\u5C06\u4F7F\u7528\u7684\u54EA\u79CD dl:dataListItem \u7684\u5B50\u7C7B\u578B\u3002 + +dl_datalistmodel.type.dl_dataListItem.title=\u6570\u636E\u5217\u8868\u7236\u7C7B\u578B +dl_datalistmodel.type.dl_dataListItem.description=\u6D3E\u751F\u6837\u672C\u6570\u636E\u5217\u8868\u9879\u7C7B\u578B\u7684\u6765\u6E90\u7236\u7C7B\u578B\u3002 + +## Simple "To do" List +dl_datalistmodel.type.dl_todoList.title=\u4EE3\u529E\u4E8B\u5B9C\u5217\u8868 +dl_datalistmodel.type.dl_todoList.description=\u4E00\u4E2A\u7B80\u5355\u7684\u4EE3\u529E\u4E8B\u5B9C\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B\u53EF\u9009\u7684\u88AB\u6307\u6D3E\u8005\u3002 +dl_datalistmodel.property.dl_todoTitle.title=\u6807\u9898 +dl_datalistmodel.property.dl_todoDueDate.title=\u622A\u6B62\u65E5\u671F +dl_datalistmodel.property.dl_todoPriority.title=\u4F18\u5148\u7EA7 +dl_datalistmodel.property.dl_todoStatus.title=\u72B6\u6001 +dl_datalistmodel.property.dl_todoNotes.title=\u8BF4\u660E +dl_datalistmodel.association.dl_assignee.title=\u88AB\u6307\u6D3E\u8005 +dl_datalistmodel.association.dl_attachments.title=\u9644\u4EF6 + +# Gantt Aspect +dl_datalistmodel.property.dl_ganttStartDate.title=\u5F00\u59CB\u65E5\u671F +dl_datalistmodel.property.dl_ganttEndDate.title=\u7ED3\u675F\u65E5\u671F +dl_datalistmodel.property.dl_ganttPercentComplete.title=\u5B8C\u6210\u767E\u5206\u6BD4 + +# Task List (Advanced) +dl_datalistmodel.type.dl_task.title=\u4EFB\u52A1\u5217\u8868\uFF08\u9AD8\u7EA7\uFF09 +dl_datalistmodel.type.dl_task.description=\u9AD8\u7EA7\u4EFB\u52A1\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B\u6807\u9898\u3001\u8BF4\u660E\u3001\u5F00\u59CB\u65E5\u671F\u4E0E\u7ED3\u675F\u65E5\u671F\u3001\u4F18\u5148\u7EA7\u3001\u72B6\u6001\u3001\u6CE8\u91CA\u3001\u88AB\u6307\u6D3E\u8005\u4EE5\u53CA\u9644\u4EF6\u3002 +dl_datalistmodel.property.dl_taskPriority.title=\u4F18\u5148\u7EA7 +dl_datalistmodel.property.dl_taskStatus.title=\u72B6\u6001 +dl_datalistmodel.property.dl_taskComments.title=\u6CE8\u91CA +dl_datalistmodel.association.dl_taskAssignee.title=\u88AB\u6307\u6D3E\u8005 + +# Task List (Simple) +dl_datalistmodel.type.dl_simpletask.title=\u4EFB\u52A1\u5217\u8868\uFF08\u7B80\u5355\uFF09 +dl_datalistmodel.type.dl_simpletask.description=\u7B80\u5355\u4EFB\u52A1\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B\u6807\u9898\u3001\u8BF4\u660E\u3001\u622A\u6B62\u65E5\u671F\u3001\u4F18\u5148\u7EA7\u3001\u72B6\u6001\u4EE5\u53CA\u6CE8\u91CA\u3002 +dl_datalistmodel.property.dl_simpletaskDueDate.title=\u622A\u6B62\u65E5\u671F +dl_datalistmodel.property.dl_simpletaskPriority.title=\u4F18\u5148\u7EA7 +dl_datalistmodel.property.dl_simpletaskStatus.title=\u72B6\u6001 +dl_datalistmodel.property.dl_simpletaskComments.title=\u6CE8\u91CA + +# Contact +dl_datalistmodel.type.dl_contact.title=\u8054\u7CFB\u4EBA\u5217\u8868 +dl_datalistmodel.type.dl_contact.description=\u8054\u7CFB\u4EBA\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B\u540D\u5B57\u3001\u59D3\u6C0F\u3001\u5168\u540D\u3001\u7535\u5B50\u90AE\u4EF6\u3001\u804C\u4F4D\u3001\u7535\u8BDD\u53F7\u7801\uFF08\u529E\u516C\u5BA4\u5EA7\u673A\uFF09\u4EE5\u53CA\u7535\u8BDD\u53F7\u7801\uFF08\u79FB\u52A8\u7535\u8BDD\uFF09\u3002 +dl_datalistmodel.property.dl_contactFirstName.title=\u540D\u5B57 +dl_datalistmodel.property.dl_contactLastName.title=\u59D3\u6C0F +dl_datalistmodel.property.dl_contactEmail.title=\u7535\u5B50\u90AE\u4EF6 +dl_datalistmodel.property.dl_contactCompany.title=\u516C\u53F8 +dl_datalistmodel.property.dl_contactJobTitle.title=\u804C\u4F4D +dl_datalistmodel.property.dl_contactPhoneOffice.title=\u7535\u8BDD\u53F7\u7801\uFF08\u529E\u516C\u5BA4\u5EA7\u673A\uFF09 +dl_datalistmodel.property.dl_contactPhoneMobile.title=\u7535\u8BDD\u53F7\u7801\uFF08\u79FB\u52A8\u7535\u8BDD\uFF09 +dl_datalistmodel.property.dl_contactNotes.title=\u8BF4\u660E + +# Issues +dl_datalistmodel.type.dl_issue.title=\u95EE\u9898\u5217\u8868 +dl_datalistmodel.type.dl_issue.description=\u95EE\u9898\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B ID\u3001\u72B6\u6001\u3001\u4F18\u5148\u7EA7\u3001\u8BF4\u660E\u3001\u622A\u6B62\u65E5\u671F\u3001\u6CE8\u91CA\u3001\u6307\u6D3E\u5BF9\u8C61\u4EE5\u53CA\u76F8\u5173\u95EE\u9898\u3002 +dl_datalistmodel.property.dl_issueID.title=\u95EE\u9898 ID +dl_datalistmodel.property.dl_issueStatus.title=\u72B6\u6001 +dl_datalistmodel.property.dl_issuePriority.title=\u4F18\u5148\u7EA7 +dl_datalistmodel.property.dl_issueDescription.title=\u8BF4\u660E +dl_datalistmodel.property.dl_issueDueDate.title=\u622A\u6B62\u65E5\u671F +dl_datalistmodel.property.dl_issueComments.title=\u6CE8\u91CA +dl_datalistmodel.association.dl_issueAssignedTo.title=\u88AB\u6307\u6D3E\u7ED9 +dl_datalistmodel.property.dl_issueRelatedIssues.title=\u76F8\u5173\u95EE\u9898 + +# Event +dl_datalistmodel.type.dl_event.title=\u4E8B\u4EF6\u5217\u8868 +dl_datalistmodel.type.dl_event.description=\u4E8B\u4EF6\u5217\u8868\uFF0C\u5176\u4E2D\u5305\u542B\u6807\u9898\u3001\u8BF4\u660E\u3001\u4F4D\u7F6E\uFF0C\u4EE5\u53CA\u5F00\u59CB\u548C\u7ED3\u675F\u65E5\u671F/\u65F6\u95F4\u3002 +dl_datalistmodel.property.dl_eventLocation.title=\u4F4D\u7F6E +dl_datalistmodel.property.dl_eventStartDate.title=\u5F00\u59CB\u65E5\u671F +dl_datalistmodel.property.dl_eventEndDate.title=\u7ED3\u675F\u65E5\u671F +dl_datalistmodel.property.dl_eventRegistrations.title=\u6CE8\u518C +dl_datalistmodel.property.dl_eventNote.title=\u8BF4\u660E + +# Location +dl_datalistmodel.type.dl_location.title=\u4F4D\u7F6E\u5217\u8868 +dl_datalistmodel.type.dl_location.description=\u4F4D\u7F6E/\u5730\u5740\u5217\u8868 +dl_datalistmodel.property.dl_locationAddress1.title=\u5730\u5740\u7B2C 1 \u884C +dl_datalistmodel.property.dl_locationAddress2.title=\u5730\u5740\u7B2C 2 \u884C +dl_datalistmodel.property.dl_locationAddress3.title=\u5730\u5740\u7B2C 3 \u884C +dl_datalistmodel.property.dl_locationZip.title=\u90AE\u653F\u7F16\u7801 +dl_datalistmodel.property.dl_locationState.title=\u7701/\u76F4\u8F96\u5E02/\u81EA\u6CBB\u533A +dl_datalistmodel.property.dl_locationCountry.title=\u56FD\u5BB6/\u5730\u533A +dl_datalistmodel.property.dl_locationNote.title=\u8BF4\u660E + +# Meeting Agenda +dl_datalistmodel.type.dl_meetingAgenda.title=\u4F1A\u8BAE\u8BAE\u7A0B +dl_datalistmodel.type.dl_meetingAgenda.description=\u7BA1\u7406\u4F1A\u8BAE\u8BAE\u7A0B\u9879\uFF0C\u5176\u4E2D\u5305\u62EC\u8BF4\u660E\u3001\u6240\u6709\u8005\uFF0C\u4EE5\u53CA\u5206\u914D\u7684\u65F6\u95F4\u3002 +dl_datalistmodel.property.dl_meetingAgendaRef.title=\u5F15\u7528 +dl_datalistmodel.property.dl_meetingAgendaTime.title=\u65F6\u95F4\uFF08\u5206\u949F\uFF09 +dl_datalistmodel.property.dl_meetingAgendaOwner.title=\u6240\u6709\u8005 + +# Event Agenda +dl_datalistmodel.type.dl_eventAgenda.title=\u4E8B\u4EF6\u65E5\u7A0B +dl_datalistmodel.type.dl_eventAgenda.description=\u7BA1\u7406\u4E8B\u4EF6\u65E5\u7A0B\uFF0C\u5305\u62EC\u4F1A\u8BDD\u540D\u79F0\u3001\u6F14\u793A\u8005\uFF0C\u4EE5\u53CA\u5F00\u59CB\u548C\u7ED3\u675F\u65F6\u95F4\u3002 +dl_datalistmodel.property.dl_eventAgendaRef.title=\u5F15\u7528 +dl_datalistmodel.property.dl_eventAgendaStartTime.title=\u5F00\u59CB\u65F6\u95F4 +dl_datalistmodel.property.dl_eventAgendaEndTime.title=\u7ED3\u675F\u65F6\u95F4 +dl_datalistmodel.property.dl_eventAgendaSessionName.title=\u4F1A\u8BDD\u540D\u79F0 +dl_datalistmodel.property.dl_eventAgendaPresenter.title=\u6F14\u793A\u8005 +dl_datalistmodel.property.dl_eventAgendaAudience.title=\u89C2\u4F17 +dl_datalistmodel.property.dl_eventAgendaNotes.title=\u8BF4\u660E + +# List constraint display labels +listconstraint.dl_task_status.Not\ Started=\u672A\u5F00\u59CB +listconstraint.dl_task_status.In\ Progress=\u6B63\u5728\u8FDB\u884C +listconstraint.dl_task_status.On\ Hold= \u6682\u505C +listconstraint.dl_task_status.Complete=\u5B8C\u6210 +listconstraint.dl_priority_value.High=\u9AD8 +listconstraint.dl_priority_value.Normal=\u6B63\u5E38 +listconstraint.dl_priority_value.Low=\u4F4E + diff --git a/config/alfresco/messages/discussion-messages_zh_CN.properties b/config/alfresco/messages/discussion-messages_zh_CN.properties new file mode 100755 index 0000000000..1b425f2fdc --- /dev/null +++ b/config/alfresco/messages/discussion-messages_zh_CN.properties @@ -0,0 +1,3 @@ +# Discussion-related messages + +discussion.discussion_for={0} \u8BA8\u8BBA \ No newline at end of file diff --git a/config/alfresco/messages/email-server-model_zh_CN.properties b/config/alfresco/messages/email-server-model_zh_CN.properties new file mode 100755 index 0000000000..a250d299ad --- /dev/null +++ b/config/alfresco/messages/email-server-model_zh_CN.properties @@ -0,0 +1,5 @@ +emailserver_emailserverModel.aspect.emailserver_aliasable.title=\u7535\u5B50\u90AE\u4EF6\u522B\u540D +emailserver_emailserverModel.aspect.emailserver_aliasable.description=\u7535\u5B50\u90AE\u4EF6\u522B\u540D +emailserver_emailserverModel.property.emailserver_alias.title=\u522B\u540D +emailserver_emailserverModel.property.emailserver_alias.description=\u522B\u540D + diff --git a/config/alfresco/messages/email-service_zh_CN.properties b/config/alfresco/messages/email-service_zh_CN.properties new file mode 100755 index 0000000000..5d69596820 --- /dev/null +++ b/config/alfresco/messages/email-service_zh_CN.properties @@ -0,0 +1,24 @@ +email.server.msg.received_by_smtp=SMTP \u63A5\u6536\u81EA ''{0}''\u3002 +email.server.msg.default_subject=\u7535\u5B50\u90AE\u4EF6- {0} + +email.server.err.sender_blocked=\u5DF2\u62D2\u7EDD ''{0}'' \u8BBF\u95EE\u3002 +email.server.err.inbound_mail_disabled=\u672A\u5C06 Alfresco \u670D\u52A1\u5668\u914D\u7F6E\u4E3A\u63A5\u53D7\u5165\u7AD9\u7535\u5B50\u90AE\u4EF6\u3002 +email.server.err.access_denied=\u5DF2\u62D2\u7EDD ''{0}'' \u8BBF\u95EE ''{1}''\u3002 +email.server.err.invalid_subject=\u4E3B\u9898\u884C\u5FC5\u987B\u662F\u6709\u6548\u7684\u6587\u4EF6\u540D\u3002 +email.server.err.unknown_source_address=''\u53D1\u4EF6\u4EBA''\u7535\u5B50\u90AE\u4EF6\u5730\u5740\u65E0\u6CD5\u8BC6\u522B\uFF1A{0}\u3002 +email.server.err.user_not_email_contributor=\u7528\u6237 ''{0}'' \u4E0D\u5C5E\u4E8E\u7535\u5B50\u90AE\u4EF6\u8D21\u732E\u8005\u7EC4 (Email Contributor Group)\u3002 +email.server.err.no_email_contributor_group=Email Contributor Group \u4E0D\u5B58\u5728\u3002 +email.server.err.invalid_node_address=\u7535\u5B50\u90AE\u4EF6\u5730\u5740 ''{0}'' \u672A\u5F15\u7528\u53EF\u8BBF\u95EE\u7684\u6709\u6548\u8282\u70B9\u3002 +email.server.err.handler_not_found=\u672A\u627E\u5230\u8282\u70B9\u7C7B\u578B ''{0}'' \u7684\u7535\u5B50\u90AE\u4EF6\u6D88\u606F\u5904\u7406\u7A0B\u5E8F\u3002 +email.server.err.mail_read_error=\u8BFB\u7535\u5B50\u90AE\u4EF6\u6D88\u606F\u65F6\u51FA\u9519\uFF1A{0} +email.server.err.failed_to_create_mime_message=\u4ECE\u8F93\u5165\u6D41\u521B\u5EFA MIME \u6D88\u606F\u5931\u8D25\uFF1A{0} +email.server.err.extracting_from_address=\u63D0\u53D6''\u53D1\u4EF6\u4EBA''\u5730\u5740\u5931\u8D25\uFF1A{0} +email.server.err.no_from_address=\u6B64\u6D88\u606F\u65E0''\u53D1\u4EF6\u4EBA''\u5730\u5740\u3002 +email.server.err.extracting_to_address=\u63D0\u53D6''\u6536\u4EF6\u4EBA''\u5730\u5740\u5931\u8D25\uFF1A{0} +email.server.err.no_to_address=\u6B64\u6D88\u606F\u65E0''\u6536\u4EF6\u4EBA''\u5730\u5740\u3002 +email.server.err.extracting_subject=\u63D0\u53D6\u6D88\u606F\u4E3B\u9898\u5931\u8D25\uFF1A{0} +email.server.err.extracting_sent_date=\u63D0\u53D6''\u53D1\u9001\u65E5\u671F''\u5931\u8D25\uFF1A{0} +email.server.err.parse_message=\u89E3\u6790\u7535\u5B50\u90AE\u4EF6\u6D88\u606F\u5931\u8D25\uFF1A{0} +email.server.err.usupported_encoding=\u4E0D\u652F\u6301\u5BF9 ''{0}'' \u7F16\u7801 +email.server.err.failed_to_read_content_stream=\u8BFB\u6D88\u606F\u90E8\u5206\u5185\u5BB9\u5931\u8D25\uFF1A{0} +email.server.err.incorrect_message_part=\u6D88\u606F\u90E8\u5206\u4E0D\u6B63\u786E\uFF1A{0} diff --git a/config/alfresco/messages/form-service_zh_CN.properties b/config/alfresco/messages/form-service_zh_CN.properties new file mode 100755 index 0000000000..dc0210ccaa --- /dev/null +++ b/config/alfresco/messages/form-service_zh_CN.properties @@ -0,0 +1,21 @@ +# form service externalised display strings + +form_service.mimetype.label=MIME \u7C7B\u578B +form_service.mimetype.description=\u5185\u5BB9\u7684 MIME \u7C7B\u578B +form_service.encoding.label=\u7F16\u7801 +form_service.encoding.description=\u5185\u5BB9\u7684\u7F16\u7801 +form_service.size.label=\u5927\u5C0F +form_service.size.description=\u5185\u5BB9\u7684\u5927\u5C0F\uFF08\u5B57\u8282\uFF09 + +form_service.message.label=\u6D88\u606F +form_service.message.description=\u542F\u52A8\u5DE5\u4F5C\u6D41\u7A0B\u65F6\u7528\u6237\u8F93\u5165\u7684\u6D88\u606F +form_service.message.value.none=\uFF08\u65E0\u6D88\u606F\uFF09 + +form_service.transitions.label=\u8F6C\u6362 +form_service.transitions.description=\u53EF\u7528\u4E8E\u6B64\u4EFB\u52A1\u7684\u8F6C\u6362 + +form_service.package.items.label=\u9879 +form_service.package.items.description=\u5C5E\u4E8E\u6B64\u5DE5\u4F5C\u6D41\u7A0B\u7684\u9879 + +form_service.task.owner.label=\u6240\u6709\u8005 +form_service.task.owner.description=\u62E5\u6709\u6B64\u4EFB\u52A1\u7684\u7528\u6237 \ No newline at end of file diff --git a/config/alfresco/messages/forum-model_zh_CN.properties b/config/alfresco/messages/forum-model_zh_CN.properties new file mode 100755 index 0000000000..c1cdb785df --- /dev/null +++ b/config/alfresco/messages/forum-model_zh_CN.properties @@ -0,0 +1,21 @@ +# Display labels for System Model + +fm_forummodel.description=\u8BBA\u575B\u6A21\u578B + +fm_forummodel.type.fm_forums.title=\u8BBA\u575B\u7A7A\u95F4 +fm_forummodel.type.fm_forums.description=\u5176\u4E2D\u5305\u542B\u8BBA\u575B\u7684\u7A7A\u95F4 + +fm_forummodel.type.fm_forum.title=\u8BBA\u575B +fm_forummodel.type.fm_forum.description=\u5176\u4E2D\u5305\u542B\u4E3B\u9898\u7684\u7A7A\u95F4 + +fm_forummodel.type.fm_topic.title=\u4E3B\u9898 +fm_forummodel.type.fm_topic.description=\u5176\u4E2D\u5305\u542B\u8BBA\u575B\u6587\u7AE0\uFF08\u5E16\u5B50\uFF09\u7684\u7A7A\u95F4 + +fm_forummodel.type.fm_post.title=\u8BBA\u575B\u6587\u7AE0 +fm_forummodel.type.fm_post.description=\u9488\u5BF9\u67D0\u4E2A\u4E3B\u9898\u53D1\u8868\u7684\u8BBA\u575B\u6587\u7AE0 + +fm_forummodel.aspect.fm_discussable.title=\u53EF\u8BA8\u8BBA +fm_forummodel.aspect.fm_discussable.description=\u5141\u8BB8\u8BA8\u8BBA\u67D0\u4E2A\u5BF9\u8C61 + +fm_forummodel.association.fm_discussion.title=\u8BA8\u8BBA +fm_forummodel.association.fm_discussion.description=\u6301\u6709\u5E94\u7528\u4E86\u6B64\u5207\u9762\u7684\u5BF9\u8C61\u4E0A\u7684\u8BA8\u8BBA\u7684\u8BBA\u575B diff --git a/config/alfresco/messages/imap-service_zh_CN.properties b/config/alfresco/messages/imap-service_zh_CN.properties new file mode 100755 index 0000000000..80486636c7 --- /dev/null +++ b/config/alfresco/messages/imap-service_zh_CN.properties @@ -0,0 +1,17 @@ +# +# Imap I18N messages +# + +# Information messages. prefix 'imap.server.info' +imap.server.info.message_body_not_found = "\u672A\u627E\u5230\u6D88\u606F\u6B63\u6587\u90E8\u5206\u3002" + +# Error messages. prefix 'imap.server.error' +imap.server.error.properties_dont_exist = "\u76F8\u5E94\u5C5E\u6027\u4E0D\u5B58\u5728\u3002" +imap.server.error.permission_denied = "\u65E0\u6CD5\u521B\u5EFA\u6587\u4EF6\u5939 - \u6743\u9650\u88AB\u62D2\u7EDD\u3002" +imap.server.error.folder_already_exist = "\u6587\u4EF6\u5939\u5DF2\u5B58\u5728\u3002" +imap.server.error.mailbox_name_is_mandatory = "\u90AE\u7BB1\u540D\u79F0\u4E3A\u5FC5\u9700\u7684\u53C2\u6570\u3002" +imap.server.error.cannot_get_a_folder = "\u65E0\u6CD5\u83B7\u53D6\u540D\u79F0\u4E3A ''{0}'' \u7684\u6587\u4EF6\u5939\u3002" +imap.server.error.cannot_parse_default_email = "\u65E0\u6CD5\u89E3\u6790\u9ED8\u8BA4\u7535\u5B50\u90AE\u4EF6\u5730\u5740 ''{0}''\u3002" + + + diff --git a/config/alfresco/messages/initiate-inplace_zh_CN.properties b/config/alfresco/messages/initiate-inplace_zh_CN.properties new file mode 100755 index 0000000000..8cddea5c70 --- /dev/null +++ b/config/alfresco/messages/initiate-inplace_zh_CN.properties @@ -0,0 +1 @@ +bfsit.error.importAlreadyInProgress=\u5DF2\u5728\u6267\u884C\u6279\u91CF\u5BFC\u5165\u3002 \u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002 diff --git a/config/alfresco/messages/invitation-service_zh_CN.properties b/config/alfresco/messages/invitation-service_zh_CN.properties new file mode 100755 index 0000000000..005a44a145 --- /dev/null +++ b/config/alfresco/messages/invitation-service_zh_CN.properties @@ -0,0 +1,27 @@ +# +# Invitation service messages +# + +invitation.error.noworkflow="\u672A\u627E\u5230\u9080\u8BF7\u5DE5\u4F5C\u6D41\u7A0B\uFF1B\u5DE5\u4F5C\u6D41\u7A0B\u540D\u79F0\uFF1A{0}" +invitation.error.not_found="\u672A\u627E\u5230\u9080\u8BF7\uFF1B\u9080\u8BF7 ID\uFF1A{0}" +invitation.error.invalid_inviteId_format="\u9080\u8BF7 ID \u7684\u683C\u5F0F\u65E0\u6548\uFF0C\u6709\u6548\u683C\u5F0F\u4E3A $\uFF1A{0}" +invitation.invite.already_member="\u7528\u6237 {0} \u5DF2\u7ECF\u662F {1} \u7684\u6210\u5458\uFF0C\u56E0\u6B64\u4E0D\u80FD\u88AB\u518D\u6B21\u9080\u8BF7" +invitation.cancel.not_site_manager="\u5F53\u524D\u7528\u6237 {0} \u4E0D\u80FD\u53D6\u6D88\u9080\u8BF7 {1}\uFF0C\u539F\u56E0\u662F\u8BE5\u7528\u6237\u4E0D\u662F\u7AD9\u70B9 {2} \u7684\u7AD9\u70B9\u7BA1\u7406\u5458" +invitation.invite.not_site_manager="\u5F53\u524D\u7528\u6237 {0} \u4E0D\u662F\u7AD9\u70B9 {1} \u7684\u7AD9\u70B9\u7BA1\u7406\u5458" +invitation.invite.unable_generate_id="\u65E0\u6CD5\u4E3A\u88AB\u9080\u8BF7\u8005\u751F\u6210\u7528\u6237\u540D\uFF0C\u56E0\u4E3A\u88AB\u9080\u8BF7\u8005\u5C1A\u4E0D\u5C5E\u4E8E\u6EE1\u8DB3\u4EE5\u4E0B\u6761\u4EF6\u7684\u5176\u4ED6\u4EBA\u5458\uFF1AfirstName:{0} lastName:{1} email:{2}" +invitation.invite.already_finished="\u5DF2\u63A5\u53D7\u3001\u53D6\u6D88\u6216\u62D2\u7EDD\u4E86\u9080\u8BF7 {0}" +invitation.invite.authentication_chain="\u8EAB\u4EFD\u9A8C\u8BC1\u94FE\u4E0D\u5141\u8BB8\u65B0\u5EFA\u5E10\u6237" + +# InviteSender messages +invitation.invitesender.email.subject=Alfresco {0}\uFF1A\u60A8\u5DF2\u53D7\u9080\u52A0\u5165 {1} \u7AD9\u70B9 +invitation.invitesender.email.role.SiteManager=\u7AD9\u70B9\u7BA1\u7406\u5458 +invitation.invitesender.email.role.SiteCollaborator=\u7AD9\u70B9\u5408\u4F5C\u8005 +invitation.invitesender.email.role.SiteContributor=\u7AD9\u70B9\u8D21\u732E\u8005 +invitation.invitesender.email.role.SiteConsumer=\u7AD9\u70B9\u4F7F\u7528\u8005 + +# Invitation workflow task description +invitation.nominated.workflow.description={0} \u7AD9\u70B9\u7684\u52A0\u5165\u9080\u8BF7 +invitation.moderated.workflow.description={0} \u7AD9\u70B9\u7684\u52A0\u5165\u8BF7\u6C42 + +# Person Notification messages +invitation.notification.person.email.subject=Alfresco {0}\uFF1A\u60A8\u7684\u65B0\u5E10\u6237 diff --git a/config/alfresco/messages/jbpm-engine-messages_zh_CN.properties b/config/alfresco/messages/jbpm-engine-messages_zh_CN.properties new file mode 100755 index 0000000000..dac1139a54 --- /dev/null +++ b/config/alfresco/messages/jbpm-engine-messages_zh_CN.properties @@ -0,0 +1,44 @@ +Jbpm.engine.mandatory.properties.missing=Mandatory task properties have not been provided! {0} +jbpm.engine.deploy.workflow.error=Failed to deploy workflow definition. +jbpm.engine.is.workflow.deployed.error=Failed to determine if workflow definition is already deployed. +jbpm.engine.undeploy.workflow.error=Failed to undeploy workflow definition {0}. +jbpm.engine.get.workflow.definition.error=Failed to retrieve workflow definitions. +jbpm.engine.get.workflow.definition.by.id.error=Failed to retrieve workflow definition for id {0}. +jbpm.engine.get.workflow.definition.by.name.error=Failed to retrieve workflow definition for name {0}. +jbpm.engine.get.all.workflow.definitions.by.name.error=Failed to retrieve all definitions for workflow {0}. +jbpm.engine.get.workflow.definition.image.error=Failed to retrieve workflow definition image for {0}. +jbpm.engine.get.task.definitions.error=Failed to retrieve workflow task definitions for workflow definition {0}. +jbpm.engine.get.process.definition.error=Workflow definition {0} does not exist. +jbpm.enginestart.workflow.error=Failed to start workflow {0}. +jbpm.engine.get.active.workflows.error=Failed to retrieve workflow instances for definition {0}. +jbpm.engine.get.workflow.instance.by.id.error=Failed to retrieve workflow instance with Id {0}. +jbpm.engine.get.process.instance.error=Workflow instance does not exist for Id {0}. +jbpm.engine.get.workflow.paths.error=Failed to retrieve workflow paths for workflow instance {0}. +jbpm.engine.get.path.properties.error=Failed to retrieve properties of path {0}. +jbpm.engine.cancel.workflow.error=Failed to cancel workflow instance {0}. +jbpm.engine.delete.workflow.error=Failed to delete workflow instance {0}. +jbpm.engine.signal.transition.error=Failed to signal transition {0} from workflow path {1}.. +jbpm.engine.invalid.event=Event {0} is not a valid event, this event name is reserved. +jbpm.engine.fire.event.error=Failed to fire event {0} on workflow path {1}. +jbpm.engine.get.tasks.for.path.error=Failed to retrieve tasks assigned to Workflow path {0}. +jbpm.engine.get.timers.error=Could not retrieve any timers for workflow {0}. +jbpm.engine.find.completed.task.instances.error=Failed to retrieve completed task instances list for actor {0}. +jbpm.engine.get.assigned.tasks.error=Failed to retrieve tasks assigned to authority {0} in state {1}. +jbpm.engine.get.pooled.tasks.error=Failed to retrieve pooled tasks for authorities {0}. +jbpm.engine.query.tasks.error=Failed to query tasks. Query: {0}. +jbpm.engine.get.task.instance.error=Task instance {0} does not exist. +jbpm.engine.update.task.error=Failed to update workflow task {0}. +jbpm.engine.end.task.invalid.transition=Transition {0} is invalid for Workflow task {1}. +jbpm.engine.end.task.error=Failed to signal transition {0} from workflow task {1}. +jbpm.engine.get.task.by.id.error=Failed to retrieve task {0}. +jbpm.engine.get.start.task.error=Failed to retrieve start task for workflow instance {0}. +jbpm.engine.compile.process.definition.zip.error=Failed to parse process definition from jBPM zip archive stream. +jbpm.engine.compile.process.definition.xml.error=Failed to parse process definition from jBPM xml stream. +jbpm.engine.compile.process.definition.unsupported.error=Failed to parse process definition - unsupported mime type {0} +jbpm.engine.get.jbpm.id.error=Format of id {0} is invalid. +jbpm.engine.get.workflow.token.invalid=Invalid workflow path {0}. +jbpm.engine.get.workflow.token.is.null=Workflow path {0} does not exist. +jbpm.engine.set.task.properties.invalid.value=The value {0} is invalid for the task property {1}. +jbpm.engine.convert.value.error=Unable to convert jBPM value {0} to Alfresco Value since it is not Serializable. +jbpm.engine.get.company.home.invalid=Invalid company home path {0}. +jbpm.engine.get.company.home.multiple=Invalid company home path {0}. Expected 1 match but found {1} matches. \ No newline at end of file diff --git a/config/alfresco/messages/lock-service_zh_CN.properties b/config/alfresco/messages/lock-service_zh_CN.properties new file mode 100755 index 0000000000..a0fc039244 --- /dev/null +++ b/config/alfresco/messages/lock-service_zh_CN.properties @@ -0,0 +1,6 @@ +# Lock service externalised display strings + +lock_service.insufficent_privileges=\u60A8\u7684\u6743\u9650\u4E0D\u8DB3\uFF0C\u4E0D\u80FD\u91CA\u653E\u5BF9\u6B64\u8282\u70B9\uFF08ID \u4E3A {0}\uFF09\u7684\u9501\u5B9A\u3002 \u6B64\u8282\u70B9\u5DF2\u7ECF\u88AB\u5176\u4ED6\u7528\u6237\u9501\u5B9A\u3002 +lock_service.node_locked=\u65E0\u6CD5\u9501\u5B9A\u6B64\u8282\u70B9\uFF08ID \u4E3A {0}\uFF09\uFF0C\u56E0\u4E3A\u6B64\u8282\u70B9\u5DF2\u7ECF\u88AB\u5176\u4ED6\u7528\u6237\u9501\u5B9A\u3002 +lock_service.no_op=\u65E0\u6CD5\u6267\u884C\u64CD\u4F5C\uFF0C\u56E0\u4E3A\u6B64\u8282\u70B9\uFF08ID \u4E3A {0}\uFF09\u5DF2\u88AB\u9501\u5B9A\u3002 +lock_service.no_op2=\u65E0\u6CD5\u6267\u884C\u64CD\u4F5C {0}\uFF0C\u56E0\u4E3A\u6B64\u8282\u70B9\uFF08ID \u4E3A {1}\uFF09\u5DF2\u88AB\u9501\u5B9A\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/module-messages_zh_CN.properties b/config/alfresco/messages/module-messages_zh_CN.properties new file mode 100755 index 0000000000..930ad2a92e --- /dev/null +++ b/config/alfresco/messages/module-messages_zh_CN.properties @@ -0,0 +1,20 @@ +# Module messages + +module.msg.found_modules=Found {0} module(s). +module.msg.starting= Starting module ''{0}'' version {1}. +module.msg.installing= Installing module ''{0}'' version {1}. +module.msg.upgrading= Upgrading module ''{0}'' version {1} (was {2}). +module.msg.missing= A previously-installed module ''{0}'' (version {1}) is not present in your distribution. +module.msg.dependencies= Module ''{0}'' version {1} has the following dependencies: {1} + +module.warn.no_install_version=Module ''{0}'' had no install version. Assuming version {1} was installed. + +module.err.missing_dependency=\nModule ''{0}'' version {1} depends on module ''{2}'', which has not been installed. +module.err.downgrading_not_supported=\nDowngrading of modules is not supported.\nModule ''{0}'' version {1} is currently installed and must be uninstalled before version {2} can be installed. +module.err.unsupported_repo_version=\nModule ''{0}'' version {1} is incompatible with the current repository version {2}.\n The repository version required must be in range [{3} : {4}]. +module.err.already_executed=The module component has already been executed: {0}.{1} +module.err.execution_failed=A module component ''{0}'' failed to execute: {1} +module.err.component_already_registered=A component named ''{0}'' has already been registered for module ''{1}''. +module.err.unable_to_open_module_properties=The module properties file ''{0}'' could not be read. +module.err.component_in_missing_module=The component ''{0}'' belongs to a non-existent module ''{1}''. +module.err.orphaned_components={0} module components were not considered for execution. diff --git a/config/alfresco/messages/notification-service_zh_CN.properties b/config/alfresco/messages/notification-service_zh_CN.properties new file mode 100755 index 0000000000..1a6254da64 --- /dev/null +++ b/config/alfresco/messages/notification-service_zh_CN.properties @@ -0,0 +1,7 @@ +# Notification Service externalised display strings +np-does-not-exist=\u65E0\u6CD5\u53D1\u9001\u901A\u77E5\uFF0C\u56E0\u4E3A\u901A\u77E5\u63D0\u4F9B\u8005 {0} \u4E0D\u5B58\u5728\u3002 +default-sender-used=\u7535\u5B50\u90AE\u4EF6\u901A\u77E5\u7684\u53D1\u4EF6\u4EBA\u5C1A\u672A\u8BBE\u7F6E\u4EFB\u4F55\u7535\u5B50\u90AE\u4EF6\uFF0C\u56E0\u6B64\u5C06\u4F7F\u7528\u9ED8\u8BA4\u53D1\u4EF6\u4EBA\u3002 \uFF08\u7528\u6237={0}\uFF09 +no-recipients=\u65E0\u6CD5\u53D1\u9001\u7535\u5B50\u90AE\u4EF6\u901A\u77E5\uFF0C\u56E0\u4E3A\u672A\u63D0\u4F9B\u4EFB\u4F55\u6536\u4EF6\u4EBA\u3002 \uFF08\u6587\u6863={0}\uFF09 +no-body-or-template=\u65E0\u6CD5\u53D1\u9001\u901A\u77E5\uFF0C\u56E0\u4E3A\u672A\u6307\u5B9A\u4EFB\u4F55\u6B63\u6587\u6216\u6B63\u6587\u6A21\u677F\u3002 \uFF08\u8282\u70B9={0}\uFF09 +assigned-task=\u5DF2\u7ECF\u4E3A\u60A8\u6307\u6D3E\u4E86\u4E00\u9879\u4EFB\u52A1 +new-pooled-task=\u65B0\u7684\u5165\u6C60\u4EFB\u52A1 diff --git a/config/alfresco/messages/patch-service_zh_CN.properties b/config/alfresco/messages/patch-service_zh_CN.properties new file mode 100755 index 0000000000..b328dd8a15 --- /dev/null +++ b/config/alfresco/messages/patch-service_zh_CN.properties @@ -0,0 +1,479 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +patch.siteLoadPatch.description=Loads a sample site into the repository. +patch.siteLoadPatch.exists=The Site {0} already exists and so could not be imported +patch.siteLoadPatch.noBootstrapViews=No bootstrap views were given for importing Site {0} - please check the bootstrap extension bean configuration +patch.siteLoadPatch.result=Site {0} imported. +patch.siteLoadPatch.siteNotCreated=The site {0} is only created for new installs. +patch.siteLoadPatch.siteLoadDisabled=The load of site {0} is disabled. + +patch.wcmFolders.description=Ensures the existance of the WCM specific 'Web Projects' and 'Web Forms' folders. +patch.wcmFolders.webprojects.result.exists=The Web Projects folder already exists: {0} +patch.wcmFolders.webprojects.result.created=The Web Projects folder was successfully created: {0} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.wcmDeployed.description=Adds the 'WCM Deployed' space to the company home folder. + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.redeployJbpmAdhocWorkflow.description=Redeploy JBPM adhoc workflow +patch.redeployJbpmAdhocWorkflow.result=JBPM adhoc workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes3.description=Fix mimetype for MPEG Audio +patch.updateMimetypes4.description=Rationalise mimetypes for PhotoShop and AutoCad +patch.updateMimetypesWMA.description=Fix mimetype for MS WMA Streaming Audio + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDropOldTables.description=Drops old alf_*attribute* tables and sequence +patch.migrateAttrDropOldTables.result=Drop tables alf_attributes, alf_global_attributes, alf_list_attribute_entries, alf_map_attribute_entries and sequence alf_attributes_seq + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. +patch.publishing.root.description=Creates the publishing root folder in the Data Dictionary + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts +patch.newUserEmailTemplates.created=Email templates added: {0} + +patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site +patch.inviteEmailTemplates.created=Email templates added: {0} + +patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content + +patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only) + +patch.imapSpacesLocaleTemplates2.description=Replaces content templates for IMAP clients + +patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. + +patch.followingMailTemplates.description=Adds email templates for following notifications + +patch.activitiesTemplatesUpdate.description=Updates activities email templates. +patch.activitiesTemplatesUpdate.error=Error retrieving base template when trying to patch the activity email templates. +patch.activitiesTemplatesUpdate.result=Updated activities email templates. + +patch.activitiesEmailTemplate.description=Creates activities email templates. + +patch.avmToAdmRemoteStore.description=Migrates Share Surf config from AVM sitestore to DM Sites folder. +patch.avmToAdmRemoteStore.complete=Completed Share Surf config migration. + +patch.copiedFromAspect.description=Adds peer associations for cm:copiedfrom and cm:workingcopy (new model) and removes cm:source property +patch.copiedFromAspect.result=Fixed cm:copiedfrom model for {0} nodes. See file {1} for details. + +patch.workflowNotification.description=Patch to add workflow email notification email folder and template. + +patch.nodeTemplatesFolder.description=Patch to create new Data Dictionary folder for Share - Create Node by Template + +patch.sitesSpacePermissions.description=Patch to remove the EVERYONE Contributor permissions on the Sites Space (parent container of all Sites) +patch.sitesSpacePermissions.result=Permissions corrected. +patch.sitesSpacePermissions.result.none=Permissions corrections not required. + +patch.updateWorkflowNotificationTemplates.description=Patch to update the workflow notification templates. +patch.updateWorkflowNotificationTemplates.result=Workflow Notification Templates successfully updated. + +patch.updateFollowingEmailTemplatesPatch.description=Patch to update the following notification email templates. +patch.updateFollowingEmailTemplatesPatch.result=Following notification email templates successfully updated. +patch.updateFollowingEmailTemplatesPatch.error=Error retrieving base template when trying to patch the following email templates. + +patch.addDutchEmailTemplatesPatch.description=Patch to add Dutch email templates. +patch.addDutchEmailTemplatesPatch.result=Dutch email templates have been successfully added. +patch.addDutchEmailTemplatesPatch.error=Error retrieving base template when trying to add Dutch email templates. + +patch.fixBpmPackages.description=Corrects workflow package types and associations +patch.fixBpmPackages.result=Patch successful. {0} packages converted. +patch.fixBpmPackages.invalidBootsrapStore=Bootstrap store has not been set +patch.fixBpmPackages.emptyContainer={0} node has no children + +patch.alterJBPM331CLOBcolumnsToNvarchar.description=Altering CLOB columns in the jBPM 3.3.1 tables to introduce Unicode characters support for jBPM 3.3.1 + +patch.avmIndexChildEntriesLower.description=Add an indexed column to avm_child_entries that allows case-insensitive querying of AVM files by name + +patch.imapUnsubscribedAspect.description=Patch to remove deprecated "imap:nonSubscribed" aspect from folders. +patch.imapUnsubscribedAspect.result.removed="imap:nonSubscribed" aspect was successfully removed from unsubscribed folders. + +patch.migrateTenantsFromAttrsToTable.description=Migrate Tenant attributes to Tenant table +patch.migrateTenantsFromAttrsToTable.result=Processed {0} tenants + +patch.remoteCredentialsContainer.description=Patch to add the root folder for Shared Remote Credentials +patch.syncSetDefinitionsContainer.description=Patch to add the root folder for SyncSet Definitions + +patch.swsdpPatch.description=Patch to fix up the Sample: Web Site Design Project. +patch.swsdpPatch.success=Successfully patched the Sample: Web Site Design Project. +patch.swsdpPatch.skipped=Skipped, not required. +patch.swsdpPatch.missingSurfConfig=surf-config folder is not present in Sample: Web Site Design Project. \ No newline at end of file diff --git a/config/alfresco/messages/period-provider_zh_CN.properties b/config/alfresco/messages/period-provider_zh_CN.properties new file mode 100755 index 0000000000..03b0c33c03 --- /dev/null +++ b/config/alfresco/messages/period-provider_zh_CN.properties @@ -0,0 +1,17 @@ +# PeriodProvider display label strings + +period_provider.cron=Cron \u8868\u8FBE\u5F0F +period_provider.day=\u5929 +period_provider.fmend=\u8D22\u52A1\u6708\u672B +period_provider.fqend=\u8D22\u52A1\u5B63\u5EA6\u672B +period_provider.fyend=\u8D22\u5E74\u672B +period_provider.immediately=\u7ACB\u5373 +period_provider.monthend=\u6708\u672B +period_provider.quarterend=\u5B63\u672B +period_provider.yearend=\u5E74\u672B +period_provider.month=\u6708 +period_provider.none=\u65E0 +period_provider.quarter=\u5B63\u5EA6 +period_provider.week=\u5468 +period_provider.duration=XML \u6301\u7EED\u65F6\u95F4 +period_provider.year=\u5E74 \ No newline at end of file diff --git a/config/alfresco/messages/permissions-service_zh_CN.properties b/config/alfresco/messages/permissions-service_zh_CN.properties new file mode 100755 index 0000000000..6230761547 --- /dev/null +++ b/config/alfresco/messages/permissions-service_zh_CN.properties @@ -0,0 +1,2 @@ +permissions.err_access_denied=\u8BBF\u95EE\u88AB\u62D2\u7EDD\u3002 \u60A8\u6CA1\u6709\u6267\u884C\u6B64\u64CD\u4F5C\u7684\u76F8\u5E94\u6743\u9650\u3002 +permissions.err_read_only=\u8BBF\u95EE\u88AB\u62D2\u7EDD\u3002 \u7CFB\u7EDF\u5F53\u524D\u4E3A\u53EA\u8BFB\u6A21\u5F0F\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/publishing-model_zh_CN.properties b/config/alfresco/messages/publishing-model_zh_CN.properties new file mode 100755 index 0000000000..3fa7297961 --- /dev/null +++ b/config/alfresco/messages/publishing-model_zh_CN.properties @@ -0,0 +1,20 @@ +# Display labels for Publishing Model (publishingModel.xml) + +pub_publishingmodel.description=Alfresco \u53D1\u5E03\u5185\u5BB9\u6A21\u578B + +pub_publishingmodel.type.pub_DeliveryChannel.title=\u4EA4\u4ED8\u6E20\u9053 +pub_publishingmodel.type.pub_DeliveryChannel.description=\u6240\u6709\u4EA4\u4ED8\u6E20\u9053\u7684\u57FA\u7C7B +pub_publishingmodel.type.pub_DeliveryServer.title=\u4EA4\u4ED8\u670D\u52A1\u5668 +pub_publishingmodel.type.pub_DeliveryServer.description=\u6240\u6709\u4EA4\u4ED8\u670D\u52A1\u5668\u7684\u57FA\u7C7B +pub_publishingmodel.type.pub_Environment.title=\u53D1\u5E03\u73AF\u5883 +pub_publishingmodel.type.pub_Environment.description=\u4E00\u79CD\u7528\u4E8E\u5B58\u50A8\u4EA4\u4ED8\u6E20\u9053\u96C6\u7684\u5BB9\u5668\u7C7B\u578B +pub_publishingmodel.type.pub_PublishingQueue.title=\u53D1\u5E03\u961F\u5217 +pub_publishingmodel.type.pub_PublishingQueue.description=\u4E00\u79CD\u7528\u4E8E\u5B58\u50A8\u5C1A\u672A\u5904\u7406\u7684\u53D1\u5E03\u4E8B\u4EF6\u7684\u5BB9\u5668\u7C7B\u578B + +pub_publishingmodel.aspect.pub_ContentRoot.title=\u5185\u5BB9\u6839\u5207\u9762 +pub_publishingmodel.aspect.pub_ContentRoot.description=\u6240\u5E94\u7528\u7684\u8282\u70B9\u8868\u793A\u4EA4\u4ED8\u6E20\u9053\u5185\u5BB9\u5C42\u6B21\u7ED3\u6784\u7684\u6839 + +pub_publishingmodel.association.pub_deliveryServers.title=\u4EA4\u4ED8\u670D\u52A1\u5668 +pub_publishingmodel.association.pub_deliveryServers.description=\u4E0E\u4EA4\u4ED8\u6E20\u9053\u5173\u8054\u7684\u4EA4\u4ED8\u670D\u52A1\u5668 +pub_publishingmodel.association.pub_publishingQueue.title=\u53D1\u5E03\u961F\u5217 +pub_publishingmodel.association.pub_publishingQueue.description=\u53D1\u5E03\u73AF\u5883\u7684\u53D1\u5E03\u961F\u5217 \ No newline at end of file diff --git a/config/alfresco/messages/publishing-service_zh_CN.properties b/config/alfresco/messages/publishing-service_zh_CN.properties new file mode 100755 index 0000000000..b7a6426afd --- /dev/null +++ b/config/alfresco/messages/publishing-service_zh_CN.properties @@ -0,0 +1,16 @@ +# Publish service externalised display strings +publishing.channelNotFound=\u65E0\u6CD5\u627E\u5230\u6307\u5B9A\u7684\u53D1\u5E03\u6E20\u9053\uFF1A{0} +publishing.neitherNameNorIdSpecified=\u6E20\u9053\u540D\u79F0\u548C\u6807\u8BC6\u7B26\u5747\u672A\u6307\u5B9A + +publish-content.title=\u53D1\u5E03 +publish-content.description=\u5C06\u5185\u5BB9\u53D1\u5E03\u5230\u53D1\u5E03\u6E20\u9053 +publish-content.publishChannelName.display-label=\u8981\u5C06\u5185\u5BB9\u53D1\u5E03\u5230\u7684\u6E20\u9053 +publish-content.publishChannelId.display-label=\u8981\u5C06\u5185\u5BB9\u53D1\u5E03\u5230\u7684\u6E20\u9053 +publish-content.unpublish.display-label=\u53D6\u6D88\u53D1\u5E03 +publish-content.statusUpdate.display-label=\u72B6\u6001\u66F4\u65B0 +publish-content.includeLinkInStatusUpdate.display-label=\u9644\u52A0\u72B6\u6001\u66F4\u65B0\u7684\u94FE\u63A5 +publish-content.statusUpdateChannelNames.display-label=\u8981\u5C06\u72B6\u6001\u66F4\u65B0\u53D1\u5E03\u5230\u7684\u6E20\u9053 +publish-content.statusUpdateChannelIds.display-label=\u8981\u5C06\u72B6\u6001\u66F4\u65B0\u53D1\u5E03\u5230\u7684\u6E20\u9053 +publish-content.scheduledTime.display-label=\u8BA1\u5212\u65F6\u95F4 +publish-content.comment.display-label=\u8BC4\u8BBA +publish-content.nodeToLinkStatusUpdateTo.display-label=\u8981\u5C06\u72B6\u6001\u66F4\u65B0\u94FE\u63A5\u5230\u7684\u8282\u70B9 diff --git a/config/alfresco/messages/rendition-config_zh_CN.properties b/config/alfresco/messages/rendition-config_zh_CN.properties new file mode 100755 index 0000000000..779da4b9ba --- /dev/null +++ b/config/alfresco/messages/rendition-config_zh_CN.properties @@ -0,0 +1,46 @@ +# Rendering Engines i18n properties + +# The following are common to all rendering engines +baseRenderingAction.runAs.display-label=\u8FD0\u884C\u65B9\u5F0F +baseRenderingAction.update-renditions-on-any-property-change.display-label=\u5C5E\u6027\u66F4\u6539\u65F6\u7ACB\u5373\u66F4\u65B0\u5448\u73B0 +baseRenderingAction.rendition-nodetype.display-label=\u5448\u73B0\u8282\u70B9\u7C7B\u578B +baseRenderingAction.placeHolderResourcePath.display-label=\u5360\u4F4D\u7B26\u8D44\u6E90\u8DEF\u5F84 +baseRenderingAction.sourceContentProperty.display-label=\u6E90\u5185\u5BB9\u5C5E\u6027 +baseRenderingAction.targetContentProperty.display-label=\u76EE\u6807\u5185\u5BB9\u5C5E\u6027 +baseRenderingAction.destination-path-template.display-label=\u76EE\u6807\u8DEF\u5F84\u6A21\u677F +baseRenderingAction.orphan-existing-rendition.display-label=\u73B0\u6709\u5B64\u7ACB\u5448\u73B0 + +# The following are common to all template-based rendering engines +baseTemplateRenderingAction.model.display-label=\u6A21\u578B +baseTemplateRenderingAction.template_string.display-label=\u6A21\u677F\u5B57\u7B26\u4E32 +baseTemplateRenderingAction.template_node.display-label=\u6A21\u677F\u8282\u70B9 +baseTemplateRenderingAction.template_path.display-label=\u76EE\u6807\u8DEF\u5F84 + +# reformat +reformat.title=\u6267\u884C\u91CD\u683C\u5F0F\u5316\u5448\u73B0 +reformat.description=\u4EE5\u53E6\u4E00\u79CD\u683C\u5F0F\uFF08MIME \u7C7B\u578B\uFF09\u5448\u73B0\u4E00\u6BB5\u5185\u5BB9\u3002 +reformat.flashVersion.display-label=Flash \u7248\u672C +reformat.mime-type.display-label=MIME \u7C7B\u578B + +# imageRenderingEngine +imageRenderingEngine.title=\u6267\u884C\u56FE\u50CF\u5904\u7406\u5448\u73B0 +imageRenderingEngine.xsize.display-label=\u5BBD\u5EA6 +imageRenderingEngine.ysize.display-label=\u9AD8\u5EA6 +imageRenderingEngine.isAbsolute.display-label=\u4E3A\u7EDD\u5BF9\u503C +imageRenderingEngine.maintainAspectRatio.display-label=\u4FDD\u7559\u7EB5\u6A2A\u6BD4 +imageRenderingEngine.resizeToThumbnail.display-label=\u8C03\u6574\u4E3A\u7F29\u7565\u56FE\u5927\u5C0F +imageRenderingEngine.allowEnlargement.display-label=\u5141\u8BB8\u653E\u5927 +imageRenderingEngine.crop_gravity.display-label=\u91CD\u529B +imageRenderingEngine.crop_height.display-label=\u88C1\u526A\u9AD8\u5EA6 +imageRenderingEngine.crop_width.display-label=\u88C1\u526A\u5BBD\u5EA6 +imageRenderingEngine.crop_x.display-label=\u88C1\u526A X \u8F74 +imageRenderingEngine.crop_y.display-label=\u88C1\u526A Y \u8F74 +imageRenderingEngine.percent_crop.display-label=\u6309\u767E\u5206\u6BD4\u88C1\u526A +imageRenderingEngine.commandOptions.display-label=\u547D\u4EE4\u9009\u9879 + +# freemarkerRenderingEngine +freemarkerRenderingEngine.title=\u6267\u884C\u57FA\u4E8E FreeMarker \u7684\u5448\u73B0 +freemarkerRenderingEngine.image_resolver.display-label=\u56FE\u50CF\u89E3\u6790\u5668 + +# xsltRenderingEngine +xsltRenderingEngine.title=\u6267\u884C\u57FA\u4E8E XSLT \u7684\u5448\u73B0 diff --git a/config/alfresco/messages/replication_zh_CN.properties b/config/alfresco/messages/replication_zh_CN.properties new file mode 100755 index 0000000000..fa27a6bc54 --- /dev/null +++ b/config/alfresco/messages/replication_zh_CN.properties @@ -0,0 +1,6 @@ +replication.exception.targetNotGiven=\u9700\u8981\u76EE\u6807\uFF0C\u4F46\u672A\u63D0\u4F9B +replication.exception.noPayloadsSpecified=\u672A\u6307\u5B9A\u4EFB\u4F55\u8D1F\u8F7D +replication.exception.replicationDefIsDisabled=\u65E0\u6CD5\u6267\u884C\u5DF2\u7981\u7528\u7684\u590D\u5236\u5B9A\u4E49 +replication.exception.unableToReplicate=\u65E0\u6CD5\u590D\u5236\u3002 \u672A\u542F\u7528\u590D\u5236\u670D\u52A1 +replication.exception.errorProcessingPayload=\u5904\u7406\u8D1F\u8F7D\u5217\u8868\u65F6\u51FA\u9519 - {0} +replication.exception.errorExecutingTransfer=\u6267\u884C\u4F20\u8F93\u65F6\u51FA\u9519 - {0} \ No newline at end of file diff --git a/config/alfresco/messages/repoadmin-interpreter-help_zh_CN.properties b/config/alfresco/messages/repoadmin-interpreter-help_zh_CN.properties new file mode 100755 index 0000000000..c5eb0c985f --- /dev/null +++ b/config/alfresco/messages/repoadmin-interpreter-help_zh_CN.properties @@ -0,0 +1 @@ +repoadmin_console.help=alfresco/messages/repoadmin-interpreter-help.txt diff --git a/config/alfresco/messages/rule-config_zh_CN.properties b/config/alfresco/messages/rule-config_zh_CN.properties new file mode 100755 index 0000000000..7c0420c416 --- /dev/null +++ b/config/alfresco/messages/rule-config_zh_CN.properties @@ -0,0 +1,6 @@ +# Rule types + +inbound.display-label=\u9879\u88AB\u521B\u5EFA\u6216\u8FDB\u5165\u6B64\u6587\u4EF6\u5939 +outbound.display-label=\u9879\u88AB\u5220\u9664\u6216\u79BB\u5F00\u6B64\u6587\u4EF6\u5939 +update.display-label=\u9879\u88AB\u66F4\u65B0 +inboundAndUpdate.display-label=\u9879\u88AB\u521B\u5EFA\u3001\u8FDB\u5165\u6B64\u6587\u4EF6\u5939\u6216\u88AB\u66F4\u65B0 diff --git a/config/alfresco/messages/schema-update_zh_CN.properties b/config/alfresco/messages/schema-update_zh_CN.properties new file mode 100755 index 0000000000..cc750e14a3 --- /dev/null +++ b/config/alfresco/messages/schema-update_zh_CN.properties @@ -0,0 +1,30 @@ +# Schema update messages + +schema.update.msg.dialect_used=Schema managed by database dialect {0}. +schema.update.msg.bypassing=Bypassing schema update checks. +schema.update.msg.normalized_schema=Normalized schema dumped to file {0}. +schema.update.msg.normalized_schema_pre=Normalized schema (pre-bootstrap) dumped to file {0}. +schema.update.msg.normalized_schema_post=Normalized schema (post-bootstrap) dumped to file {0}. +schema.update.msg.all_statements=All executed statements: {0}. +schema.update.msg.no_changes=No changes were made to the schema. +schema.update.msg.executing_generated_script=Executing database script {0} (Generated). +schema.update.msg.executing_copied_script=Executing database script {0} (Copied from {1}). +schema.update.msg.executing_statement= Executing statement: {0} +schema.update.msg.optional_statement_failed=Optional statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3} +schema.update.warn.dialect_unsupported=Alfresco should not be used with database dialect {0}. +schema.update.warn.dialect_hsql=Alfresco is using the HSQL default database. Please only use this while evaluating Alfresco, it is NOT recommended for production or deployment! +schema.update.warn.dialect_derby=Alfresco is using the Apache Derby default database. Please only use this while evaluating Alfresco, it is NOT recommended for production or deployment! +schema.update.warn.dialect_substituting=The dialect ''{0}'' is being changed to ''{1}''. +schema.update.err.forced_stop=The property 'stopAfterSchemaBootstrap' has been set. The bootstrap process is being terminated. +schema.update.err.dialect_should_use=The dialect ''{0}'' is unsupported. Please use ''{1}'' instead. +schema.update.err.found_multiple=\nMore than one Alfresco schema was found when querying the database metadata.\n Limit the database user's permissions or set the 'hibernate.default_schema' property in 'custom-hibernate-dialect.properties'. +schema.update.err.previous_failed=A previous schema upgrade failed or was not completed. Revert to the original database before attempting the upgrade again. +schema.update.err.statement_failed=Statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3} +schema.update.err.update_failed=Schema auto-update failed +schema.update.err.validation_failed=Schema validation failed +schema.update.err.update_script_not_run=The following schema upgrade script needs to be executed manually: {0} +schema.update.err.script_not_found=The schema script could not be found at location {0} +schema.update.err.statement_include_before_sql=Script include ''--INCLUDE:'' must occur before starting the SQL statement (line {0} of {1}). +schema.update.err.statement_var_assignment_before_sql=Variable assignment with ''--ASSIGN:'' must occur before starting the SQL statement (line {0} of {1}). +schema.update.err.statement_var_assignment_format=Variable assignment uses format ''--ASSIGN:x=col'' where ''x'' is the variable to assign to and ''col'' is the column value to extract (line {0} of {1}). +schema.update.err.statement_terminator=Scripts must terminate all statements with '';'' (line {0} of {1}). diff --git a/config/alfresco/messages/site-service_zh_CN.properties b/config/alfresco/messages/site-service_zh_CN.properties new file mode 100755 index 0000000000..390786624e --- /dev/null +++ b/config/alfresco/messages/site-service_zh_CN.properties @@ -0,0 +1,13 @@ +# Site service externalised display strings + +site_service.unable_to_create=\u65E0\u6CD5\u521B\u5EFA\u7AD9\u70B9\uFF0C\u56E0\u4E3A\u7AD9\u70B9\u77ED\u540D\u79F0 {0} \u5DF2\u88AB\u4F7F\u7528\u3002 \u7AD9\u70B9\u77ED\u540D\u79F0\u5FC5\u987B\u552F\u4E00\u3002 +site_service.visibility_group_missing=\u65E0\u6CD5\u521B\u5EFA\u7AD9\u70B9\uFF0C\u56E0\u4E3A\u53EF\u89C1\u6027\u7EC4 {0} \u4E0D\u5B58\u5728\u3002 +site_service.can_not_update=\u65E0\u6CD5\u66F4\u65B0\u7AD9\u70B9 {0}\uFF0C\u56E0\u4E3A\u8BE5\u7AD9\u70B9\u4E0D\u5B58\u5728\u3002 +site_service.can_not_delete=\u65E0\u6CD5\u5220\u9664\u7AD9\u70B9 {0}\uFF0C\u56E0\u4E3A\u8BE5\u7AD9\u70B9\u4E0D\u5B58\u5728\u3002 +site_service.site_no_exist=\u7AD9\u70B9 {0} \u4E0D\u5B58\u5728\u3002 +site_service.do_not_remove_manager=\u7AD9\u70B9\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u7AD9\u70B9\u7BA1\u7406\u5458\u3002 \u4E0D\u80FD\u4ECE\u7AD9\u70B9\u6210\u5458\u8D44\u683C\u79FB\u9664 {0}\uFF0C\u56E0\u4E3A\u540E\u8005\u662F\u5F53\u524D\u552F\u4E00\u7684\u7AD9\u70B9\u7BA1\u7406\u5458\u3002 +site_service.can_not_remove_membership=\u5F53\u524D\u7528\u6237\u6743\u9650\u4E0D\u8DB3\uFF0C\u4E0D\u80FD\u5220\u9664\u7AD9\u70B9 {0} \u7684\u6210\u5458\u8D44\u683C\u8BE6\u7EC6\u4FE1\u606F\u3002 +site_service.do_not_change_manager=\u7AD9\u70B9\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u7AD9\u70B9\u7BA1\u7406\u5458\u3002 \u4E0D\u80FD\u66F4\u6539 {0} \u7684\u89D2\u8272\uFF0C\u56E0\u4E3A\u8FD9\u662F\u5F53\u524D\u552F\u4E00\u7684\u7AD9\u70B9\u7BA1\u7406\u5458\u3002 +site_service.can_not_change_membership=\u5F53\u524D\u7528\u6237\u6743\u9650\u4E0D\u8DB3\uFF0C\u4E0D\u80FD\u4FEE\u6539\u7AD9\u70B9 {0} \u7684\u6210\u5458\u8D44\u683C\u8BE6\u7EC6\u4FE1\u606F\u3002 +site_service.site_container_not_folder=\u7AD9\u70B9\u5BB9\u5668 {0} \u4E0D\u80FD\u5F15\u7528\u6587\u4EF6\u5939\u3002 +site_service.invalid_site_type=\u65E0\u6CD5\u521B\u5EFA\u7AD9\u70B9\uFF0C\u56E0\u4E3A {0} \u4E0D\u662F\u6709\u6548\u7684\u7AD9\u70B9\u7C7B\u578B\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/slingshot_zh_CN.properties b/config/alfresco/messages/slingshot_zh_CN.properties new file mode 100755 index 0000000000..f3a8a748b1 --- /dev/null +++ b/config/alfresco/messages/slingshot_zh_CN.properties @@ -0,0 +1 @@ +# dummy file to allow repository context (activities feed notification) to start without slingshot - will be overwritten by build \ No newline at end of file diff --git a/config/alfresco/messages/subscription-service_zh_CN.properties b/config/alfresco/messages/subscription-service_zh_CN.properties new file mode 100755 index 0000000000..ff1f599627 --- /dev/null +++ b/config/alfresco/messages/subscription-service_zh_CN.properties @@ -0,0 +1,7 @@ +# Subscription service messages + +subscription.notification.email.subject={0} \u73B0\u5728\u6B63\u5728\u5173\u6CE8\u60A8 + +subscription_service.err.disabled=\u6B64\u8BA2\u9605\u5DF2\u7981\u7528 +subscription_service.err.write-denied=\u65E0\u6743\u66F4\u65B0 +subscription_service.err.private-list=\u6B64\u5217\u8868\u5DF2\u6807\u8BB0\u4E3A\u79C1\u6709 \ No newline at end of file diff --git a/config/alfresco/messages/system-messages_zh_CN.properties b/config/alfresco/messages/system-messages_zh_CN.properties new file mode 100755 index 0000000000..a3f80477fc --- /dev/null +++ b/config/alfresco/messages/system-messages_zh_CN.properties @@ -0,0 +1,79 @@ +# System-related messages + +# Note to Translators: Only some of the strings below should be localised +# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines. + +system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2}) +system.err.duplicate_name=Duplicate child name not allowed: {0} + +# Bootstrap configuration check messages + +system.config_check.warn.dir_root=The Alfresco ''dir.root'' property is set to a relative path ''{0}''. ''dir.root'' should be overridden to point to a specific folder. +system.config_check.msg.dir_root=The Alfresco root data directory (''dir.root'') is: {0} +system.config_check.err.indexes.duplicate_root_node=The store ''{0}'' has a duplicate root node entry. +system.config_check.err.missing_index=CONTENT INTEGRITY ERROR: Indexes not found for {0} stores. +system.config_check.err.missing_content=CONTENT INTEGRITY ERROR: System content not found in content store. +system.config_check.err.fix_dir_root=Ensure that the ''dir.root'' property is pointing to the correct data location. +system.config_check.msg.howto_index_recover=You may set 'index.recovery.mode=FULL' if you need to rebuild the indexes. +system.config_check.warn.starting_with_errors=Alfresco is starting with errors. + +# Schema comparator messages +# Log messages... +system.schema_comp.debug.no_ref_file=No reference schema file, expected: {0} +system.schema_comp.debug.time_taken=Schema validation took {0} ms +system.schema_comp.info.all_ok=Compared database schema with reference schema (all OK): {0} +system.schema_comp.warn.problems_found=Schema validation found {0} potential problems, results written to: {1} +# Generic differencing, validation and redundancy messages... +system.schema_comp.diff=Difference: expected {0} {1}="{2}", but was {3}="{4}" +system.schema_comp.diff.ref_only=Difference: missing {0} from database, expected at path: {1} +system.schema_comp.diff.target_only=Difference: unexpected {0} found in database with path: {1} +system.schema_comp.redundant_obj=Redundancy: {0} items matching {1}, matches: {2} +system.schema_comp.redundant_obj.many_matches={0} redundant items? reference: {1}, matches: {2} and {3} more... +system.schema_comp.validation=Validation: {0} {1}="{2}" fails to match rule: {3} +# Specific validator (implementations) messages... +system.schema_comp.name_validator=name must match pattern ''{0}'' +system.schema_comp.schema_version_validator=version must be at least ''{0}'' + +# OpenOffice +system.openoffice.info.connection_verified=The connection to OpenOffice has been established. +system.openoffice.err.connection_failed=An initial OpenOffice connection could not be established. +system.openoffice.err.connection_lost=The OpenOffice connection has been lost. +system.openoffice.err.connection_remade=The OpenOffice connection was re-established. + +# Locks +system.locks.err.failed_to_acquire_lock=Failed to get lock ''{0}'' using token ''{1}''. +system.locks.err.lock_resource_missing=Failed to manipulate lock ''{0}'' using token ''{1}''. The lock resource no longer exists. +system.locks.err.lock_update_count=Failed to update lock ''{0}'' using token ''{1}''. {2} locks were updated when {3} should have been. +system.locks.err.failed_to_release_lock=Failed to release lock ''{0}'' using token ''{1}''. The lock has expired and been taken by another process. +system.locks.err.excl_lock_exists=Failed to get lock ''{0}'' using token ''{1}''. An exclusive lock exists: {2} + +# Multi-Tenant +system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt/mt-admin-context.xml (to use latest alfresco/extension/mt/mt-admin-context.xml.sample). +system.mt.disabled=Tenant is disabled: {0} + +# Usages +system.usage.err.no_txn=RepoUsageComponent must be called in a transaction. +system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction. + +# START TRANSLATION +system.usage.warn.limit_users_approached=\u5373\u5C06\u8FBE\u5230\u5141\u8BB8\u7684\u7528\u6237\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u6709 {1} \u4F4D\u7528\u6237\u3002 +system.usage.warn.limit_users_reached=\u5DF2\u7ECF\u8FBE\u5230\u5141\u8BB8\u7684\u7528\u6237\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u6709 {1} \u4F4D\u7528\u6237\u3002 +system.usage.warn.limit_documents_approached=\u5373\u5C06\u8FBE\u5230\u5141\u8BB8\u7684\u5185\u5BB9\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u6709 {1} \u4E2A\u5185\u5BB9\u5BF9\u8C61\u3002 +system.usage.warn.limit_documents_reached=\u5DF2\u7ECF\u8FBE\u5230\u5141\u8BB8\u7684\u5185\u5BB9\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u6709 {1} \u4E2A\u5185\u5BB9\u5BF9\u8C61\u3002 +system.usage.err.limit_users_exceeded=\u5DF2\u7ECF\u8D85\u8FC7\u5141\u8BB8\u7684\u7528\u6237\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u76EE\u524D\u6709 {1} \u4F4D\u7528\u6237\u3002 +system.usage.err.limit_users_exceeded_verbose=\u5DF2\u7ECF\u8D85\u8FC7\u5141\u8BB8\u7684\u7528\u6237\u9650\u989D {0}\u3002 \u6DFB\u52A0\u7684\u7528\u6237\u6570\uFF1A{1} +system.usage.err.limit_documents_exceeded=\u5DF2\u7ECF\u8D85\u8FC7\u5141\u8BB8\u7684\u5185\u5BB9\u9650\u989D {0}\u3002 \u7CFB\u7EDF\u4E2D\u76EE\u524D\u6709 {1} \u4E2A\u5185\u5BB9\u5BF9\u8C61\u3002 +system.usage.err.limit_license_expiring=Alfresco \u8BB8\u53EF\u8BC1\u5C06\u5728 {0} \u5929\u540E\u5230\u671F\u3002 +system.usage.err.limit_license_expired=Alfresco \u8BB8\u53EF\u8BC1\u5DF2\u5230\u671F\u3002 + +# License +system.license.msg.unknown=\u672A\u77E5 +system.license.msg.unlimited=\u4E0D\u53D7\u9650\u5236 +system.license.msg.does_not_expire=\u4E0D\u4F1A\u5230\u671F +system.license.msg.reloaded=Alfresco \u8BB8\u53EF\u8BC1\u5DF2\u88AB\u91CD\u8F7D\u3002 +system.license.err.reloadFailed=\u91CD\u8F7D\u8BB8\u53EF\u8BC1\u5931\u8D25\uFF1A{0} +# END TRANSLATION + +# Startup message +system.info.startup=Alfresco started ({0}{1}{2}). Current version: {3} schema {4}. Originally installed version: {5} schema {6}. +system.warn.readonly=Alfresco is currently in read-only mode. Please check your license. \ No newline at end of file diff --git a/config/alfresco/messages/system-model_zh_CN.properties b/config/alfresco/messages/system-model_zh_CN.properties new file mode 100755 index 0000000000..778e982f3b --- /dev/null +++ b/config/alfresco/messages/system-model_zh_CN.properties @@ -0,0 +1,45 @@ +# Display labels for System Model + +sys_systemmodel.description=Alfresco \u7CFB\u7EDF\u6A21\u578B + +sys_systemmodel.type.sys_base.title=\u57FA +sys_systemmodel.type.sys_base.description=\u57FA + +sys_systemmodel.type.sys_container.title=\u5BB9\u5668 +sys_systemmodel.type.sys_container.description=\u5BB9\u5668 +sys_systemmodel.association.sys_children.title=\u5B50\u7EA7 +sys_systemmodel.association.sys_children.description=\u5B50\u7EA7 + +sys_systemmodel.type.sys_store_root.title=\u5E93\u6839 +sys_systemmodel.type.sys_store_root.description=\u5E93\u6839 + +sys_systemmodel.type.sys_reference.title=\u5F15\u7528 +sys_systemmodel.type.sys_reference.description=\u5F15\u7528 +sys_systemmodel.property.sys_reference.title=\u5F15\u7528 +sys_systemmodel.property.sys_reference.description=\u5F15\u7528 + +sys_systemmodel.property.sys_locale.title=\u533A\u57DF\u8BBE\u7F6E +sys_systemmodel.property.sys_locale.description=\u533A\u57DF\u8BBE\u7F6E + +sys_systemmodel.aspect.aspect_root.title=\u6839 +sys_systemmodel.aspect.aspect_root.description=\u6839 + +sys_systemmodel.aspect.sys_referenceable.title=\u53EF\u5F15\u7528 +sys_systemmodel.aspect.sys_referenceable.description=\u53EF\u5F15\u7528 +sys_systemmodel.property.sys_store-protocol.title=\u5E93\u534F\u8BAE +sys_systemmodel.property.sys_store-protocol.description=\u5E93\u534F\u8BAE +sys_systemmodel.property.sys_store-identifier.title=\u5E93\u6807\u8BC6\u7B26 +sys_systemmodel.property.sys_store-identifier.description=\u5E93\u6807\u8BC6\u7B26 +sys_systemmodel.property.sys_node-uuid.title=\u8282\u70B9\u6807\u8BC6\u7B26 +sys_systemmodel.property.sys_node-uuid.description=\u8282\u70B9\u6807\u8BC6\u7B26 +sys_systemmodel.property.sys_node-dbid.title=\u8282\u70B9\u6570\u636E\u5E93\u6807\u8BC6\u7B26 +sys_systemmodel.property.sys_node-dbid.description=\u8282\u70B9\u6570\u636E\u5E93\u6807\u8BC6\u7B26 + +sys_systemmodel.aspect.sys_archived.title=\u5DF2\u5B58\u6863 +sys_systemmodel.aspect.sys_archived.description=\u5DF2\u5B58\u6863\u8282\u70B9 +sys_systemmodel.property.sys_archivedBy.title=\u5B58\u6863\u8005 +sys_systemmodel.property.sys_archivedBy.description=\u5B58\u6863\u8005 +sys_systemmodel.property.sys_archivedDate.title=\u5B58\u6863\u65E5\u671F +sys_systemmodel.property.sys_archivedDate.description=\u5B58\u6863\u65E5\u671F +sys_systemmodel.property.sys_archivedOriginalPath.title=\u539F\u59CB\u4F4D\u7F6E +sys_systemmodel.property.sys_archivedOriginalPath.description=\u539F\u59CB\u4F4D\u7F6E diff --git a/config/alfresco/messages/template-service_zh_CN.properties b/config/alfresco/messages/template-service_zh_CN.properties new file mode 100755 index 0000000000..8e2d045f29 --- /dev/null +++ b/config/alfresco/messages/template-service_zh_CN.properties @@ -0,0 +1,5 @@ +# Template Service externalised display strings + +error_no_template=\u65E0\u6CD5\u627E\u5230\u6A21\u677F ''{0}''\u3002 \u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u5458\u3002 +error_template_fail=\u5904\u7406\u6A21\u677F ''{0}'' \u671F\u95F4\u51FA\u9519\u3002 \u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u5458\u3002 +error_template_io=\u5904\u7406\u6A21\u677F ''{0}'' \u671F\u95F4\u51FA\u73B0\u4E86 IO \u9519\u8BEF\u3002 \u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u5458\u3002 diff --git a/config/alfresco/messages/templates-messages_zh_CN.properties b/config/alfresco/messages/templates-messages_zh_CN.properties new file mode 100755 index 0000000000..1da41c0eae --- /dev/null +++ b/config/alfresco/messages/templates-messages_zh_CN.properties @@ -0,0 +1,88 @@ +#translatable.ftl +templates.translatable.translatable=\u53EF\u7FFB\u8BD1\uFF1A +templates.translatable.yes=\u662F +templates.translatable.no=\u5426 +templates.translatable.no_document_found=\u672A\u627E\u5230\u4EFB\u4F55\u6587\u6863 + +#show_audit.ftl +templates.show_audit.current_document_audit_info=\u5F53\u524D\u6587\u6863\u5BA1\u6838\u4FE1\u606F +templates.show_audit.name=\u540D\u79F0\uFF1A +templates.show_audit.user_name=\u7528\u6237\u540D +templates.show_audit.application=\u5E94\u7528\u7A0B\u5E8F +templates.show_audit.service=\u670D\u52A1 +templates.show_audit.method=\u65B9\u6CD5 +templates.show_audit.timestamp=\u65F6\u95F4\u6233\u8BB0 +templates.show_audit.values=\u5BA1\u6838\u6761\u76EE\u503C +templates.show_audit.failed=\u5931\u8D25 +templates.show_audit.message=\u6D88\u606F +templates.show_audit.arg_1=\u53C2\u6570 1 +templates.show_audit.arg_2=\u53C2\u6570 2 +templates.show_audit.arg_3=\u53C2\u6570 3 +templates.show_audit.arg_4=\u53C2\u6570 4 +templates.show_audit.arg_5=\u53C2\u6570 5 +templates.show_audit.return=\u8FD4\u56DE +templates.show_audit.thowable=\u53EF\u5F15\u53D1 +templates.show_audit.tx=TX +templates.show_audit.current_space_audit_info=\u5F53\u524D\u7A7A\u95F4\u5BA1\u6838\u4FE1\u606F\uFF1A + +#recent_docs.ftl +templates.recent_docs.documents_created_or_modified_in_the_last_week=\u4E0A\u5468\u521B\u5EFA\u6216\u4FEE\u6539\u7684\u6587\u6863 +templates.recent_docs.name=\u540D\u79F0 +templates.recent_docs.created_date=\u521B\u5EFA\u65E5\u671F +templates.recent_docs.modified_date=\u4FEE\u6539\u65E5\u671F + +#my_summary.ftl +templates.my_summary.name=\u540D\u79F0\uFF1A +templates.my_summary.user=\u7528\u6237\uFF1A +templates.my_summary.home_space_location=\u4E3B\u7A7A\u95F4\u4F4D\u7F6E\uFF1A +templates.my_summary.items_in_home_space=\u4E3B\u7A7A\u95F4\u4E2D\u7684\u9879\uFF1A +templates.my_summary.items_in_company_space=\u516C\u53F8\u7A7A\u95F4\u4E2D\u7684\u9879\uFF1A + +#my_docs.ftl +templates.my_docs.name=\u540D\u79F0 +templates.my_docs.size=\u5927\u5C0F +templates.my_docs.modified.date=\u4FEE\u6539\u65E5\u671F +templates.my_docs.locked=\u5DF2\u9501\u5B9A +templates.my_docs.kb=KB +templates.my_docs.yes=\u662F + +#localizable.ftl +templates.localizable.localisable=\u53EF\u672C\u5730\u5316\uFF1A +templates.localizable.yes=\u662F +templates.localizable.locale=\u533A\u57DF\u8BBE\u7F6E\uFF1A +templates.localizable.no=\u5426 +templates.localizable.no_document_found=\u672A\u627E\u5230\u4EFB\u4F55\u6587\u6863\uFF01 + +#general_example.ftl +templates.general_example.example_template_start======\u793A\u4F8B\u6A21\u677F\u5F00\u59CB===== +templates.general_example.company_home_space=\u516C\u53F8\u4E3B\u7A7A\u95F4\uFF1A +templates.general_example.my_home_space=\u6211\u7684\u4E3B\u7A7A\u95F4\uFF1A +templates.general_example.company_home_children_count=\u516C\u53F8\u4E3B\u7A7A\u95F4\u5B50\u7EA7\u8BA1\u6570\uFF1A +templates.general_example.company_home_first_child_node_name=\u516C\u53F8\u4E3B\u7A7A\u95F4\u7B2C\u4E00\u4E2A\u5B50\u8282\u70B9\u540D\u79F0\uFF1A +templates.general_example.current_document_name=\u5F53\u524D\u6587\u6863\u540D\u79F0\uFF1A +templates.general_example.current_space_name=\u5F53\u524D\u7A7A\u95F4\u540D\u79F0\uFF1A +templates.general_example.list_of_child_spaces_in_my_home_space=\u6211\u7684\u4E3B\u7A7A\u95F4\u4E2D\u7684\u5B50\u7A7A\u95F4\u5217\u8868\uFF1A +templates.general_example.path=\u8DEF\u5F84\uFF1A +templates.general_example.list_of_docs_in_my_home_space=\u6211\u7684\u4E3B\u7A7A\u95F4\u4E2D\u7684\u6587\u6863\u5217\u8868\uFF08\u4EC5\u5305\u542B\u6587\u672C\u7684\u5185\u5BB9\u76F4\u63A5\u663E\u793A\uFF0CJPG \u56FE\u50CF\u663E\u793A\u4E3A\u7F29\u7565\u56FE\uFF09\uFF1A +templates.general_example.assoc_example=Assoc \u793A\u4F8B\uFF1A +templates.general_example.example_template_end======\u793A\u4F8B\u6A21\u677F\u7ED3\u675F===== + +#doc_info.ftl +templates.doc_info.current_document_info=\u5F53\u524D\u6587\u6863\u4FE1\u606F\uFF1A +templates.doc_info.name=\u540D\u79F0\uFF1A +templates.doc_info.ref=\u5F15\u7528\uFF1A +templates.doc_info.type=\u7C7B\u578B\uFF1A +templates.doc_info.dbid=DBID\uFF1A +templates.doc_info.content_url=\u5185\u5BB9 URL\uFF1A +templates.doc_info.locked=\u5DF2\u9501\u5B9A\uFF1A +templates.doc_info.counter=\u8BA1\u6570\u5668\uFF1A +templates.doc_info.aspects=\u5207\u9762\uFF1A +templates.doc_info.assocs=Assoc\uFF1A +templates.doc_info.properties=\u5C5E\u6027\uFF1A +templates.doc_info.no_document_found=\u672A\u627E\u5230\u4EFB\u4F55\u6587\u6863\uFF01 + +#invite_user_email.ftl +templates.invite_user_email.invited_to_space={1} \u5DF2\u9080\u8BF7\u60A8\u8BBF\u95EE ''{0}'' +templates.invite_user_email.role=\u60A8\u7684\u89D2\u8272\u4E3A\uFF1A{0} +templates.invite_user_email.you_can_view_the_space=\u60A8\u53EF\u901A\u8FC7 Alfresco \u5BA2\u6237\u7AEF\u67E5\u770B\u6B64\u7A7A\u95F4 +templates.invite_user_email.regards=\u987A\u795D\u5546\u797A diff --git a/config/alfresco/messages/tenant-interpreter-help_zh_CN.properties b/config/alfresco/messages/tenant-interpreter-help_zh_CN.properties new file mode 100755 index 0000000000..8314d0f5e3 --- /dev/null +++ b/config/alfresco/messages/tenant-interpreter-help_zh_CN.properties @@ -0,0 +1 @@ +tenant_console.help=alfresco/messages/tenant-interpreter-help.txt diff --git a/config/alfresco/messages/transfer-model_zh_CN.properties b/config/alfresco/messages/transfer-model_zh_CN.properties new file mode 100755 index 0000000000..bd54c11985 --- /dev/null +++ b/config/alfresco/messages/transfer-model_zh_CN.properties @@ -0,0 +1,92 @@ +# Display labels for Transfer Model + +trx_applicationmodel.description=Alfresco \u4F20\u8F93\u5E94\u7528\u7A0B\u5E8F\u6A21\u578B + +trx_applicationmodel.type.trx_transferGroup.title=\u4F20\u8F93\u7EC4 +trx_applicationmodel.type.trx_transferGroup.description=\u4F20\u8F93\u7EC4\u7684\u5B9A\u4E49 + +trx_applicationmodel.type.trx_transferLock.title=\u4F20\u8F93\u9501\u5B9A +trx_applicationmodel.type.trx_transferLock.description=\u7528\u4E8E\u8868\u793A\u4F20\u8F93\u9501\u5B9A\u8282\u70B9\u7684\u8282\u70B9\u7C7B\u578B + +trx_applicationmodel.type.trx_transferRecord.title=\u4F20\u8F93\u8BB0\u5F55 +trx_applicationmodel.type.trx_transferRecord.description=\u7528\u4E8E\u8BB0\u5F55\u4F20\u8F93\u4FE1\u606F\u7684\u8282\u70B9\u7C7B\u578B + +trx_applicationmodel.type.trx_tempTransferStore.title=\u4E34\u65F6\u4F20\u8F93\u5E93 +trx_applicationmodel.type.trx_tempTransferStore.description=\u7528\u4E8E\u5B58\u50A8\u4E34\u65F6\u5B64\u7ACB\u5165\u7AD9\u8282\u70B9\u7684\u8282\u70B9\u7C7B\u578B + +trx_applicationmodel.type.trx_transferReport.title=\u4F20\u8F93\u62A5\u544A +trx_applicationmodel.type.trx_transferReport.description=\u4F20\u8F93\u62A5\u544A + +trx_applicationmodel.type.trx_transferReportDest.title=\u6765\u81EA\u76EE\u6807\u7684\u4F20\u8F93\u62A5\u544A +trx_applicationmodel.type.trx_transferReportDest.description=\u6765\u81EA\u76EE\u6807\u7684\u4F20\u8F93\u62A5\u544A + +trx_applicationmodel.type.trx_transferTarget.title=\u4F20\u8F93\u76EE\u6807 +trx_applicationmodel.type.trx_transferTarget.description=\u4F20\u8F93\u76EE\u6807\u7684\u5B9A\u4E49 + +trx_applicationmodel.type.trx_fileTransferTarget.title=\u6587\u4EF6\u4F20\u8F93\u76EE\u6807 +trx_applicationmodel.type.trx_fileTransferTarget.description=\u6587\u4EF6\u4F20\u8F93\u76EE\u6807\u7684\u5B9A\u4E49 + +trx_applicationmodel.property.trx_endpointhost.title=\u7AEF\u70B9\u4E3B\u673A +trx_applicationmodel.property.trx_endpointhost.description=\u7AEF\u70B9\u4E3B\u673A + +trx_applicationmodel.property.trx_endpointport.title=\u7AEF\u70B9\u7AEF\u53E3 +trx_applicationmodel.property.trx_endpointport.description=\u7AEF\u70B9\u7AEF\u53E3 + +trx_applicationmodel.property.trx_endpointpath.title=\u7AEF\u70B9\u8DEF\u5F84 +trx_applicationmodel.property.trx_endpointpath.description=\u7AEF\u70B9\u8DEF\u5F84 + +trx_applicationmodel.property.trx_endpointprotocol.title=\u7AEF\u70B9\u534F\u8BAE +trx_applicationmodel.property.trx_endpointprotocol.description=\u7AEF\u70B9\u534F\u8BAE + +trx_applicationmodel.property.trx_enabled.title=\u5DF2\u542F\u7528 +trx_applicationmodel.property.trx_enabled.description=\u5DF2\u542F\u7528\u8FD8\u662F\u5DF2\u7981\u7528 + +trx_applicationmodel.property.trx_username.title=\u7528\u6237\u540D +trx_applicationmodel.property.trx_username.description=\u7528\u6237\u540D + +trx_applicationmodel.property.trx_password.title=\u5BC6\u7801 +trx_applicationmodel.property.trx_password.description=\u5BC6\u7801 + +trx_applicationmodel.property.trx_progressPosition.title=\u8FDB\u5EA6\u4F4D\u7F6E +trx_applicationmodel.property.trx_progressPosition.description=\u8FDB\u5EA6\u4F4D\u7F6E + +trx_applicationmodel.property.trx_progressEndpoint.title=\u8FDB\u5EA6\u7EC8\u70B9 +trx_applicationmodel.property.trx_progressEndpoint.description=\u8FDB\u5EA6\u7EC8\u70B9 + +trx_applicationmodel.property.trx_transferStatus.title=\u4F20\u8F93\u72B6\u6001 +trx_applicationmodel.property.trx_transferStatus.description=\u4F20\u8F93\u72B6\u6001 + +trx_applicationmodel.property.trx_transferError.title=\u4F20\u8F93\u9519\u8BEF +trx_applicationmodel.property.trx_transferError.description=\u4F20\u8F93\u9519\u8BEF + +trx_applicationmodel.property.trx_transferId.title=\u4F20\u8F93 ID +trx_applicationmodel.property.trx_transferId.description=\u4F20\u8F93 ID + +trx_applicationmodel.property.trx_invadedBy.title=\u5165\u4FB5\u8005 +trx_applicationmodel.property.trx_invadedBy.description=\u5165\u4FB5\u4E86\u6B64\u8282\u70B9\u7684\u5B58\u50A8\u5E93 + +trx_applicationmodel.property.trx_repositoryId.title=\u6E90\u5B58\u50A8\u5E93\u3002 +trx_applicationmodel.property.trx_repositoryId.description=\u6B64\u8282\u70B9\u6E90\u81EA\u7684\u5B58\u50A8\u5E93 ID\u3002 + +trx_applicationmodel.property.trx_fromRepositoryId.title=\u6765\u6E90\u5B58\u50A8\u5E93 ID +trx_applicationmodel.property.trx_fromContent.description=\u968F\u6B64\u8282\u70B9\u4F20\u8F93\u7684\u5185\u5BB9 URL + +trx_applicationmodel.association.trx_orphan.title=\u5B64\u7ACB\u4F20\u8F93 +trx_applicationmodel.association.trx_orphan.description=\u5B64\u7ACB\u4F20\u8F93 + +trx_applicationmodel.association.trx_fileTransferRootNode.title=\u6839\u6587\u4EF6\u5939 +trx_applicationmodel.association.trx_fileTransferRootNode.description=\u4E0E\u76EE\u6807\u7684\u6839\u6587\u4EF6\u5939\u5BF9\u5E94\u7684\u672C\u5730\u6587\u4EF6\u5939\u8282\u70B9 + +trx_applicationmodel.aspect.trx_transferRelated.title=\u76F8\u5173\u4F20\u8F93 +trx_applicationmodel.aspect.trx_transferRelated.description=\u5177\u6709\u6B64\u5207\u9762\u7684\u8282\u70B9\u4E0E\u7279\u5B9A\u4F20\u8F93\u6709\u5173\u3002 + +trx_applicationmodel.aspect.trx_enableable.title=\u53EF\u542F\u7528 +trx_applicationmodel.aspect.trx_enableable.description=\u53EF\u542F\u7528 + +trx_applicationmodel.aspect.trx_transferred.name=\u5DF2\u4F20\u8F93 +trx_applicationmodel.aspect.trx_transferred.description=\u5177\u6709\u6B64\u5207\u9762\u7684\u8282\u70B9\u5DF2\u4ECE\u4E00\u4E2A\u5B58\u50A8\u5E93\u4F20\u8F93\u5230\u53E6\u4E00\u4E2A\u5B58\u50A8\u5E93\u3002 + +trx_applicationmodel.aspect.trx_alien.name=\u5916\u6765\u4F20\u8F93 +trx_applicationmodel.aspect.trx_alien.description=\u5177\u6709\u6B64\u5207\u9762\u7684\u8282\u70B9\u662F\u5916\u6765\u8282\u70B9\u6216\u5DF2\u88AB\u5176\u4ED6\u5916\u6765\u8282\u70B9\u5165\u4FB5 + + diff --git a/config/alfresco/messages/transfer-service_zh_CN.properties b/config/alfresco/messages/transfer-service_zh_CN.properties new file mode 100755 index 0000000000..99bd9217f2 --- /dev/null +++ b/config/alfresco/messages/transfer-service_zh_CN.properties @@ -0,0 +1,47 @@ +# Transfer service externalised display strings + +transfer_service.unable_to_find_transfer_home=\u65E0\u6CD5\u627E\u5230\u4F20\u8F93\u4E3B\u5BF9\u8C61\uFF1A{0} +transfer_service.unable_to_find_transfer_group=\u65E0\u6CD5\u627E\u5230\u540D\u79F0\u4E3A {0} \u7684\u4F20\u8F93\u7EC4 +transfer_service.unable_to_find_transfer_target=\u65E0\u6CD5\u627E\u5230\u540D\u79F0\u4E3A {0} \u7684\u4F20\u8F93\u76EE\u6807 +transfer_service.unable_to_transfer_async=\u65E0\u6CD5\u5F02\u6B65\u4F20\u8F93 +transfer_service.target_exists=\u65E0\u6CD5\u65B0\u5EFA\u540D\u79F0\u4E3A {0} \u7684\u4F20\u8F93\u76EE\u6807\uFF0C\u56E0\u4E3A\u5DF2\u5B58\u5728\u6B64\u540D\u79F0\u7684\u76EE\u6807\u3002 +transfer_service.comms.unsupported_protocol=\u534F\u8BAE\u4E0D\u53D7\u652F\u6301\uFF1A{0} +transfer_service.comms.unsuccessful_response=\u4ECE\u76EE\u6807\u670D\u52A1\u5668\u6536\u5230\u672A\u6210\u529F\u54CD\u5E94\u4EE3\u7801\uFF1A{0}\u3001{1} +transfer_service.comms.http_request_failed=\u6267\u884C\u5BF9\u76EE\u6807 {1} \u7684 HTTP \u8BF7\u6C42 {0} \u5931\u8D25\uFF0C\u72B6\u6001\u4E3A {2} +transfer_service.incompatible_versions=\u65E0\u6CD5\u5728\u4E0D\u517C\u5BB9\u7684\u7248\u672C\u4E4B\u95F4\u6267\u884C {1} \u5230 {2} \u7684\u4F20\u8F93\uFF0CtransferId\uFF1A{0} +transfer_service.no_nodes=\u65E0\u8981\u4F20\u8F93\u7684\u8282\u70B9 +transfer_service.target_not_enabled=\u4F20\u8F93\u76EE\u6807\u672A\u542F\u7528 {0} +transfer_service.cancelled=\u4F20\u8F93\u88AB\u53D6\u6D88 +transfer_service.failed_to_get_transfer_status=\u4ECE\u76EE\u6807 {0} \u68C0\u7D22\u4F20\u8F93\u72B6\u6001\u5931\u8D25 +transfer_service.target_error=\u4F20\u8F93\u76EE\u6807\u56E0 {0} \u800C\u5931\u8D25 +transfer_service.unknown_target_error=\u672A\u77E5\u9519\u8BEF +transfer_service.receiver.no_primary_parent_supplied=\u65E0\u6CD5\u4F20\u8F93\uFF0C\u56E0\u4E3A\u672A\u63D0\u4F9B\u4E3B\u7236\u7EA7\u3002 +transfer_service.receiver.orphans_exist=\u65E0\u6CD5\u4F20\u8F93\uFF0C\u56E0\u4E3A\u5B58\u5728\u5B64\u7ACB\u9879 +transfer_service.receiver.content_file_missing=\u65E0\u6CD5\u4F20\u8F93\uFF0C\u56E0\u4E3A\u7F3A\u5C11\u5185\u5BB9\u6587\u4EF6\u3002 +transfer_service.receiver.failed_to_create_staging_folder=\u65E0\u6CD5\u4E3A\u4F20\u8F93 {0} \u521B\u5EFA\u9884\u53D1\u5E03\u76EE\u5F55 +transfer_service.receiver.lock_folder_not_found=\u65E0\u6CD5\u627E\u5230\u6307\u5B9A\u7684\u9501\u5B9A\u6587\u4EF6\u5939\uFF1A{0} +transfer_service.receiver.temp_folder_not_found=\u65E0\u6CD5\u627E\u5230\u4F20\u8F93 {0} \u7684\u6307\u5B9A\u4E34\u65F6\u6587\u4EF6\u5939\uFF1A{1} +transfer_service.receiver.lock_unavailable=\u5DF2\u7ECF\u4E3A\u53E6\u4E00\u4E2A\u5165\u7AD9\u4F20\u8F93\u8981\u6C42\u4E86\u4F20\u8F93\u9501\u5B9A\u3002 \u65E0\u6CD5\u542F\u52A8\u65B0\u4F20\u8F93\u3002 +transfer_service.receiver.record_folder_not_found=\u65E0\u6CD5\u627E\u5230\u6307\u5B9A\u7528\u4E8E\u5B58\u50A8\u5165\u7AD9\u4F20\u8F93\u8BB0\u5F55\u7684\u6587\u4EF6\u5939\uFF1A{0} +transfer_service.receiver.not_lock_owner=\u5C1D\u8BD5\u6267\u884C\u4F20\u8F93\u64CD\u4F5C\u5931\u8D25\u3002 \u6307\u5B9A\u4F20\u8F93\u672A\u4FDD\u6301\u9501\u5B9A\uFF1A{0} +transfer_service.receiver.error_ending_transfer=\u8BF7\u6C42\u7ED3\u675F\u4F20\u8F93 ({0}) \u5BFC\u81F4\u4E86\u9519\u8BEF\u3002 +transfer_service.receiver.error_staging_snapshot=\u9884\u53D1\u5E03\u4F20\u8F93 {0} \u7684\u5FEB\u7167\u6587\u4EF6\u65F6\u51FA\u9519 +transfer_service.receiver.error_staging_content=\u9884\u53D1\u5E03\u4F20\u8F93 {0} \u7684\u5185\u5BB9\u6587\u4EF6\u65F6\u51FA\u9519\u3002 \u6587\u4EF6 ID \u4E3A {1} +transfer_service.receiver.no_snapshot_received=\u6536\u5230\u4E86\u6709\u5173\u63D0\u4EA4\u4F20\u8F93 ({0}) \u7684\u8BF7\u6C42\uFF0C\u4F46\u662F\u672A\u6536\u5230\u5339\u914D\u7684\u5FEB\u7167\u6587\u4EF6\u3002 +transfer_service.receiver.error_committing_transfer=\u5C1D\u8BD5\u63D0\u4EA4\u4F20\u8F93 {0} \u65F6\u51FA\u9519 +transfer_service.receiver.transfer_not_found=\u672A\u627E\u5230\u6240\u8BF7\u6C42\u4F20\u8F93\u7684\u4EFB\u4F55\u8BB0\u5F55\uFF1A{0} +transfer_service.receiver.transfer_cancelled=\u4F20\u8F93\u5DF2\u88AB\u53D6\u6D88\uFF1A{0} +transfer_service.no_encoding=\u65E0\u6CD5\u53CD\u5E8F\u5217\u5316\u503C\uFF0C\u56E0\u4E3A\u6CA1\u6709\u4E3A\u7F16\u7801 {0} \u6267\u884C\u7684\u8F6C\u6362 +transfer_service.unable_to_deserialise=\u65E0\u6CD5\u53CD\u5E8F\u5217\u5316\u503C +transfer_service.receiver.lock_timed_out=\u4F20\u8F93\u9501\u5B9A\u8D85\u65F6\uFF0CtransferId\uFF1A{0} +transfer_service.receiver.lock_not_found=\u672A\u627E\u5230\u4F20\u8F93\u9501\u5B9A +transfer_service.receiver.error_start=\u65E0\u6CD5\u542F\u52A8\u4F20\u8F93 +transfer_service.receiver.error_generating_requisite=\u65E0\u6CD5\u751F\u6210\u4F20\u8F93\u5148\u51B3\u6761\u4EF6 +transfer_service.receiver.error.transfer_to_self=\u4E0D\u5141\u8BB8\u4F20\u8F93\u5230\u76F8\u540C\u5B58\u50A8\u5E93 + +transfer_service.missing_endpoint_path=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u8DEF\u5F84\uFF1A{0} +transfer_service.missing_endpoint_protocol=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u534F\u8BAE\uFF1A{0} +transfer_service.missing_endpoint_host=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u4E3B\u673A\uFF1A{0} +transfer_service.missing_endpoint_port=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u7AEF\u53E3\uFF1A{0} +transfer_service.missing_endpoint_username=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u7528\u6237\u540D\uFF1A{0} +transfer_service.missing_endpoint_password=\u5C1A\u672A\u4E3A\u4F20\u8F93\u76EE\u6807\u6307\u5B9A\u7AEF\u70B9\u5BC6\u7801\uFF1A{0} diff --git a/config/alfresco/messages/ui-inplace_zh_CN.properties b/config/alfresco/messages/ui-inplace_zh_CN.properties new file mode 100755 index 0000000000..f05920fab4 --- /dev/null +++ b/config/alfresco/messages/ui-inplace_zh_CN.properties @@ -0,0 +1,12 @@ +bfsit.page.title=\u6587\u4EF6\u7CFB\u7EDF\u5C31\u5730\u6279\u91CF\u5BFC\u5165\u5DE5\u5177 +bfsit.submit=\u542F\u52A8\u6279\u91CF\u5BFC\u5165 + +bfsit.label.sourceDirectory=\u5E93\u7684\u76F8\u5BF9\u5BFC\u5165\u76EE\u5F55\u8DEF\u5F84 +bfsit.label.contentStore=\u5185\u5BB9\u5E93 +bfsit.label.targetPath=\u76EE\u6807\u5B58\u50A8\u5E93\u8DEF\u5F84 +bfsit.label.replaceExisting=\u66FF\u6362\u73B0\u6709\u6587\u4EF6 +bfsit.label.replaceExisting.unchecked=\u672A\u9009\u4E2D\u5373\u8868\u793A\u8DF3\u8FC7\u5B58\u50A8\u5E93\u4E2D\u7684\u5DF2\u6709\u6587\u4EF6 + +bfsit.error.sourceDirectory=\u5FC5\u987B\u6307\u5B9A\u6E90\u76EE\u5F55 +bfsit.error.contentStore=\u5FC5\u987B\u6307\u5B9A\u76EE\u6807\u5E93 +bfsit.error.targetPath=\u5FC5\u987B\u6307\u5B9A\u76EE\u6807\u7A7A\u95F4 diff --git a/config/alfresco/messages/version-service_zh_CN.properties b/config/alfresco/messages/version-service_zh_CN.properties new file mode 100755 index 0000000000..2f50048e3a --- /dev/null +++ b/config/alfresco/messages/version-service_zh_CN.properties @@ -0,0 +1,20 @@ +# Version service externalised display strings + +version_service.err_restore_exists=The node {0} cannot be restored since it already exists. +version_service.err_not_found=The current version label of the node does not exist in the version history. +version_service.err_unsupported=The current implementation of the version service does not support the creation of branches. +version_service.err_one_preceeding=The current implementation of the version service only supports one preceding version. +version_service.err_restore_no_version=The node {0} cannot be restored since there is no version information available for this node. +version_service.err_revert_mismatch=The version provided to revert to does not come from the nodes version history. + + +version_service.migration.patch.noop=Nothing to do (no version histories found in old version store) + +version_service.migration.patch.complete=Migration completed - migrated {0} (out of {1}) of old version histories (to new version store) in {2} secs (deleteImmediately={3}) +version_service.migration.patch.in_progress=Migration in progress - migrated {0} (out of {1}) of old version histories (to new version store) in {2} secs (deleteImmediately={3}) +version_service.migration.patch.warn.skip1=Skipped migration of {0} (out of {1}) batches of old version histories (migrate incomplete) in {2} secs +version_service.migration.patch.warn.skip2=Skipped migration of {0} old version histories (already migrated) + +version_service.migration.delete.complete=Completed background deletion of {0} (out of {1}) migrated version histories (from old version store) in {2} secs +version_service.migration.delete.warn.skip1=Skipped background deletion of {0} (out of {1}) batches old version histories (delete incomplete) in {2} secs +version_service.migration.delete.warn.skip2=Skipped background deletion of {0} old version histories (not migrated) diff --git a/config/alfresco/messages/wcm-services_zh_CN.properties b/config/alfresco/messages/wcm-services_zh_CN.properties new file mode 100755 index 0000000000..d0c95ab2d9 --- /dev/null +++ b/config/alfresco/messages/wcm-services_zh_CN.properties @@ -0,0 +1,17 @@ +# WCM service related messages + +# WCM actions + +wcm-submit.title=\u5C06 WCM \u4F5C\u8005\u6C99\u76D2\u4E2D\u7684\u5DF2\u66F4\u6539\u8D44\u4EA7\u63D0\u4EA4\u5230\u76F8\u5E94\u7684\u9884\u53D1\u5E03\u6C99\u76D2 +wcm-submit.description=\u8FD9\u6837\u4F1A\u63D0\u4EA4\u5217\u8868\u4E2D\u5305\u542B\u7684\u5DF2\u66F4\u6539\u8D44\u4EA7\u6216\u6240\u6709\u5DF2\u66F4\u6539\u8D44\u4EA7\uFF08\u5982\u679C\u5217\u8868\u4E3A\u7A7A\uFF09 +wcm-submit.sandbox-id.display-label=\u6C99\u76D2\u5E93 ID +wcm-submit.path-list.display-label=\u8D44\u4EA7\u8DEF\u5F84\uFF08\u76F8\u5BF9\u6C99\u76D2\u5E93\uFF09\u5217\u8868 + +wcm-undo.title=\u64A4\u6D88 WCM \u6C99\u76D2\u4E2D\u7684\u5DF2\u66F4\u6539\u8D44\u4EA7 +wcm-undo.description=\u8FD9\u6837\u4F1A\u64A4\u6D88/\u8FD8\u539F\u5217\u8868\u4E2D\u5305\u542B\u7684\u5DF2\u66F4\u6539\u8D44\u4EA7\u6216\u6240\u6709\u5DF2\u66F4\u6539\u8D44\u4EA7\uFF08\u5982\u679C\u5217\u8868\u4E3A\u7A7A\uFF09 +wcm-undo.sandbox-id.display-label=\u6C99\u76D2\u5E93 ID +wcm-undo.path-list.display-label=\u8D44\u4EA7\u8DEF\u5F84\uFF08\u76F8\u5BF9\u6C99\u76D2\u5E93\uFF09\u5217\u8868 + +wcm-revert-snapshot.title=\u5C06 WCM \u6C99\u76D2\u5E93\u8FD8\u539F\uFF08\u76F4\u63A5\u590D\u5236\uFF09\u5230\u6240\u6307\u5B9A\u7684\u5FEB\u7167 +wcm-revert-snapshot.description=\u8FD9\u6837\u4F1A\u5C06 WCM \u6C99\u76D2\u5E93\u4E2D\u7684\u6240\u6709\u8D44\u4EA7\u8FD8\u539F\u5230\u6240\u6307\u5B9A\u7684\u5FEB\u7167\u7248\u672C +wcm-revert-snapshot.version.display-label=\u8981\u8FD8\u539F\u5230\u7684\u5FEB\u7167\u7248\u672C diff --git a/config/alfresco/messages/wcmapp-model_zh_CN.properties b/config/alfresco/messages/wcmapp-model_zh_CN.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_zh_CN.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wdr-messages_zh_CN.properties b/config/alfresco/messages/wdr-messages_zh_CN.properties new file mode 100755 index 0000000000..2149c8bed5 --- /dev/null +++ b/config/alfresco/messages/wdr-messages_zh_CN.properties @@ -0,0 +1,12 @@ +# Display labels for Web Delivery Runtime + +wdr.err.invalid_username_or_password=\u7528\u6237\u540D\u6216\u5BC6\u7801\u65E0\u6548\u3002 +wdr.err.unable_create_logfile=\u65E0\u6CD5\u521B\u5EFA\u65E5\u5FD7\u6587\u4EF6\uFF1B\u90E8\u7F72\u65E0\u6CD5\u7EE7\u7EED +wdr.err.unable_prepare_already_commit=\u65E0\u6CD5\u51C6\u5907\u90E8\u7F72\uFF1A\u5DF2\u6B63\u5728\u4E2D\u6B62\u6216\u63D0\u4EA4\u3002 +wdr.err.unable_prepare_missing_file="\u65E0\u6CD5\u51C6\u5907\uFF0C\u56E0\u4E3A\u7F3A\u5C11\u4E34\u65F6\u6587\u4EF6\u3002 {0} +wdr.err.invalid_ticket=\u90E8\u7F72\u5DF2\u8D85\u65F6\u6216\u7968\u8BC1\u65E0\u6548\u3002 {0} +wdr.err.unable_commit=\u65E0\u6CD5\u63D0\u4EA4 + +wdr.avm.snapshot_tag=\u90E8\u7F72\u6765\u81EA\u5E93\uFF1A{0}\uFF0C\u7248\u672C\uFF1A{1} +wdr.avm.snapshot_description=\u90E8\u7F72\u6765\u81EA\u5E93\uFF1A{0}\uFF0C\u7248\u672C\uFF1A{1} + diff --git a/config/alfresco/messages/webdav-messages_zh_CN.properties b/config/alfresco/messages/webdav-messages_zh_CN.properties new file mode 100755 index 0000000000..f8360e814d --- /dev/null +++ b/config/alfresco/messages/webdav-messages_zh_CN.properties @@ -0,0 +1,13 @@ +# webdav HTML page messages + +webdav.repository_title=Alfresco \u5185\u5BB9\u5B58\u50A8\u5E93 +webdav.directory_listing=\u4EE5\u4E0B\u9879\u7684\u76EE\u5F55\u5217\u8868 +webdav.column.name=\u540D\u79F0 +webdav.column.size=\u5927\u5C0F +webdav.column.type=\u7C7B\u578B +webdav.column.modifieddate=\u4FEE\u6539\u65E5\u671F +webdav.column.navigate_up=\u63D0\u9AD8\u4E00\u7EA7 +webdav.err.dir=\u751F\u6210\u76EE\u5F55\u5217\u8868\u65F6\u51FA\u9519\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u5458\u3002 +webdav.size.bytes=\u5B57\u8282 +webdav.size.kilobytes=KB +webdav.size.megabytes=MB diff --git a/config/alfresco/messages/workflow-interpreter-help_zh_CN.properties b/config/alfresco/messages/workflow-interpreter-help_zh_CN.properties new file mode 100755 index 0000000000..398b1b772b --- /dev/null +++ b/config/alfresco/messages/workflow-interpreter-help_zh_CN.properties @@ -0,0 +1 @@ +workflow_console.help=alfresco/messages/workflow-interpreter-help.txt diff --git a/config/alfresco/messages/workflow-package-messages_zh_CN.properties b/config/alfresco/messages/workflow-package-messages_zh_CN.properties new file mode 100755 index 0000000000..c29dcd1ec8 --- /dev/null +++ b/config/alfresco/messages/workflow-package-messages_zh_CN.properties @@ -0,0 +1,3 @@ + +# Error Messages +workflow.package.already.associated.error=\u65E0\u6CD5\u5C06\u5DE5\u4F5C\u6D41\u7A0B\u5305 {0} \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {1} \u5173\u8054\uFF0C\u56E0\u4E3A\u6B64\u5305\u5DF2\u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u5B9E\u4F8B {2} \u5173\u8054\u3002 diff --git a/config/alfresco/subsystems/thirdparty/default/swf-transform.properties b/config/alfresco/subsystems/thirdparty/default/swf-transform.properties index 83fec62c75..e0e2e37aa3 100644 --- a/config/alfresco/subsystems/thirdparty/default/swf-transform.properties +++ b/config/alfresco/subsystems/thirdparty/default/swf-transform.properties @@ -3,6 +3,5 @@ swf.exe=./bin/pdf2swf # This option on pdf2swf improves the transformation of graphics-heavy pdfs. See ALF-3580. # poly2bitmap improves the chances of successful transformation. On its own it reduces -# the resolution of embedded images. subpixels sets the dpi for embedded images. -# zoom introduced and -s added before each option (ALF-9417). -swf.encoder.params=-s zoom=72 -s ppmsubpixels=1 -s poly2bitmap=1 -s bitmapfonts=1 +# the resolution of embedded images. subpixels sets the dpi for embedded images. +swf.encoder.params=-s poly2bitmap,subpixels=72 \ No newline at end of file diff --git a/config/alfresco/workflow/invitation-moderated-workflow-messages_zh_CN.properties b/config/alfresco/workflow/invitation-moderated-workflow-messages_zh_CN.properties new file mode 100755 index 0000000000..0c3d9837da --- /dev/null +++ b/config/alfresco/workflow/invitation-moderated-workflow-messages_zh_CN.properties @@ -0,0 +1,48 @@ +# Display labels for out-of-the-box Site-oriented Workflows + +# +# Moderated Invitation +# + +imwf_invitation-moderated.workflow.title=\u9080\u8BF7 - \u5BA1\u6838\u5F0F (JBPM) +imwf_invitation-moderated.workflow.description=\u5BF9\u7F51\u7AD9\u7B49\u8D44\u6E90\u7684\u5BA1\u6838\u5F0F\u9080\u8BF7\u3002 +activitiInvitationModerated.workflow.title=\u9080\u8BF7 - \u5BA1\u6838\u5F0F +activitiInvitationModerated.workflow.description=\u5BF9\u7F51\u7AD9\u7B49\u8D44\u6E90\u7684\u5BA1\u6838\u5F0F\u9080\u8BF7\u3002 + +imwf_invitation-moderated-workflow-model.type.imwf_moderatedInvitationReviewTask.title=\u5BA1\u6838\u5F0F\u7AD9\u70B9\u7684\u9080\u8BF7 +imwf_invitation-moderated-workflow-model.type.imwf_moderatedInvitationReviewTask.description=\u542F\u52A8\u5BA1\u6838\u5F0F\u9080\u8BF7 +imwf_invitation-moderated-workflow-model.type.imwf_activitiModeratedInvitationReviewTask.title=\u5BA1\u6838\u5F0F\u7AD9\u70B9\u7684\u9080\u8BF7 +imwf_invitation-moderated-workflow-model.type.imwf_activitiModeratedInvitationReviewTask.description=\u542F\u52A8\u5BA1\u6838\u5F0F\u9080\u8BF7 + +imwf_invitation-moderated-workflow-model.property.imwf_inviteeUserName.title=\u88AB\u9080\u8BF7\u8005\u7528\u6237\u540D +imwf_invitation-moderated-workflow-model.property.imwf_inviteeRole.title=\u88AB\u9080\u8BF7\u8005\u89D2\u8272 +imwf_invitation-moderated-workflow-model.property.imwf_inviteeComments.title=\u88AB\u9080\u8BF7\u8005\u6CE8\u91CA +imwf_invitation-moderated-workflow-model.property.imwf_resourceName.title=\u8D44\u6E90\u540D\u79F0 +imwf_invitation-moderated-workflow-model.property.imwf_resourceType.title=\u8D44\u6E90\u7C7B\u578B + +# Moderated Invite Process Definitions +imwf_invitation-moderated.node.start.title=\u542F\u52A8 +imwf_invitation-moderated.node.start.description=\u542F\u52A8\u5BA1\u6838\u5F0F\u9080\u8BF7 +imwf_invitation-moderated.task.imwf_moderatedInvitationSubmitTask.title=\u542F\u52A8 +imwf_invitation-moderated.task.imwf_moderatedInvitationSubmitTask.description=\u542F\u52A8\u5BA1\u6838\u5F0F\u9080\u8BF7 +imwf_invitation-moderated.node.review.title=\u590D\u67E5\u9080\u8BF7 +imwf_invitation-moderated.node.review.description=\u590D\u67E5\u5BA1\u6838\u5F0F\u9080\u8BF7 +imwf_invitation-moderated.task.imwf_moderatedInvitationReviewTask.title=\u590D\u67E5\u9080\u8BF7 +imwf_invitation-moderated.task.imwf_moderatedInvitationReviewTask.description=\u590D\u67E5\u5BA1\u6838\u5F0F\u9080\u8BF7 +imwf_invitation-moderated.node.review.transition.reject.title=\u62D2\u7EDD +imwf_invitation-moderated.node.review.transition.reject.description=\u62D2\u7EDD +imwf_invitation-moderated.node.review.transition.approve.title=\u6279\u51C6 +imwf_invitation-moderated.node.review.transition.approve.description=\u6279\u51C6 +imwf_invitation-moderated.node.review.transition.cancel.title=\u53D6\u6D88 +imwf_invitation-moderated.node.review.transition.cancel.description=\u53D6\u6D88 +imwf_invitation-moderated.node.end.title=\u7ED3\u675F +imwf_invitation-moderated.node.end.description=\u7ED3\u675F + +activitiInvitationModerated.task.imwf_moderatedInvitationSubmitTask.title=\u542F\u52A8 +activitiInvitationModerated.task.imwf_moderatedInvitationSubmitTask.description=\u542F\u52A8\u5BA1\u6838\u5F0F\u9080\u8BF7 +activitiInvitationModerated.task.imwf_activitiModeratedInvitationReviewTask.title=\u590D\u67E5\u9080\u8BF7 +activitiInvitationModerated.task.imwf_activitiModeratedInvitationReviewTask.description=\u590D\u67E5\u5BA1\u6838\u5F0F\u9080\u8BF7 + +# Activiti invite outcome list constraint labels +listconstraint.imwf_reviewOutcomeOptions.approve=\u6279\u51C6 +listconstraint.imwf_reviewOutcomeOptions.reject=\u62D2\u7EDD diff --git a/config/alfresco/workflow/invitation-nominated-workflow-messages_zh_CN.properties b/config/alfresco/workflow/invitation-nominated-workflow-messages_zh_CN.properties new file mode 100755 index 0000000000..26046ea69f --- /dev/null +++ b/config/alfresco/workflow/invitation-nominated-workflow-messages_zh_CN.properties @@ -0,0 +1,73 @@ +# Display labels for out-of-the-box Site-oriented Workflows + +# +# Invitation Nominated Workflow +# + +inwf_invitation-nominated.workflow.title=\u7AD9\u70B9\u9080\u8BF7 - \u63A8\u8350\u5F0F (JBPM) +inwf_invitation-nominated.workflow.description=\u7531\u7AD9\u70B9\u7BA1\u7406\u5458\u63A8\u8350\u7684\uFF0C\u5BF9 Share \u7AD9\u70B9\u7684\u9080\u8BF7 +activitiInvitationNominated.workflow.title=\u7AD9\u70B9\u9080\u8BF7 - \u63A8\u8350\u5F0F +activitiInvitationNominated.workflow.description=\u7531\u7AD9\u70B9\u7BA1\u7406\u5458\u63A8\u8350\u7684\uFF0C\u5BF9 Share \u7AD9\u70B9\u7684\u9080\u8BF7 + +# Invite Task Definitions +inwf_invite-workflow-model.type.inwf_inviteToSiteTask.title=\u542F\u52A8 +inwf_invite-workflow-model.type.inwf_inviteToSiteTask.description=\u542F\u52A8\u63A8\u8350\u5F0F\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_invitePendingTask.title=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_invitePendingTask.description=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_activitiInvitePendingTask.title=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_activitiInvitePendingTask.description=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_rejectInviteTask.title=\u7AD9\u70B9\u9080\u8BF7\u88AB\u62D2\u7EDD +inwf_invite-workflow-model.type.inwf_rejectInviteTask.description=\u83B7\u9080\u52A0\u5165\u6B64\u7AD9\u70B9\u7684\u7528\u6237\u62D2\u7EDD\u4E86\u9080\u8BF7 +inwf_invite-workflow-model.type.inwf_acceptInviteTask.title=\u7AD9\u70B9\u9080\u8BF7\u5DF2\u63A5\u53D7 +inwf_invite-workflow-model.type.inwf_acceptInviteTask.description=\u83B7\u9080\u52A0\u5165\u6B64\u7AD9\u70B9\u7684\u7528\u6237\u63A5\u53D7\u4E86\u9080\u8BF7 +inwf_invite-workflow-model.property.inwf_resourceType.title=\u8D44\u6E90\u7C7B\u578B +inwf_invite-workflow-model.property.inwf_resourceName.title=\u8D44\u6E90\u540D\u79F0 +inwf_invite-workflow-model.property.inwf_resourceTitle.title=\u8D44\u6E90\u6807\u9898 +inwf_invite-workflow-model.property.inwf_resourceDescription.title=\u8D44\u6E90\u8BF4\u660E +inwf_invite-workflow-model.property.inwf_inviterUserName.title=\u9080\u8BF7\u8005 +inwf_invite-workflow-model.property.inwf_inviteeUserName.title=\u88AB\u9080\u8BF7\u8005\u7528\u6237\u540D +inwf_invite-workflow-model.property.inwf_inviteeEmail.title=\u88AB\u9080\u8BF7\u8005\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +inwf_invite-workflow-model.property.inwf_inviteeFirstName.title=\u88AB\u9080\u8BF7\u8005\u540D\u5B57 +inwf_invite-workflow-model.property.inwf_inviteeLastName.title=\u88AB\u9080\u8BF7\u8005\u59D3\u6C0F +inwf_invite-workflow-model.property.inwf_inviteeRole.title=\u88AB\u9080\u8BF7\u8005\u89D2\u8272 + +# Invite Process Definitions +inwf_invitation-nominated.node.start.title=\u542F\u52A8 +inwf_invitation-nominated.node.start.description=\u53D1\u9001\u9080\u8BF7 +inwf_invitation-nominated.node.start.transition.sendInvite.title=\u53D1\u9001\u9080\u8BF7 +inwf_invitation-nominated.node.start.transition.sendInvite.description=\u53D1\u9001\u9080\u8BF7 + +inwf_invitation-nominated.node.invitePending.title=\u9080\u8BF7\u5F85\u51B3 +inwf_invitation-nominated.node.invitePending.description=\u9080\u8BF7\u5F85\u51B3 +inwf_invitation-nominated.node.invitePending.transition.reject.title=\u62D2\u7EDD +inwf_invitation-nominated.node.invitePending.transition.reject.description=\u62D2\u7EDD +inwf_invitation-nominated.node.invitePending.transition.accept.title=\u63A5\u53D7 +inwf_invitation-nominated.node.invitePending.transition.accept.description=\u63A5\u53D7 +inwf_invitation-nominated.node.invitePending.transition.cancel.title=\u53D6\u6D88 +inwf_invitation-nominated.node.invitePending.transition.cancel.description=\u53D6\u6D88 + +inwf_invitation-nominated.node.inviteRejected.title=\u5DF2\u62D2\u7EDD +inwf_invitation-nominated.node.inviteRejected.description=\u5DF2\u62D2\u7EDD +inwf_invitation-nominated.node.inviteRejected.transition.end.title=\u4EFB\u52A1\u5DF2\u5B8C\u6210 +inwf_invitation-nominated.node.inviteRejected.transition.end.description=\u4EFB\u52A1\u5DF2\u5B8C\u6210 + +inwf_invitation-nominated.node.inviteAccepted.title=\u5DF2\u63A5\u53D7 +inwf_invitation-nominated.node.inviteAccepted.description=\u5DF2\u63A5\u53D7 +inwf_invitation-nominated.node.inviteAccepted.transition.end.title=\u4EFB\u52A1\u5DF2\u5B8C\u6210 +inwf_invitation-nominated.node.inviteAccepted.transition.end.description=\u4EFB\u52A1\u5DF2\u5B8C\u6210 + +inwf_invitation-nominated.node.end.title=\u7ED3\u675F +inwf_invitation-nominated.node.end.description=\u7ED3\u675F + +activitiInvitationNominated.task.inwf_activitiInvitePendingTask.title=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 +activitiInvitationNominated.task.inwf_activitiInvitePendingTask.description=\u6709\u5173\u52A0\u5165\u7AD9\u70B9\u7684\u9080\u8BF7 + +activitiInvitationNominated.task.inwf_acceptInviteTask.title=\u7AD9\u70B9\u9080\u8BF7\u5DF2\u63A5\u53D7 +activitiInvitationNominated.task.inwf_acceptInviteTask.description=\u83B7\u9080\u52A0\u5165\u6B64\u7AD9\u70B9\u7684\u7528\u6237\u63A5\u53D7\u4E86\u9080\u8BF7 + +activitiInvitationNominated.task.inwf_rejectInviteTask.title=\u7AD9\u70B9\u9080\u8BF7\u88AB\u62D2\u7EDD +activitiInvitationNominated.task.inwf_rejectInviteTask.description=\u83B7\u9080\u52A0\u5165\u6B64\u7AD9\u70B9\u7684\u7528\u6237\u62D2\u7EDD\u4E86\u9080\u8BF7 + +# Activiti invite outcome list constraint labels +listconstraint.inwf_inviteOutcomeOptions.accept=\u63A5\u53D7 +listconstraint.inwf_inviteOutcomeOptions.reject=\u62D2\u7EDD diff --git a/config/alfresco/workflow/wcm-workflow-messages_zh_CN.properties b/config/alfresco/workflow/wcm-workflow-messages_zh_CN.properties new file mode 100755 index 0000000000..612dd27763 --- /dev/null +++ b/config/alfresco/workflow/wcm-workflow-messages_zh_CN.properties @@ -0,0 +1,96 @@ +# Display labels for out-of-the-box WCM Content-oriented Workflows + +# +# Submit Workflow +# + +wcmwf_submit.workflow.title=\u63D0\u4EA4\u7F51\u7AD9 +wcmwf_submit.workflow.description=\u63D0\u4EA4\u66F4\u6539\u4F9B\u6279\u51C6 +wcmwf_submit.node.verifybrokenlinks.transition.abort.title=\u4E2D\u6B62\u63D0\u4EA4 +wcmwf_submit.node.verifybrokenlinks.transition.abort.description=\u4E2D\u6B62\u63D0\u4EA4 +wcmwf_submit.node.verifybrokenlinks.transition.continue.title=\u7EE7\u7EED\u63D0\u4EA4 +wcmwf_submit.node.verifybrokenlinks.transition.continue.description=\u7EE7\u7EED\u63D0\u4EA4 +wcmwf_submit.node.serialreview.transition.reject.title=\u62D2\u7EDD +wcmwf_submit.node.serialreview.transition.reject.description=\u62D2\u7EDD +wcmwf_submit.node.serialreview.transition.approve.title=\u6279\u51C6 +wcmwf_submit.node.serialreview.transition.approve.description=\u6279\u51C6 +wcmwf_submit.node.parallelreview.transition.reject.title=\u62D2\u7EDD +wcmwf_submit.node.parallelreview.transition.reject.description=\u62D2\u7EDD +wcmwf_submit.node.parallelreview.transition.approve.title=\u6279\u51C6 +wcmwf_submit.node.parallelreview.transition.approve.description=\u6279\u51C6 +wcmwf_submit.node.rejected.transition.abort.title=\u4E2D\u6B62\u590D\u67E5 +wcmwf_submit.node.rejected.transition.abort.description=\u4E2D\u6B62\u590D\u67E5 +wcmwf_submit.node.rejected.transition.resubmit.title=\u518D\u6B21\u63D0\u4EA4\u4F9B\u590D\u67E5 +wcmwf_submit.node.rejected.transition.resubmit.description=\u518D\u6B21\u63D0\u4EA4\u4F9B\u590D\u67E5 +wcmwf_submit.node.submitpending.transition.cancel.title=\u4E2D\u6B62\u63D0\u4EA4 +wcmwf_submit.node.submitpending.transition.cancel.description=\u4E2D\u6B62\u63D0\u4EA4 +wcmwf_submit.node.submitpending.transition.launch.title=\u7ACB\u5373\u63D0\u4EA4 +wcmwf_submit.node.submitpending.transition.launch.description=\u7ACB\u5373\u63D0\u4EA4 +wcmwf_submit.node.submitted.transition.onsubmit.title=\u63D0\u4EA4\u65F6 +wcmwf_submit.node.submitted.transition.onsubmit.description=\u63D0\u4EA4\u65F6 + +wcmwf_submitdirect.workflow.title=\u63D0\u4EA4\u7F51\u7AD9\uFF08\u76F4\u63A5\uFF09 +wcmwf_submitdirect.workflow.description=\u5C06\u66F4\u6539\u76F4\u63A5\u63D0\u4EA4\u5230\u9884\u53D1\u5E03\u6C99\u76D2 + + +# Submit Task Definitions + +wcmwf_workflowmodel.type.wcmwf_submitReviewTask.title=\u63D0\u4EA4\u7F51\u7AD9 +wcmwf_workflowmodel.type.wcmwf_submitReviewTask.description=\u63D0\u4EA4\u66F4\u6539\u4F9B\u6279\u51C6 +wcmwf_workflowmodel.type.wcmwf_submitDirectTask.title=\u63D0\u4EA4\u7F51\u7AD9\uFF08\u76F4\u63A5\uFF09 +wcmwf_workflowmodel.type.wcmwf_submitDirectTask.description=\u5C06\u66F4\u6539\u76F4\u63A5\u63D0\u4EA4\u5230\u9884\u53D1\u5E03\u6C99\u76D2 +wcmwf_workflowmodel.type.wcmwf_verifyBrokenLinksTask.title=\u9A8C\u8BC1\u5DF2\u65AD\u5F00\u7684\u94FE\u63A5 +wcmwf_workflowmodel.type.wcmwf_verifyBrokenLinksTask.description=\u9A8C\u8BC1\u4E0D\u6307\u5411\u6D3B\u52A8\u8D44\u6E90\u7684\u94FE\u63A5 +wcmwf_workflowmodel.type.wcmwf_reviewTask.title=\u590D\u67E5 +wcmwf_workflowmodel.type.wcmwf_reviewTask.description=\u590D\u67E5\u6587\u6863\u4EE5\u4E88\u4EE5\u6279\u51C6\u6216\u62D2\u7EDD +wcmwf_workflowmodel.type.wcmwf_parallelReviewTask.title=\u590D\u67E5 +wcmwf_workflowmodel.type.wcmwf_parallelReviewTask.description=\u590D\u67E5\u6587\u6863\u4EE5\u4E88\u4EE5\u6279\u51C6\u6216\u62D2\u7EDD +wcmwf_workflowmodel.type.wcmwf_rejectedTask.title=\u5DF2\u62D2\u7EDD +wcmwf_workflowmodel.type.wcmwf_rejectedTask.description=\u5DF2\u62D2\u7EDD +wcmwf_workflowmodel.type.wcmwf_approvedTask.title=\u5DF2\u6279\u51C6 +wcmwf_workflowmodel.type.wcmwf_approvedTask.description=\u5DF2\u6279\u51C6 +wcmwf_workflowmodel.type.wcmwf_submittedTask.title=\u5DF2\u63D0\u4EA4 +wcmwf_workflowmodel.type.wcmwf_submittedTask.description=\u5DF2\u63D0\u4EA4 +wcmwf_workflowmodel.type.wcmwf_submittedDirectTask.title=\u5DF2\u63D0\u4EA4 +wcmwf_workflowmodel.type.wcmwf_submittedDirectTask.description=\u5DF2\u63D0\u4EA4 +wcmwf_workflowmodel.type.wcmwf_submitpendingTask.title=\u63D0\u4EA4\u5F85\u51B3 +wcmwf_workflowmodel.type.wcmwf_submitpendingTask.description=\u63D0\u4EA4\u5F85\u51B3 +wcmwf_workflowmodel.type.wcmwf_submitcancelledTask.title=\u63D0\u4EA4\u5DF2\u4E2D\u6B62 +wcmwf_workflowmodel.type.wcmwf_submitcancelledTask.description=\u63D0\u4EA4\u5DF2\u4E2D\u6B62 +wcmwf_workflowmodel.type.wcmwf_submitfailedTask.title=\u63D0\u4EA4\u5931\u8D25 +wcmwf_workflowmodel.type.wcmwf_submitfailedTask.description=\u63D0\u4EA4\u5931\u8D25 + +wcmwf_workflowmodel.property.wcmwf_reviewType.title=\u590D\u67E5\u7C7B\u578B +wcmwf_workflowmodel.property.wcmwf_reviewType.description=\u987A\u5E8F\u590D\u67E5\u6216\u5E76\u884C\u590D\u67E5 +wcmwf_workflowmodel.property.wcmwf_submitReviewType.title=\u590D\u67E5\u7C7B\u578B +wcmwf_workflowmodel.property.wcmwf_submitReviewType.description=\u987A\u5E8F\u590D\u67E5\u6216\u5E76\u884C\u590D\u67E5 +wcmwf_workflowmodel.property.wcmwf_fromPath.title=\u6E90\u6587\u4EF6\u5939\u8DEF\u5F84 +wcmwf_workflowmodel.property.wcmwf_fromPath.description=\u4ECE\u4E2D\u63D0\u4EA4\u4E86\u9879\u7684\u6587\u4EF6\u5939\u8DEF\u5F84 +wcmwf_workflowmodel.property.wcmwf_label.title=\u63D0\u4EA4\u6807\u7B7E +wcmwf_workflowmodel.property.wcmwf_label.description=\u4E0E\u63D0\u4EA4\u5173\u8054\u7684\u6807\u7B7E +wcmwf_workflowmodel.property.wcmwf_launchDate.title=\u542F\u52A8\u65E5\u671F +wcmwf_workflowmodel.property.wcmwf_launchDate.description=\u5E94\u63D0\u4EA4\u6240\u63D0\u4EA4\u5185\u5BB9\u7684\u65E5\u671F +wcmwf_workflowmodel.property.wcmwf_autoDeploy.title=\u81EA\u52A8\u90E8\u7F72 +wcmwf_workflowmodel.property.wcmwf_autoDeploy.description=\u6279\u51C6\u4E4B\u540E\u662F\u5426\u5E94\u90E8\u7F72\u63D0\u4EA4\u7684\u66F4\u6539 +wcmwf_workflowmodel.property.wcmwf_webapp.title=Webapp +wcmwf_workflowmodel.property.wcmwf_webapp.description=\u5DE5\u4F5C\u6D41\u7A0B\u5E93\u5185\u5E94\u68C0\u67E5\u5176\u94FE\u63A5\u7684 webapp +wcmwf_workflowmodel.property.wcmwf_reviewerCnt.title=\u590D\u67E5\u603B\u6570 +wcmwf_workflowmodel.property.wcmwf_reviewerCnt.description=\u6267\u884C\u4E86\u590D\u67E5\u7684\u4EBA\u5458\u8BA1\u6570 +wcmwf_workflowmodel.property.wcmwf_approveCnt.title=\u6279\u51C6\u603B\u6570 +wcmwf_workflowmodel.property.wcmwf_approveCnt.description=\u4E88\u4EE5\u6279\u51C6\u7684\u4EBA\u5458\u8BA1\u6570 + +# Change Request Workflow + +wcmwf_changerequest.workflow.title=\u66F4\u6539\u8BF7\u6C42 +wcmwf_changerequest.workflow.description=\u6307\u6D3E\u8D44\u6E90\u4EE5\u4F9B\u4FEE\u6539 + +# Change Request Task Definitions + +wcmwf_workflowmodel.type.wcmwf_submitChangeRequestTask.title=\u63D0\u4EA4\u66F4\u6539\u8BF7\u6C42 +wcmwf_workflowmodel.type.wcmwf_submitChangeRequestTask.description=\u63D0\u4EA4\u9488\u5BF9\u4E00\u9879\u6216\u591A\u9879\u7684\u66F4\u6539\u8BF7\u6C42 +wcmwf_workflowmodel.type.wcmwf_changeRequestTask.title=\u66F4\u6539\u8BF7\u6C42 +wcmwf_workflowmodel.type.wcmwf_changeRequestTask.description=\u66F4\u6539\u8BF7\u6C42 + +# List constraint display labels +listconstraint.wcmwf_reviewType.Serial=\u987A\u5E8F +listconstraint.wcmwf_reviewType.Parallel=\u5E76\u884C diff --git a/config/alfresco/workflow/workflow-messages_zh_CN.properties b/config/alfresco/workflow/workflow-messages_zh_CN.properties new file mode 100755 index 0000000000..cd332e479b --- /dev/null +++ b/config/alfresco/workflow/workflow-messages_zh_CN.properties @@ -0,0 +1,204 @@ +# Display labels for out-of-the-box Content-oriented Workflows + +#################### +# JBPM WORKFLOWS # +#################### + +# +# Adhoc Task Workflow +# +wf_adhoc.workflow.title=\u7279\u6B8A\u5DE5\u4F5C\u6D41\u7A0B (JBPM) +wf_adhoc.workflow.description=\u4F7F\u7528 JBPM \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u4E3A\u540C\u4E8B\u6307\u6D3E\u4EFB\u610F\u4EFB\u52A1 + +# +# Review And Approve Workflow +# + +wf_review.workflow.title=\u590D\u67E5\u548C\u6279\u51C6 (JBPM) +wf_review.workflow.description=\u4F7F\u7528 JBPM \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 + +# Review And Approve Process Definitions + +wf_review.node.start.title=\u5F00\u59CB +wf_review.node.start.description=\u5F00\u59CB +wf_review.node.review.title=\u590D\u67E5 +wf_review.node.review.description=\u590D\u67E5 +wf_review.task.wf_reviewTask.title=\u590D\u67E5 +wf_review.task.wf_reviewTask.description=\u590D\u67E5 +wf_review.node.review.transition.reject.title=\u62D2\u7EDD +wf_review.node.review.transition.reject.description=\u62D2\u7EDD +wf_review.node.review.transition.approve.title=\u6279\u51C6 +wf_review.node.review.transition.approve.description=\u6279\u51C6 +wf_review.node.rejected.title=\u5DF2\u62D2\u7EDD +wf_review.node.rejected.description=\u5DF2\u62D2\u7EDD +wf_review.task.wf_rejectedTask.title=\u5DF2\u62D2\u7EDD +wf_review.task.wf_rejectedTask.description=\u5DF2\u62D2\u7EDD +wf_review.node.approved.title=\u5DF2\u6279\u51C6 +wf_review.node.approved.description=\u5DF2\u6279\u51C6 +wf_review.task.wf_approvedTask.title=\u5DF2\u6279\u51C6 +wf_review.task.wf_approvedTask.description=\u5DF2\u6279\u51C6 +wf_review.node.end.title=\u7ED3\u675F +wf_review.node.end.description=\u7ED3\u675F + +# +# Parallel Review Workflow +# + +wf_parallelreview.workflow.title=\u5E76\u884C\u590D\u67E5\u548C\u6279\u51C6 (JBPM) +wf_parallelreview.workflow.description=\u4F7F\u7528 JBPM \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u6267\u884C\u5E76\u884C\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 + +# Parallel Review Process Definitions + +wf_parallelreview.node.review.transition.reject.title=\u62D2\u7EDD +wf_parallelreview.node.review.transition.reject.description=\u62D2\u7EDD +wf_parallelreview.node.review.transition.approve.title=\u6279\u51C6 +wf_parallelreview.node.review.transition.approve.description=\u6279\u51C6 + +# +# Pooled Review Workflow +# + +wf_reviewpooled.workflow.title=\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6 (JBPM) +wf_reviewpooled.workflow.description=\u4F7F\u7528 JBPM \u7684\u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u8FDB\u884C\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 + +# Pooled Review Process Definitions + +wf_reviewpooled.node.review.transition.reject.title=\u62D2\u7EDD +wf_reviewpooled.node.review.transition.reject.description=\u62D2\u7EDD +wf_reviewpooled.node.review.transition.approve.title=\u6279\u51C6 +wf_reviewpooled.node.review.transition.approve.description=\u6279\u51C6 + +# +# Parallel Group Review Workflow +# + +wf_parallelgroupreview.workflow.title=\u7EC4\u590D\u67E5\u548C\u6279\u51C6 (JBPM) +wf_parallelgroupreview.workflow.description=\u4F7F\u7528 JBPM \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u7EC4\u8FDB\u884C\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 + +# Parallel Group Review Process Definitions + +wf_parallelgroupreview.node.review.transition.reject.title=\u62D2\u7EDD +wf_parallelgroupreview.node.review.transition.reject.description=\u62D2\u7EDD +wf_parallelgroupreview.node.review.transition.approve.title=\u6279\u51C6 +wf_parallelgroupreview.node.review.transition.approve.description=\u6279\u51C6 + +####################### +# ACTIVITI WORKFLOWS # +####################### + +# +# Activiti Adhoc Task Workflow +# + +activitiAdhoc.workflow.title=\u7279\u6B8A\u5DE5\u4F5C\u6D41\u7A0B +activitiAdhoc.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u5C06\u4EFB\u610F\u4EFB\u52A1\u6307\u6D3E\u7ED9\u540C\u4E8B + +# +# Activiti Review And Approve Workflow +# +activitiReview.workflow.title=\u590D\u67E5\u548C\u6279\u51C6 +activitiReview.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u8FDB\u884C\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 +activitiReview.task.approved.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u6279\u51C6\u3002 +activitiReview.task.rejected.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u62D2\u7EDD\u3002 + +# +# Parallel Review Workflow +# + +activitiParallelReview.workflow.title=\u5E76\u884C\u590D\u67E5\u548C\u6279\u51C6 +activitiParallelReview.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u8FDB\u884C\u5E76\u884C\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 +activitiParallelReview.task.approved.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u6279\u51C6\u3002 +activitiParallelReview.task.rejected.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u62D2\u7EDD\u3002 + +# +# Activiti Pooled Review Workflow +# + +activitiReviewPooled.workflow.title=\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6 +activitiReviewPooled.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u8FDB\u884C\u5165\u6C60\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 +activitiReviewPooled.task.approved.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u6279\u51C6\u3002 +activitiReviewPooled.task.rejected.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u62D2\u7EDD\u3002 + +# +# Activiti Parallel Group Review Workflow +# + +activitiParallelGroupReview.workflow.title=\u7EC4\u590D\u67E5\u548C\u6279\u51C6 +activitiParallelGroupReview.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u8FDB\u884C\u7EC4\u590D\u67E5\u548C\u6279\u51C6\u5185\u5BB9 +activitiParallelGroupReview.task.approved.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u6279\u51C6\u3002 +activitiParallelGroupReview.task.rejected.description=\u6B64\u6587\u6863\u5DF2\u88AB\u590D\u67E5\u5E76\u62D2\u7EDD\u3002 + +# +# Activiti Publish Web Content Workflow +# + +publishWebContent.workflow.title=\u53D1\u5E03 Web \u5185\u5BB9\u7684 Activiti \u6D41\u7A0B +publishWebContent.workflow.description=\u4F7F\u7528 Activiti \u5DE5\u4F5C\u6D41\u7A0B\u5F15\u64CE\u53D1\u5E03 Web \u5185\u5BB9 + +############################ +# WORKFLOW MODEL LABELS # +############################ + +# Adhoc Task Definitions + +wf_workflowmodel.type.wf_submitAdhocTask.title=\u5F00\u59CB\u7279\u6B8A\u4EFB\u52A1 +wf_workflowmodel.type.wf_submitAdhocTask.description=\u5C06\u4EFB\u52A1\u5206\u914D\u7ED9\u540C\u4E8B +wf_workflowmodel.property.wf_notifyMe.title=\u901A\u77E5\u6211 +wf_workflowmodel.property.wf_notifyMe.description=\u4EFB\u52A1\u5B8C\u6210\u65F6\u901A\u77E5\u6211 +wf_workflowmodel.type.wf_adhocTask.title=\u7279\u6B8A\u4EFB\u52A1 +wf_workflowmodel.type.wf_adhocTask.description=\u7531\u540C\u4E8B\u5206\u914D\u7684\u7279\u6B8A\u4EFB\u52A1 +wf_workflowmodel.type.wf_completedAdhocTask.title=\u7279\u6B8A\u4EFB\u52A1\u5DF2\u5B8C\u6210 +wf_workflowmodel.type.wf_completedAdhocTask.description=\u7279\u6B8A\u4EFB\u52A1\u5DF2\u5B8C\u6210 + +# Review And Approve Task Definitions + +wf_workflowmodel.type.wf_submitReviewTask.title=\u5F00\u59CB\u590D\u67E5 +wf_workflowmodel.type.wf_submitReviewTask.description=\u63D0\u4EA4\u6587\u6863\u4F9B\u590D\u67E5\u548C\u6279\u51C6 +wf_workflowmodel.type.wf_reviewTask.title=\u590D\u67E5 +wf_workflowmodel.type.wf_reviewTask.description=\u590D\u67E5\u6587\u6863\u4EE5\u6279\u51C6\u6216\u62D2\u7EDD +wf_workflowmodel.type.wf_rejectedTask.title=\u5DF2\u62D2\u7EDD +wf_workflowmodel.type.wf_rejectedTask.description=\u5DF2\u62D2\u7EDD +wf_workflowmodel.type.wf_approvedTask.title=\u5DF2\u6279\u51C6 +wf_workflowmodel.type.wf_approvedTask.description=\u5DF2\u6279\u51C6 + +# Activiti Review And Approve Task Definitions +wf_workflowmodel.type.wf_activitiReviewTask.title=\u590D\u67E5 +wf_workflowmodel.type.wf_activitiReviewTask.description=\u590D\u67E5\u6587\u6863\u4EE5\u6279\u51C6\u6216\u62D2\u7EDD +wf_workflowmodel.property.wf_reviewOutcome.title=\u590D\u67E5\u7ED3\u679C +wf_workflowmodel.property.wf_reviewOutcome.description=\u6279\u51C6\u6216\u62D2\u7EDD\u5185\u5BB9 + +# Parallel Review And Approve Task Definitions + +wf_workflowmodel.type.wf_submitParallelReviewTask.title=\u5F00\u59CB\u5E76\u884C\u590D\u67E5 +wf_workflowmodel.type.wf_submitParallelReviewTask.description=\u5411\u4E00\u5217\u4EBA\u5458\u63D0\u4EA4\u6587\u6863\u4F9B\u590D\u67E5\u548C\u6279\u51C6 +wf_workflowmodel.property.wf_requiredApprovePercent.title=\u6240\u9700\u6279\u51C6\u767E\u5206\u6BD4 +wf_workflowmodel.property.wf_requiredApprovePercent.description=\u8FBE\u5230\u6279\u51C6\u6761\u4EF6\u6240\u9700\u6279\u51C6\u590D\u67E5\u8005\u6240\u5360\u767E\u5206\u6BD4 +wf_workflowmodel.type.wf_rejectedParallelTask.title=\u5DF2\u62D2\u7EDD +wf_workflowmodel.type.wf_rejectedParallelTask.description=\u5DF2\u62D2\u7EDD +wf_workflowmodel.type.wf_approvedParallelTask.title=\u5DF2\u6279\u51C6 +wf_workflowmodel.type.wf_approvedParallelTask.description=\u5DF2\u6279\u51C6 +wf_workflowmodel.property.wf_reviewerCount.title=\u590D\u67E5\u8005\u6570 +wf_workflowmodel.property.wf_reviewerCount.description=\u590D\u67E5\u8005\u6570 +wf_workflowmodel.property.wf_requiredPercent.title=\u6240\u9700\u6279\u51C6\u767E\u5206\u6BD4 +wf_workflowmodel.property.wf_requiredPercent.description=\u6240\u9700\u6279\u51C6\u767E\u5206\u6BD4 +wf_workflowmodel.property.wf_approveCount.title=\u5DF2\u6279\u51C6\u7684\u590D\u67E5\u8005 +wf_workflowmodel.property.wf_approveCount.description=\u5DF2\u6279\u51C6\u7684\u590D\u67E5\u8005 +wf_workflowmodel.property.wf_actualPercent.title=\u5B9E\u9645\u6279\u51C6\u767E\u5206\u6BD4 +wf_workflowmodel.property.wf_actualPercent.description=\u5B9E\u9645\u6279\u51C6\u767E\u5206\u6BD4 +wf_workflowmodel.property.wf_reviewOutcome.title=\u590D\u67E5\u7ED3\u679C +wf_workflowmodel.property.wf_reviewOutcome.description=\u590D\u67E5\u7ED3\u679C + +# Pooled Review Task Definitions + +wf_workflowmodel.type.wf_submitGroupReviewTask.title=\u5F00\u59CB\u7EC4\u590D\u67E5 +wf_workflowmodel.type.wf_submitGroupReviewTask.description=\u5411\u4E00\u7EC4\u4EBA\u5458\u63D0\u4EA4\u6587\u6863\u4F9B\u590D\u67E5\u548C\u6279\u51C6 + +# List constraint display labels +listconstraint.wf_reviewOutcomeOptions.Approve=\u6279\u51C6 +listconstraint.wf_reviewOutcomeOptions.Reject=\u62D2\u7EDD + +# The result of a workflow task seen on Workflow Details - History +# This is formed by prefixing workflowtask.outcome to the value of the wf:outcome property +workflowtask.outcome.Approve=\u5DF2\u6279\u51C6 +workflowtask.outcome.Reject=\u5DF2\u62D2\u7EDD + diff --git a/source/java/org/alfresco/repo/discussion/DiscussionServiceImpl.java b/source/java/org/alfresco/repo/discussion/DiscussionServiceImpl.java index 30cb24972c..4987398d2f 100644 --- a/source/java/org/alfresco/repo/discussion/DiscussionServiceImpl.java +++ b/source/java/org/alfresco/repo/discussion/DiscussionServiceImpl.java @@ -34,6 +34,7 @@ import org.alfresco.query.EmptyCannedQueryResults; import org.alfresco.query.EmptyPagingResults; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; +import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.discussion.cannedqueries.GetDiscussionTopcisWithPostsCannedQuery; import org.alfresco.repo.discussion.cannedqueries.GetDiscussionTopcisWithPostsCannedQueryFactory; import org.alfresco.repo.discussion.cannedqueries.NodeWithChildrenEntity; @@ -389,8 +390,9 @@ public class DiscussionServiceImpl implements DiscussionService // Store the content ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true); writer.setEncoding("UTF-8"); + writer.setMimetype(MimetypeMap.MIMETYPE_HTML); writer.putContent(contents); - + // Generate the wrapping object for it // Build it that way, so creator and created date come through return buildPost(nodeRef, topic, name, contents); diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 80d4935b7e..461b5e1e15 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -51,7 +51,8 @@ import org.alfresco.repo.action.executer.TransformActionExecuter; import org.alfresco.repo.content.transform.magick.ImageTransformationOptions; import org.alfresco.repo.model.filefolder.FileFolderServiceImpl.InvalidTypeException; import org.alfresco.repo.search.QueryParameterDefImpl; -import org.alfresco.repo.security.permissions.AccessDeniedException; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.tagging.script.TagScope; import org.alfresco.repo.thumbnail.ThumbnailDefinition; import org.alfresco.repo.thumbnail.ThumbnailHelper; @@ -484,21 +485,37 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider // The current node is a folder e.g. Company Home and standard child folders. // optimized code path for cm:folder and sub-types supporting getChildrenByName() method NodeRef result = null; - StringTokenizer t = new StringTokenizer(path, "/"); + final StringTokenizer t = new StringTokenizer(path, "/"); if (t.hasMoreTokens()) { result = this.nodeRef; while (t.hasMoreTokens() && result != null) { - String name = t.nextToken(); - try + final String name = t.nextToken(); + final NodeRef lastName = result; + result = AuthenticationUtil.runAsSystem(new RunAsWork() { - result = this.nodeService.getChildByName(result, ContentModel.ASSOC_CONTAINS, name); - } - catch (AccessDeniedException ade) - { - result = null; - } + @Override + public NodeRef doWork() throws Exception + { + NodeRef child = null; + if (t.hasMoreTokens()) + { + // allow traversal of a cm:name based path even if user cannot retrieve the node directly + child = nodeService.getChildByName(lastName, ContentModel.ASSOC_CONTAINS, name); + } + else + { + // final node must be accessible to the user via the usual ACL permission checks + child = nodeService.getChildByName(lastName, ContentModel.ASSOC_CONTAINS, name); + if (child != null && AccessStatus.ALLOWED != services.getPermissionService().hasPermission(child, PermissionService.READ_PROPERTIES)) + { + child = null; + } + } + return child; + } + }); } } diff --git a/source/java/org/alfresco/repo/jscript/Search.java b/source/java/org/alfresco/repo/jscript/Search.java index 5f8a1e5018..95cc4c5d93 100644 --- a/source/java/org/alfresco/repo/jscript/Search.java +++ b/source/java/org/alfresco/repo/jscript/Search.java @@ -793,6 +793,9 @@ public class Search extends BaseScopableProcessorExtension { Collection set = null; + if (logger.isDebugEnabled()) + logger.debug("query=" + sp.getQuery() + " limit=" + sp.getLimit()); + // perform the search against the repo ResultSet results = null; try diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index 6446add82c..0c4b07c1a0 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -1,1466 +1,1474 @@ -/* - * Copyright (C) 2005-2011 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.model.filefolder; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.ResourceBundle.Control; -import java.util.Set; -import java.util.Stack; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.model.ContentModel; -import org.alfresco.query.CannedQueryFactory; -import org.alfresco.query.CannedQueryResults; -import org.alfresco.query.PagingRequest; -import org.alfresco.query.PagingResults; -import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility; -import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery; -import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory; -import org.alfresco.repo.search.QueryParameterDefImpl; -import org.alfresco.repo.security.permissions.PermissionCheckedCollection.PermissionCheckedCollectionMixin; -import org.alfresco.repo.security.permissions.PermissionCheckedValue.PermissionCheckedValueMixin; -import org.alfresco.service.Auditable; -import org.alfresco.service.cmr.dictionary.DataTypeDefinition; -import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.model.FileExistsException; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileFolderServiceType; -import org.alfresco.service.cmr.model.FileFolderUtil; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.model.FileNotFoundException; -import org.alfresco.service.cmr.model.SubFolderFilter; -import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.ContentData; -import org.alfresco.service.cmr.repository.ContentReader; -import org.alfresco.service.cmr.repository.ContentService; -import org.alfresco.service.cmr.repository.ContentWriter; -import org.alfresco.service.cmr.repository.CopyService; -import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException; -import org.alfresco.service.cmr.repository.InvalidNodeRefException; -import org.alfresco.service.cmr.repository.MimetypeService; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.Path; -import org.alfresco.service.cmr.search.QueryParameterDefinition; -import org.alfresco.service.cmr.search.SearchService; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; -import org.alfresco.util.FileFilterMode; -import org.alfresco.util.FileFilterMode.Client; -import org.alfresco.util.GUID; -import org.alfresco.util.Pair; -import org.alfresco.util.ParameterCheck; -import org.alfresco.util.SearchLanguageConversion; -import org.alfresco.util.registry.NamedObjectRegistry; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.extensions.surf.util.I18NUtil; - -/** - * Implementation of the file/folder-specific service. - * - * @author Derek Hulley - */ -public class FileFolderServiceImpl implements FileFolderService -{ - private static final String CANNED_QUERY_FILEFOLDER_LIST = "fileFolderGetChildrenCannedQueryFactory"; - - /** Shallow search for files and folders with a name pattern */ - private static final String XPATH_QUERY_SHALLOW_ALL = - "./*" + - "[like(@cm:name, $cm:name, false)" + - " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + - " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "') or subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + - " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; - - /** Deep search for files and folders with a name pattern */ - private static final String XPATH_QUERY_DEEP_ALL = - ".//*" + - "[like(@cm:name, $cm:name, false)" + - " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + - " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "') or subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + - " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; - - /** Deep search for folders with a name pattern */ - private static final String XPATH_QUERY_DEEP_FOLDERS = - ".//*" + - "[like(@cm:name, $cm:name, false)" + - " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + - " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "'))]"; - - /** Deep search for files with a name pattern */ - private static final String XPATH_QUERY_DEEP_FILES = - ".//*" + - "[like(@cm:name, $cm:name, false)" + - " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + - " and (subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + - " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; - - private static Log logger = LogFactory.getLog(FileFolderServiceImpl.class); - - private HiddenAspect hiddenAspect; - private NamespaceService namespaceService; - private DictionaryService dictionaryService; - private NodeService nodeService; - private CopyService copyService; - private SearchService searchService; - private ContentService contentService; - private MimetypeService mimetypeService; - private NamedObjectRegistry> cannedQueryRegistry; - - private Set systemNamespaces; - - // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) - private List systemPaths; - - // default cutoff - applies to list "all" methods - private int defaultListMaxResults = 5000; - - /** - * Default constructor - */ - public FileFolderServiceImpl() - { - systemNamespaces = new HashSet(5); - } - - public void setNamespaceService(NamespaceService namespaceService) - { - this.namespaceService = namespaceService; - } - - public void setDictionaryService(DictionaryService dictionaryService) - { - this.dictionaryService = dictionaryService; - } - - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - public void setCopyService(CopyService copyService) - { - this.copyService = copyService; - } - - public void setSearchService(SearchService searchService) - { - this.searchService = searchService; - } - - public void setContentService(ContentService contentService) - { - this.contentService = contentService; - } - - public void setMimetypeService(MimetypeService mimetypeService) - { - this.mimetypeService = mimetypeService; - } - - public void setHiddenAspect(HiddenAspect hiddenAspect) - { - this.hiddenAspect = hiddenAspect; - } - - /** - * Set the registry of {@link CannedQueryFactory canned queries} - */ - public void setCannedQueryRegistry(NamedObjectRegistry> cannedQueryRegistry) - { - this.cannedQueryRegistry = cannedQueryRegistry; - } - - /** - * Set the namespaces that should be treated as 'system' namespaces. - *

- * When files or folders are renamed, the association path (QName) is normally - * modified to follow the name of the node. If, however, the namespace of the - * patch QName is in this list, the association path is left alone. This allows - * parts of the application to use well-known paths even if the end-user is - * able to modify the objects cm:name value. - * - * @param systemNamespaces a list of system namespaces - */ - public void setSystemNamespaces(List systemNamespaces) - { - this.systemNamespaces.addAll(systemNamespaces); - } - - // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) - public void setSystemPaths(List systemPaths) - { - this.systemPaths = systemPaths; - } - - public void setDefaultListMaxResults(int defaultListMaxResults) - { - this.defaultListMaxResults = defaultListMaxResults; - } - - - public void init() - { - } - - /** - * Helper method to convert node reference instances to file info - * - * @param nodeRefs the node references - * @return Return a list of file info - * @throws InvalidTypeException if the node is not a valid type - */ - private List toFileInfo(List nodeRefs) throws InvalidTypeException - { - List results = new ArrayList(nodeRefs.size()); - Client client = FileFilterMode.getClient(); - for (NodeRef nodeRef : nodeRefs) - { - try - { - if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.NotVisible) - { - continue; - } - FileInfo fileInfo = toFileInfo(nodeRef, true); - results.add(fileInfo); - } - catch (InvalidNodeRefException inre) - { - logger.warn("toFileInfo: "+inre); - // skip - } - } - return results; - } - - /** - * Helper method to convert a node reference instance to a file info - */ - private FileInfo toFileInfo(NodeRef nodeRef, boolean addTranslations) throws InvalidTypeException - { - // Get the file attributes - Map properties = nodeService.getProperties(nodeRef); - // Is it a folder - QName typeQName = nodeService.getType(nodeRef); - boolean isFolder = isFolder(typeQName); - boolean isHidden = false; - - Client client = FileFilterMode.getClient(); - if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.HiddenAttribute) - { - isHidden = true; - } - - // Construct the file info and add to the results - FileInfo fileInfo = new FileInfoImpl(nodeRef, typeQName, isFolder, isHidden, properties); - - // Done - return fileInfo; - } - - /** - * Exception when the type is not a valid File or Folder type - * - * @see ContentModel#TYPE_CONTENT - * @see ContentModel#TYPE_FOLDER - * - * @author Derek Hulley - */ - public static class InvalidTypeException extends RuntimeException - { - private static final long serialVersionUID = -310101369475434280L; - - public InvalidTypeException(String msg) - { - super(msg); - } - } - - /** - * Checks the type for whether it is a file or folder. All invalid types - * lead to runtime exceptions. - * - * @param typeQName the type to check - * @return Returns true if the type is a valid folder type, false if it is a file. - * @throws AlfrescoRuntimeException if the type is not handled by this service - */ - private boolean isFolder(QName typeQName) throws InvalidTypeException - { - FileFolderServiceType type = getType(typeQName); - - switch (type) - { - case FILE: - return false; - case FOLDER: - return true; - case SYSTEM_FOLDER: - throw new InvalidTypeException("This service should ignore type " + ContentModel.TYPE_SYSTEM_FOLDER); - case INVALID: - default: - throw new InvalidTypeException("Type is not handled by this service: " + typeQName); - } - } - - public boolean exists(NodeRef nodeRef) - { - return nodeService.exists(nodeRef); - } - - public FileFolderServiceType getType(QName typeQName) - { - if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_FOLDER)) - { - if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_SYSTEM_FOLDER)) - { - return FileFolderServiceType.SYSTEM_FOLDER; - } - return FileFolderServiceType.FOLDER; - } - else if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_CONTENT) || - dictionaryService.isSubClass(typeQName, ContentModel.TYPE_LINK)) - { - // it is a regular file - return FileFolderServiceType.FILE; - } - else - { - // unhandled type - return FileFolderServiceType.INVALID; - } - } - - public List list(NodeRef contextNodeRef) - { - // execute the query - List results = listSimple(contextNodeRef, true, true); - // done - if (logger.isTraceEnabled()) - { - logger.trace("List files and folders: \n" + - " context: " + contextNodeRef + "\n" + - " results: " + results); - } - return results; - } - - private PagingResults getPagingResults(PagingRequest pagingRequest, final CannedQueryResults results) - { - List nodeRefs = null; - if (results.getPageCount() > 0) - { - nodeRefs = results.getPages().get(0); - } - else - { - nodeRefs = Collections.emptyList(); - } - - // set total count - final Pair totalCount; - if (pagingRequest.getRequestTotalCountMax() > 0) - { - totalCount = results.getTotalResultCount(); - } - else - { - totalCount = null; - } - - final List nodeInfos = new ArrayList(nodeRefs.size()); - final Client client = FileFilterMode.getClient(); - for (NodeRef nodeRef : nodeRefs) - { - if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.NotVisible) - { - continue; - } - - nodeInfos.add(toFileInfo(nodeRef, true)); - } - PermissionCheckedCollectionMixin.create(nodeInfos, nodeRefs); - - return new PagingResults() - { - @Override - public String getQueryExecutionId() - { - return results.getQueryExecutionId(); - } - @Override - public List getPage() - { - return nodeInfos; - } - @Override - public boolean hasMoreItems() - { - return results.hasMoreItems(); - } - @Override - public Pair getTotalResultCount() - { - return totalCount; - } - }; - } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.model.FileFolderService#list(org.alfresco.service.cmr.repository.NodeRef, boolean, boolean, java.util.Set, org.alfresco.service.cmr.model.PagingSortRequest) - */ - @Auditable(parameters = {"contextNodeRef", "files", "folders", "ignoreTypeQNames", "sortProps", "pagingRequest"}) - public PagingResults list(NodeRef contextNodeRef, - boolean files, - boolean folders, - Set ignoreTypeQNames, - List> sortProps, - PagingRequest pagingRequest) - { - ParameterCheck.mandatory("contextNodeRef", contextNodeRef); - ParameterCheck.mandatory("pagingRequest", pagingRequest); - - Set searchTypeQNames = buildTypes(files, folders, ignoreTypeQNames); - - // execute query - final CannedQueryResults results = listImpl(contextNodeRef, null, searchTypeQNames, sortProps, pagingRequest); - return getPagingResults(pagingRequest, results); - } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.model.FileFolderService#list(org.alfresco.service.cmr.repository.NodeRef, boolean, boolean, String, java.util.Set, org.alfresco.service.cmr.model.PagingSortRequest) - */ - public PagingResults list(NodeRef contextNodeRef, boolean files, boolean folders, String pattern, Set ignoreQNameTypes, List> sortProps, PagingRequest pagingRequest) - { - ParameterCheck.mandatory("contextNodeRef", contextNodeRef); - ParameterCheck.mandatory("pagingRequest", pagingRequest); - - Set searchTypeQNames = buildTypes(files, folders, ignoreQNameTypes); - - // execute query - final CannedQueryResults results = listImpl(contextNodeRef, pattern, searchTypeQNames, sortProps, pagingRequest); - return getPagingResults(pagingRequest, results); - } - - private CannedQueryResults listImpl(NodeRef contextNodeRef, boolean files, boolean folders) - { - Set searchTypeQNames = buildTypes(files, folders, null); - return listImpl(contextNodeRef, searchTypeQNames); - } - - private CannedQueryResults listImpl(NodeRef contextNodeRef, Set searchTypeQNames) - { - return listImpl(contextNodeRef, null, searchTypeQNames, null, new PagingRequest(defaultListMaxResults, null)); - } - - // note: similar to getChildAssocs(contextNodeRef, searchTypeQNames) but enables paging features, including max items, sorting etc (with permissions per-applied) - private CannedQueryResults listImpl(NodeRef contextNodeRef, String pattern, Set searchTypeQNames, List> sortProps, PagingRequest pagingRequest) - { - Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); - - // get canned query - GetChildrenCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_FILEFOLDER_LIST); - - GetChildrenCannedQuery cq = (GetChildrenCannedQuery)getChildrenCannedQueryFactory.getCannedQuery(contextNodeRef, pattern, Collections.singleton(ContentModel.ASSOC_CONTAINS), searchTypeQNames, null, sortProps, pagingRequest); - - // execute canned query - CannedQueryResults results = cq.execute(); - - if (start != null) - { - int cnt = results.getPagedResultCount(); - int skipCount = pagingRequest.getSkipCount(); - int maxItems = pagingRequest.getMaxItems(); - boolean hasMoreItems = results.hasMoreItems(); - Pair totalCount = (pagingRequest.getRequestTotalCountMax() > 0 ? results.getTotalResultCount() : null); - int pageNum = (skipCount / maxItems) + 1; - - logger.debug("List: "+cnt+" items in "+(System.currentTimeMillis()-start)+" msecs [pageNum="+pageNum+",skip="+skipCount+",max="+maxItems+",hasMorePages="+hasMoreItems+",totalCount="+totalCount+",parentNodeRef="+contextNodeRef+"]"); - } - - return results; - } - - public List listFiles(NodeRef contextNodeRef) - { - // execute the query - List results = listSimple(contextNodeRef, true, false); - // done - if (logger.isTraceEnabled()) - { - logger.trace("List files: \n" + - " context: " + contextNodeRef + "\n" + - " results: " + results); - } - return results; - } - - public List listFolders(NodeRef contextNodeRef) - { - // execute the query - List results = listSimple(contextNodeRef, false, true); - // done - if (logger.isTraceEnabled()) - { - logger.trace("List for folders: \n" + - " context: " + contextNodeRef + "\n" + - " results: " + results); - } - return results; - } - - public List listDeepFolders(NodeRef contextNodeRef, - SubFolderFilter filter) - { - List nodeRefs = listSimpleDeep(contextNodeRef, false, true, filter); - - List results = toFileInfo(nodeRefs); - - // done - if (logger.isTraceEnabled()) - { - logger.trace("Deep search for files: \n" + - " context: " + contextNodeRef + "\n" + - " results: " + results.size()); - } - return results; - - } - - @Override - public NodeRef getLocalizedSibling(NodeRef nodeRef) - { - Locale userLocale = I18NUtil.getLocale(); - - String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); - NodeRef parentNodeRef = nodeService.getPrimaryParent(nodeRef).getParentRef(); - // Work out the base name we are working with - Pair split = getExtension(name, false); - String base = split.getFirst(); - String ext = split.getSecond(); - - NodeRef resultNodeRef = nodeRef; - // Search for siblings with the same name - Control resourceHelper = Control.getControl(Control.FORMAT_DEFAULT); - List candidateLocales = resourceHelper.getCandidateLocales(base, userLocale); - for (Locale candidateLocale : candidateLocales) - { - String filename = resourceHelper.toBundleName(base, candidateLocale) + "." + ext; - // Attempt to find the file - NodeRef foundNodeRef = searchSimple(parentNodeRef, filename); - if (foundNodeRef != null) // TODO: Check for read permissions - { - resultNodeRef = foundNodeRef; - break; - } - } - // Done - return resultNodeRef; - } - - public NodeRef searchSimple(NodeRef contextNodeRef, String name) - { - NodeRef childNodeRef = nodeService.getChildByName(contextNodeRef, ContentModel.ASSOC_CONTAINS, name); - if (logger.isTraceEnabled()) - { - logger.trace( - "Simple name search results: \n" + - " parent: " + contextNodeRef + "\n" + - " name: " + name + "\n" + - " result: " + childNodeRef); - } - return childNodeRef; - } - - /** - * @see #search(NodeRef, String, boolean, boolean, boolean) - */ - public List search(NodeRef contextNodeRef, String namePattern, boolean includeSubFolders) - { - return search(contextNodeRef, namePattern, true, true, includeSubFolders); - } - - private static final String LUCENE_MULTI_CHAR_WILDCARD = "*"; - - /** - * Full search with all options - */ - public List search( - NodeRef contextNodeRef, - String namePattern, - boolean fileSearch, - boolean folderSearch, - boolean includeSubFolders) - { - // get the raw nodeRefs - List nodeRefs = searchInternal(contextNodeRef, namePattern, fileSearch, folderSearch, includeSubFolders); - - List results = toFileInfo(nodeRefs); - - // eliminate unwanted files/folders - Iterator iterator = results.iterator(); - while (iterator.hasNext()) - { - FileInfo file = iterator.next(); - if (file.isFolder() && !folderSearch) - { - iterator.remove(); - } - else if (!file.isFolder() && !fileSearch) - { - iterator.remove(); - } - } - // done - if (logger.isTraceEnabled()) - { - logger.trace("Deep search: \n" + - " context: " + contextNodeRef + "\n" + - " pattern: " + namePattern + "\n" + - " files: " + fileSearch + "\n" + - " folders: " + folderSearch + "\n" + - " deep: " + includeSubFolders + "\n" + - " results: " + results); - } - return results; - } - - /** - * Performs a full search, but doesn't translate the node references into - * file info objects. This allows {@link #checkExists(NodeRef, String)} to - * bypass the retrieval of node properties. - */ - private List searchInternal( - NodeRef contextNodeRef, - String namePattern, - boolean fileSearch, - boolean folderSearch, - boolean includeSubFolders) - { - // shortcut if the search is requesting nothing - if (!fileSearch && !folderSearch) - { - return Collections.emptyList(); - } - - if (namePattern == null) - { - namePattern = LUCENE_MULTI_CHAR_WILDCARD; // default to wildcard - } - // now check if we can use Lucene to handle this query - boolean anyName = namePattern.equals(LUCENE_MULTI_CHAR_WILDCARD); - - List nodeRefs = null; - if (anyName) - { - // This is search for any name - if(includeSubFolders) - { - nodeRefs = listSimpleDeep(contextNodeRef, fileSearch, folderSearch, null); - } - else - { - nodeRefs = listImpl(contextNodeRef, fileSearch, folderSearch).getPage(); - } - } - else - { - // TODO - we need to get rid of this xpath stuff - // if the name pattern is null, then we use the ANY pattern - QueryParameterDefinition[] params = null; - if (namePattern != null) - { - // the interface specifies the Lucene syntax, so perform a conversion - namePattern = SearchLanguageConversion.convert( - SearchLanguageConversion.DEF_LUCENE, - SearchLanguageConversion.DEF_XPATH_LIKE, - namePattern); - - params = new QueryParameterDefinition[1]; - params[0] = new QueryParameterDefImpl( - ContentModel.PROP_NAME, - dictionaryService.getDataType(DataTypeDefinition.TEXT), - true, - namePattern); - } - // determine the correct query to use - String query = null; - if (includeSubFolders) - { - // this is a deep search - if(!fileSearch && folderSearch) - { - // This is a folder search only; - query = XPATH_QUERY_DEEP_FOLDERS; - } - else if(fileSearch && !folderSearch) - { - // This is a folder search only; - query = XPATH_QUERY_DEEP_FILES; - } - else - { - query = XPATH_QUERY_DEEP_ALL; - } - } - else - { - // this is a shallow search - query = XPATH_QUERY_SHALLOW_ALL; - } - // execute the query - nodeRefs = searchService.selectNodes( - contextNodeRef, - query, - params, - namespaceService, - false); - } - // done - return nodeRefs; - } - - private List listSimple(NodeRef contextNodeRef, boolean files, boolean folders) throws InvalidTypeException - { - CannedQueryResults cq = listImpl(contextNodeRef, files, folders); - List nodeRefs = cq.getPage(); - - List results = toFileInfo(nodeRefs); - - // avoid re-applying permissions (for "list" canned queries) - return PermissionCheckedValueMixin.create(results); - } - - private Set buildTypes(boolean files, boolean folders, Set ignoreQNameTypes) - { - Set searchTypeQNames = new HashSet(100); - - // Build a list of file and folder types - if (folders) - { - searchTypeQNames.addAll(buildFolderTypes()); - } - if (files) - { - searchTypeQNames.addAll(buildFileTypes()); - } - - if (ignoreQNameTypes != null) - { - searchTypeQNames.removeAll(ignoreQNameTypes); - } - - return searchTypeQNames; - } - - private Set buildFolderTypes() - { - Set folderTypeQNames = new HashSet(50); - - // Build a list of folder types - Collection qnames = dictionaryService.getSubTypes(ContentModel.TYPE_FOLDER, true); - folderTypeQNames.addAll(qnames); - folderTypeQNames.add(ContentModel.TYPE_FOLDER); - - // Remove 'system' folders - qnames = dictionaryService.getSubTypes(ContentModel.TYPE_SYSTEM_FOLDER, true); - folderTypeQNames.removeAll(qnames); - folderTypeQNames.remove(ContentModel.TYPE_SYSTEM_FOLDER); - - return folderTypeQNames; - } - - private Set buildFileTypes() - { - Set fileTypeQNames = new HashSet(50); - - // Build a list of file types - Collection qnames = dictionaryService.getSubTypes(ContentModel.TYPE_CONTENT, true); - fileTypeQNames.addAll(qnames); - fileTypeQNames.add(ContentModel.TYPE_CONTENT); - qnames = dictionaryService.getSubTypes(ContentModel.TYPE_LINK, true); - fileTypeQNames.addAll(qnames); - fileTypeQNames.add(ContentModel.TYPE_LINK); - - return fileTypeQNames; - } - - /** - * A deep version of listSimple. Which recursively walks down the tree from a given starting point, returning - * the node refs of files or folders found along the way. - *

- * The folder filter is called for each sub-folder to determine whether to search in that sub-folder, should a subfolder be excluded - * then all its chidren are excluded as well. - * - * @param contextNodeRef the starting point. - * @param folders return nodes of type folders. - * @param files return nodes of type files. - * @param subfolder filter controls which folders to search. If null then all subfolders are searched. - * @return list of node references - */ - /*

- * MER: I've added this rather than changing listSimple to minimise the risk of breaking - * the existing code. This is a quick performance improvement between using - * XPath which is awful or adding new methods to the NodeService/DB This is also a dangerous method in that it can return a - * lot of data and take a long time. - */ - private List listSimpleDeep(NodeRef contextNodeRef, boolean files, boolean folders, SubFolderFilter folderFilter) - { - if(logger.isDebugEnabled()) - { - logger.debug("searchSimpleDeep contextNodeRef:" + contextNodeRef); - } - - // To hold the results. - List result = new ArrayList(); - - // Build a list of folder types - Set folderTypeQNames = buildFolderTypes(); - Set fileTypeQNames = (files ? buildFileTypes() : new HashSet(0)); - - if(!folders && !files) - { - return Collections.emptyList(); - - } - - // Shortcut - if (folderTypeQNames.size() == 0) - { - return Collections.emptyList(); - } - - Stack toSearch = new Stack(); - toSearch.push(contextNodeRef); - - // Now we need to walk down the folders. - while(!toSearch.empty()) - { - NodeRef currentDir = toSearch.pop(); - - List folderAssocRefs = nodeService.getChildAssocs(currentDir, folderTypeQNames); - - for (ChildAssociationRef folderRef : folderAssocRefs) - { - // We have some child folders - boolean include = true; - if(folderFilter != null) - { - include = folderFilter.isEnterSubfolder(folderRef); - if(include) - { - // yes search in these subfolders - toSearch.push(folderRef.getChildRef()); - } - } - else - { - // No filter - Add the folders in the currentDir - toSearch.push(folderRef.getChildRef()); - } - - if(folders && include) - { - result.add(folderRef.getChildRef()); - } - } - - if(files) - { - // Add the files in the current dir - List fileAssocRefs = nodeService.getChildAssocs(currentDir, fileTypeQNames); - for (ChildAssociationRef fileRef : fileAssocRefs) - { - result.add(fileRef.getChildRef()); - } - } - } - - - if(logger.isDebugEnabled()) - { - logger.debug("searchSimpleDeep finished size:" + result.size()); - } - - // Done - return result; - } - - /** - * @see #move(NodeRef, NodeRef, String) - */ - public FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException - { - return moveOrCopy(sourceNodeRef, null, null, newName, true); - } - - /** - * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) - */ - @Override - public FileInfo move(NodeRef sourceNodeRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException - { - return moveOrCopy(sourceNodeRef, null, targetParentRef, newName, true); - } - - /** - * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) - */ - @Override - public FileInfo moveFrom(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException - { - return moveOrCopy(sourceNodeRef, sourceParentRef, targetParentRef, newName, true); - } - - /** - * @deprecated - */ - @Override - public FileInfo move(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException - { - return moveOrCopy(sourceNodeRef, sourceParentRef, targetParentRef, newName, true); - } - - /** - * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) - */ - public FileInfo copy(NodeRef sourceNodeRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException - { - return moveOrCopy(sourceNodeRef, null, targetParentRef, newName, false); - } - - /** - * Implements both move and copy behaviour - * - * @param move true to move, otherwise false to copy - */ - private FileInfo moveOrCopy(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName, boolean move) throws FileExistsException, FileNotFoundException - { - // get file/folder in its current state - FileInfo beforeFileInfo = toFileInfo(sourceNodeRef, true); - // check the name - null means keep the existing name - if (newName == null) - { - newName = beforeFileInfo.getName(); - } - - boolean nameChanged = (newName.equals(beforeFileInfo.getName()) == false); - - // check is primary parent - boolean isPrimaryParent = true; - if (sourceParentRef != null) - { - isPrimaryParent = sourceParentRef.equals(nodeService.getPrimaryParent(sourceNodeRef).getParentRef()); - } - - // we need the current association type - ChildAssociationRef assocRef = null; - if (isPrimaryParent) - { - assocRef = nodeService.getPrimaryParent(sourceNodeRef); - } - else - { - List assocList = nodeService.getParentAssocs(sourceNodeRef); - if (assocList != null) - { - for (ChildAssociationRef assocListEntry : assocList) - { - if (sourceParentRef.equals(assocListEntry.getParentRef())) - { - assocRef = assocListEntry; - break; - } - } - } - } - if (targetParentRef == null) - { - targetParentRef = assocRef.getParentRef(); - } - - boolean changedParent = !targetParentRef.equals(assocRef.getParentRef()); - // there is nothing to do if both the name and parent folder haven't changed - if (!nameChanged && !changedParent) - { - if (logger.isDebugEnabled()) - { - logger.debug("Doing nothing - neither filename or parent has changed: \n" + - " parent: " + targetParentRef + "\n" + - " before: " + beforeFileInfo + "\n" + - " new name: " + newName); - } - return beforeFileInfo; - } - - QName existingQName = assocRef.getQName(); - QName qname; - if (nameChanged && !systemNamespaces.contains(existingQName.getNamespaceURI())) - { - // Change the localname to match the new name - qname = QName.createQName( - assocRef.getQName().getNamespaceURI(), - QName.createValidLocalName(newName)); - } - else - { - // Keep the localname - qname = existingQName; - } - - QName targetParentType = nodeService.getType(targetParentRef); - - // Fix AWC-1517 & ALF-5569 - QName assocTypeQname = null; - if (nameChanged && move) - { - // if it's a rename use the existing assoc type - assocTypeQname = assocRef.getTypeQName(); - } - else - { - if (dictionaryService.isSubClass(targetParentType, ContentModel.TYPE_FOLDER)) - { - assocTypeQname = ContentModel.ASSOC_CONTAINS; // cm:folder -> cm:contains - } - else if (dictionaryService.isSubClass(targetParentType, ContentModel.TYPE_CONTAINER)) - { - assocTypeQname = ContentModel.ASSOC_CHILDREN; // sys:container -> sys:children - } - else - { - throw new InvalidTypeException("Unexpected type (" + targetParentType + ") for target parent: " + targetParentRef); - } - } - - // move or copy - NodeRef targetNodeRef = null; - if (move) - { - // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) - if (!isSystemPath(sourceNodeRef)) - { - // The cm:name might clash with another node in the target location. - if (nameChanged) - { - // The name will be changing, so we really need to set the node's name to the new - // name. This can't be done at the same time as the move - to avoid incorrect violations - // of the name constraints, the cm:name is set to something random and will be reset - // to the correct name later. - nodeService.setProperty(sourceNodeRef, ContentModel.PROP_NAME, GUID.generate()); - } - try - { - ChildAssociationRef newAssocRef = null; - - if (isPrimaryParent) - { - // move the node so that the association moves as well - newAssocRef = nodeService.moveNode(sourceNodeRef, targetParentRef, assocTypeQname, qname); - } - else - { - nodeService.removeChild(sourceParentRef, sourceNodeRef); - newAssocRef = nodeService.addChild(targetParentRef, sourceNodeRef, assocRef.getTypeQName(), assocRef.getQName()); - } - - targetNodeRef = newAssocRef.getChildRef(); - } - catch (DuplicateChildNodeNameException e) - { - throw new FileExistsException(targetParentRef, newName); - } - } - else - { - // system path folders do not need to be moved - targetNodeRef = sourceNodeRef; - } - } - else - { - try - { - // Copy the node. The cm:name will be dropped and reset later. - targetNodeRef = copyService.copy( - sourceNodeRef, - targetParentRef, - assocTypeQname, - qname, - true); - } - catch (DuplicateChildNodeNameException e) - { - throw new FileExistsException(targetParentRef, newName); - } - } - - // Only update the name if it has changed - String currentName = (String)nodeService.getProperty(targetNodeRef, ContentModel.PROP_NAME); - if (currentName.equals(newName) == false) - { - try - { - // changed the name property - nodeService.setProperty(targetNodeRef, ContentModel.PROP_NAME, newName); - - // May need to update the mimetype, to support apps using .tmp files when saving - ContentData contentData = (ContentData)nodeService.getProperty(targetNodeRef, ContentModel.PROP_CONTENT); - - // Check the newName and oldName extensions. - // Keep previous mimetype if - // 1. new extension is empty - // 2. new extension is '.tmp' - // 3. extension was not changed, - // - // It fixes the ETWOTWO-16 issue. - String oldExt = getExtension(beforeFileInfo.getName(), true).getSecond(); - String newExt = getExtension(newName, true).getSecond(); - if (contentData != null && - newExt.length() != 0 && - !"tmp".equalsIgnoreCase(newExt) && - !newExt.equalsIgnoreCase(oldExt)) - { - String targetMimetype = contentData.getMimetype(); - String newMimetype = mimetypeService.guessMimetype(newName); - if (!targetMimetype.equalsIgnoreCase(newMimetype)) - { - contentData = ContentData.setMimetype(contentData, newMimetype); - nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData); - } - } - } - catch (DuplicateChildNodeNameException e) - { - throw new FileExistsException(targetParentRef, newName); - } - } - - // get the details after the operation - FileInfo afterFileInfo = toFileInfo(targetNodeRef, true); - // done - if (logger.isDebugEnabled()) - { - logger.debug("" + (move ? "Moved" : "Copied") + " node: \n" + - " parent: " + targetParentRef + "\n" + - " before: " + beforeFileInfo + "\n" + - " after: " + afterFileInfo); - } - return afterFileInfo; - } - - /** - * Determine if the specified node is a special "system" folder path based node - * - * TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) - * - * @param nodeRef node to check - * @return true => system folder path based node - */ - private boolean isSystemPath(NodeRef nodeRef) - { - Path path = nodeService.getPath(nodeRef); - String prefixedPath = path.toPrefixString(namespaceService); - return systemPaths.contains(prefixedPath); - } - - public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException - { - return createImpl(parentNodeRef, name, typeQName, null); - } - - public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException - { - return createImpl(parentNodeRef, name, typeQName, assocQName); - } - - private FileInfo createImpl(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException - { - // set up initial properties - Map properties = new HashMap(11); - properties.put(ContentModel.PROP_NAME, (Serializable) name); - - // create the node - if (assocQName == null) - { - assocQName = QName.createQName( - NamespaceService.CONTENT_MODEL_1_0_URI, - QName.createValidLocalName(name)); - } - ChildAssociationRef assocRef = null; - try - { - assocRef = nodeService.createNode( - parentNodeRef, - ContentModel.ASSOC_CONTAINS, - assocQName, - typeQName, - properties); - } - catch (DuplicateChildNodeNameException e) - { - throw new FileExistsException(parentNodeRef, name); - } - - NodeRef nodeRef = assocRef.getChildRef(); - - FileInfo fileInfo = toFileInfo(nodeRef, true); - // done - if (logger.isDebugEnabled()) - { - logger.debug("Created: \n" + - " parent: " + parentNodeRef + "\n" + - " created: " + fileInfo); - } - return fileInfo; - } - - public void delete(NodeRef nodeRef) - { - nodeService.deleteNode(nodeRef); - // Done - if (logger.isDebugEnabled()) - { - logger.debug("Deleted: \n" + - " node: " + nodeRef); - } - } - - /** - * Checks for the presence of, and creates as necessary, the folder structure in the provided path. - *

- * An empty path list is not allowed as it would be impossible to necessarily return file info - * for the parent node - it might not be a folder node. - * @param parentNodeRef the node under which the path will be created - * @param pathElements the folder name path to create - may not be empty - * @param folderTypeQName the types of nodes to create. This must be a valid subtype of - * {@link org.alfresco.model.ContentModel#TYPE_FOLDER they folder type}. - * @return Returns the info of the last folder in the path. - * @deprecated Use FileFolderUtil.makeFolders rather than directly accessing this implementation class. - */ - public FileInfo makeFolders(NodeRef parentNodeRef, List pathElements, QName folderTypeQName) - { - return FileFolderUtil.makeFolders(this, parentNodeRef, pathElements, folderTypeQName); - } - - /** - * Checks for the presence of, and creates as necessary, the folder structure in the provided path. - *

- * An empty path list is not allowed as it would be impossible to necessarily return file info - * for the parent node - it might not be a folder node. - * @param parentNodeRef the node under which the path will be created - * @param pathElements the folder name path to create - may not be empty - * @param folderTypeQName the types of nodes to create. This must be a valid subtype of - * {@link org.alfresco.model.ContentModel#TYPE_FOLDER they folder type}. - * @return Returns the info of the last folder in the path. - * @deprecated Use FileFolderUtil.makeFolders rather than directly accessing this implementation class. - */ - public static FileInfo makeFolders(FileFolderService service, NodeRef parentNodeRef, List pathElements, QName folderTypeQName) - { - return FileFolderUtil.makeFolders(service, parentNodeRef, pathElements, folderTypeQName); - } - - public List getNamePath(NodeRef rootNodeRef, NodeRef nodeRef) throws FileNotFoundException - { - // check the root - if (rootNodeRef == null) - { - rootNodeRef = nodeService.getRootNode(nodeRef.getStoreRef()); - } - try - { - ArrayList results = new ArrayList(10); - // get the primary path - Path path = nodeService.getPath(nodeRef); - // iterate and turn the results into file info objects - boolean foundRoot = false; - for (Path.Element element : path) - { - // ignore everything down to the root - Path.ChildAssocElement assocElement = (Path.ChildAssocElement) element; - NodeRef childNodeRef = assocElement.getRef().getChildRef(); - if (childNodeRef.equals(rootNodeRef)) - { - // just found the root - but we don't put in an entry for it - foundRoot = true; - continue; - } - else if (!foundRoot) - { - // keep looking for the root - continue; - } - // we found the root and expect to be building the path up - FileInfo pathInfo = toFileInfo(childNodeRef, true); - - // we can't append a path element to the results if there is already a (non-folder) file at the tail - // since this would result in a path anomoly - file's cannot contain other files. - if (!results.isEmpty() && !results.get(results.size()-1).isFolder()) - { - throw new InvalidTypeException( - "File is not the last element in path: files cannot contain other files."); - } - results.add(pathInfo); - } - // check that we found the root - if (!foundRoot || results.size() == 0) - { - throw new FileNotFoundException(nodeRef); - } - // done - if (logger.isDebugEnabled()) - { - logger.debug("Built name path for node: \n" + - " root: " + rootNodeRef + "\n" + - " node: " + nodeRef + "\n" + - " path: " + results); - } - return results; - } - catch (InvalidNodeRefException e) - { - throw new FileNotFoundException(nodeRef); - } - } - - public FileInfo resolveNamePath(NodeRef rootNodeRef, List pathElements) throws FileNotFoundException - { - return resolveNamePath(rootNodeRef, pathElements, true); - } - - public FileInfo resolveNamePath(NodeRef rootNodeRef, List pathElements, boolean mustExist) throws FileNotFoundException - { - if (pathElements.size() == 0) - { - throw new IllegalArgumentException("Path elements list is empty"); - } - // walk the folder tree first - NodeRef parentNodeRef = rootNodeRef; - StringBuilder currentPath = new StringBuilder(pathElements.size() << 4); - int folderCount = pathElements.size() - 1; - for (int i = 0; i < folderCount; i++) - { - String pathElement = pathElements.get(i); - NodeRef folderNodeRef = searchSimple(parentNodeRef, pathElement); - if (folderNodeRef == null) - { - StringBuilder sb = new StringBuilder(128); - sb.append("Folder not found: " + currentPath); - throw new FileNotFoundException(sb.toString()); - } - parentNodeRef = folderNodeRef; - } - // we have resolved the folder path - resolve the last component - String pathElement = pathElements.get(pathElements.size() - 1); - NodeRef fileNodeRef = searchSimple(parentNodeRef, pathElement); - if (fileNodeRef == null) - { - if (mustExist) - { - throw new FileNotFoundException("File not found: " + currentPath); - } - else - { - return null; - } - } - FileInfo result = getFileInfo(fileNodeRef); - // found it - if (logger.isDebugEnabled()) - { - logger.debug("Resoved path element: \n" + - " root: " + rootNodeRef + "\n" + - " path: " + currentPath + "\n" + - " node: " + result); - } - return result; - } - - public FileInfo getFileInfo(NodeRef nodeRef) - { - try - { - return toFileInfo(nodeRef, true); - } - catch (InvalidTypeException e) - { - return null; - } - } - - public ContentReader getReader(NodeRef nodeRef) - { - FileInfo fileInfo = toFileInfo(nodeRef, false); - if (fileInfo.isFolder()) - { - throw new InvalidTypeException("Unable to get a content reader for a folder: " + fileInfo); - } - return contentService.getReader(nodeRef, ContentModel.PROP_CONTENT); - } - - public ContentWriter getWriter(NodeRef nodeRef) - { - FileInfo fileInfo = toFileInfo(nodeRef, false); - if (fileInfo.isFolder()) - { - throw new InvalidTypeException("Unable to get a content writer for a folder: " + fileInfo); - } - final ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true); - // Ensure that a mimetype is set based on the filename (ALF-6560) - // This has been removed from the create code in 3.4 to prevent insert-update behaviour - // of the ContentData. - if (writer.getMimetype() == null) - { - final String name = fileInfo.getName(); - writer.guessMimetype(name); - } - // Done - return writer; - } - - /** - * Split a filename into the base (part before the '.') and the extension (part after the '.') - */ - private Pair getExtension(String name, boolean useLastDot) - { - String ext = ""; - String base = name; - if (name != null) - { - name = name.trim(); - int index = useLastDot ? name.lastIndexOf('.') : name.indexOf('.'); - if (index > -1 && (index < name.length() - 1)) - { - base = name.substring(0, index); - ext = name.substring(index + 1); - } - } - return new Pair(base, ext); - } -} +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.model.filefolder; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle.Control; +import java.util.Set; +import java.util.Stack; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; +import org.alfresco.query.CannedQueryFactory; +import org.alfresco.query.CannedQueryResults; +import org.alfresco.query.PagingRequest; +import org.alfresco.query.PagingResults; +import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility; +import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery; +import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory; +import org.alfresco.repo.search.QueryParameterDefImpl; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.permissions.PermissionCheckedCollection.PermissionCheckedCollectionMixin; +import org.alfresco.repo.security.permissions.PermissionCheckedValue.PermissionCheckedValueMixin; +import org.alfresco.service.Auditable; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.model.FileExistsException; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileFolderServiceType; +import org.alfresco.service.cmr.model.FileFolderUtil; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.model.FileNotFoundException; +import org.alfresco.service.cmr.model.SubFolderFilter; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.ContentData; +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.ContentService; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.CopyService; +import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException; +import org.alfresco.service.cmr.repository.InvalidNodeRefException; +import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.Path; +import org.alfresco.service.cmr.search.QueryParameterDefinition; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.FileFilterMode; +import org.alfresco.util.FileFilterMode.Client; +import org.alfresco.util.GUID; +import org.alfresco.util.Pair; +import org.alfresco.util.ParameterCheck; +import org.alfresco.util.SearchLanguageConversion; +import org.alfresco.util.registry.NamedObjectRegistry; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.surf.util.I18NUtil; + +/** + * Implementation of the file/folder-specific service. + * + * @author Derek Hulley + */ +public class FileFolderServiceImpl implements FileFolderService +{ + private static final String CANNED_QUERY_FILEFOLDER_LIST = "fileFolderGetChildrenCannedQueryFactory"; + + /** Shallow search for files and folders with a name pattern */ + private static final String XPATH_QUERY_SHALLOW_ALL = + "./*" + + "[like(@cm:name, $cm:name, false)" + + " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + + " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "') or subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + + " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; + + /** Deep search for files and folders with a name pattern */ + private static final String XPATH_QUERY_DEEP_ALL = + ".//*" + + "[like(@cm:name, $cm:name, false)" + + " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + + " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "') or subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + + " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; + + /** Deep search for folders with a name pattern */ + private static final String XPATH_QUERY_DEEP_FOLDERS = + ".//*" + + "[like(@cm:name, $cm:name, false)" + + " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + + " and (subtypeOf('" + ContentModel.TYPE_FOLDER + "'))]"; + + /** Deep search for files with a name pattern */ + private static final String XPATH_QUERY_DEEP_FILES = + ".//*" + + "[like(@cm:name, $cm:name, false)" + + " and not (subtypeOf('" + ContentModel.TYPE_SYSTEM_FOLDER + "'))" + + " and (subtypeOf('" + ContentModel.TYPE_CONTENT + "')" + + " or subtypeOf('" + ContentModel.TYPE_LINK + "'))]"; + + private static Log logger = LogFactory.getLog(FileFolderServiceImpl.class); + + private HiddenAspect hiddenAspect; + private NamespaceService namespaceService; + private DictionaryService dictionaryService; + private NodeService nodeService; + private CopyService copyService; + private SearchService searchService; + private ContentService contentService; + private MimetypeService mimetypeService; + private NamedObjectRegistry> cannedQueryRegistry; + + private Set systemNamespaces; + + // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) + private List systemPaths; + + // default cutoff - applies to list "all" methods + private int defaultListMaxResults = 5000; + + /** + * Default constructor + */ + public FileFolderServiceImpl() + { + systemNamespaces = new HashSet(5); + } + + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + public void setDictionaryService(DictionaryService dictionaryService) + { + this.dictionaryService = dictionaryService; + } + + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + public void setCopyService(CopyService copyService) + { + this.copyService = copyService; + } + + public void setSearchService(SearchService searchService) + { + this.searchService = searchService; + } + + public void setContentService(ContentService contentService) + { + this.contentService = contentService; + } + + public void setMimetypeService(MimetypeService mimetypeService) + { + this.mimetypeService = mimetypeService; + } + + public void setHiddenAspect(HiddenAspect hiddenAspect) + { + this.hiddenAspect = hiddenAspect; + } + + /** + * Set the registry of {@link CannedQueryFactory canned queries} + */ + public void setCannedQueryRegistry(NamedObjectRegistry> cannedQueryRegistry) + { + this.cannedQueryRegistry = cannedQueryRegistry; + } + + /** + * Set the namespaces that should be treated as 'system' namespaces. + *

+ * When files or folders are renamed, the association path (QName) is normally + * modified to follow the name of the node. If, however, the namespace of the + * patch QName is in this list, the association path is left alone. This allows + * parts of the application to use well-known paths even if the end-user is + * able to modify the objects cm:name value. + * + * @param systemNamespaces a list of system namespaces + */ + public void setSystemNamespaces(List systemNamespaces) + { + this.systemNamespaces.addAll(systemNamespaces); + } + + // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) + public void setSystemPaths(List systemPaths) + { + this.systemPaths = systemPaths; + } + + public void setDefaultListMaxResults(int defaultListMaxResults) + { + this.defaultListMaxResults = defaultListMaxResults; + } + + + public void init() + { + } + + /** + * Helper method to convert node reference instances to file info + * + * @param nodeRefs the node references + * @return Return a list of file info + * @throws InvalidTypeException if the node is not a valid type + */ + private List toFileInfo(List nodeRefs) throws InvalidTypeException + { + List results = new ArrayList(nodeRefs.size()); + Client client = FileFilterMode.getClient(); + for (NodeRef nodeRef : nodeRefs) + { + try + { + if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.NotVisible) + { + continue; + } + FileInfo fileInfo = toFileInfo(nodeRef, true); + results.add(fileInfo); + } + catch (InvalidNodeRefException inre) + { + logger.warn("toFileInfo: "+inre); + // skip + } + } + return results; + } + + /** + * Helper method to convert a node reference instance to a file info + */ + private FileInfo toFileInfo(NodeRef nodeRef, boolean addTranslations) throws InvalidTypeException + { + // Get the file attributes + Map properties = nodeService.getProperties(nodeRef); + // Is it a folder + QName typeQName = nodeService.getType(nodeRef); + boolean isFolder = isFolder(typeQName); + boolean isHidden = false; + + Client client = FileFilterMode.getClient(); + if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.HiddenAttribute) + { + isHidden = true; + } + + // Construct the file info and add to the results + FileInfo fileInfo = new FileInfoImpl(nodeRef, typeQName, isFolder, isHidden, properties); + + // Done + return fileInfo; + } + + /** + * Exception when the type is not a valid File or Folder type + * + * @see ContentModel#TYPE_CONTENT + * @see ContentModel#TYPE_FOLDER + * + * @author Derek Hulley + */ + public static class InvalidTypeException extends RuntimeException + { + private static final long serialVersionUID = -310101369475434280L; + + public InvalidTypeException(String msg) + { + super(msg); + } + } + + /** + * Checks the type for whether it is a file or folder. All invalid types + * lead to runtime exceptions. + * + * @param typeQName the type to check + * @return Returns true if the type is a valid folder type, false if it is a file. + * @throws AlfrescoRuntimeException if the type is not handled by this service + */ + private boolean isFolder(QName typeQName) throws InvalidTypeException + { + FileFolderServiceType type = getType(typeQName); + + switch (type) + { + case FILE: + return false; + case FOLDER: + return true; + case SYSTEM_FOLDER: + throw new InvalidTypeException("This service should ignore type " + ContentModel.TYPE_SYSTEM_FOLDER); + case INVALID: + default: + throw new InvalidTypeException("Type is not handled by this service: " + typeQName); + } + } + + public boolean exists(NodeRef nodeRef) + { + return nodeService.exists(nodeRef); + } + + public FileFolderServiceType getType(QName typeQName) + { + if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_FOLDER)) + { + if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_SYSTEM_FOLDER)) + { + return FileFolderServiceType.SYSTEM_FOLDER; + } + return FileFolderServiceType.FOLDER; + } + else if (dictionaryService.isSubClass(typeQName, ContentModel.TYPE_CONTENT) || + dictionaryService.isSubClass(typeQName, ContentModel.TYPE_LINK)) + { + // it is a regular file + return FileFolderServiceType.FILE; + } + else + { + // unhandled type + return FileFolderServiceType.INVALID; + } + } + + public List list(NodeRef contextNodeRef) + { + // execute the query + List results = listSimple(contextNodeRef, true, true); + // done + if (logger.isTraceEnabled()) + { + logger.trace("List files and folders: \n" + + " context: " + contextNodeRef + "\n" + + " results: " + results); + } + return results; + } + + private PagingResults getPagingResults(PagingRequest pagingRequest, final CannedQueryResults results) + { + List nodeRefs = null; + if (results.getPageCount() > 0) + { + nodeRefs = results.getPages().get(0); + } + else + { + nodeRefs = Collections.emptyList(); + } + + // set total count + final Pair totalCount; + if (pagingRequest.getRequestTotalCountMax() > 0) + { + totalCount = results.getTotalResultCount(); + } + else + { + totalCount = null; + } + + final List nodeInfos = new ArrayList(nodeRefs.size()); + final Client client = FileFilterMode.getClient(); + for (NodeRef nodeRef : nodeRefs) + { + if(hiddenAspect.getVisibility(client, nodeRef) == Visibility.NotVisible) + { + continue; + } + + nodeInfos.add(toFileInfo(nodeRef, true)); + } + PermissionCheckedCollectionMixin.create(nodeInfos, nodeRefs); + + return new PagingResults() + { + @Override + public String getQueryExecutionId() + { + return results.getQueryExecutionId(); + } + @Override + public List getPage() + { + return nodeInfos; + } + @Override + public boolean hasMoreItems() + { + return results.hasMoreItems(); + } + @Override + public Pair getTotalResultCount() + { + return totalCount; + } + }; + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.model.FileFolderService#list(org.alfresco.service.cmr.repository.NodeRef, boolean, boolean, java.util.Set, org.alfresco.service.cmr.model.PagingSortRequest) + */ + @Auditable(parameters = {"contextNodeRef", "files", "folders", "ignoreTypeQNames", "sortProps", "pagingRequest"}) + public PagingResults list(NodeRef contextNodeRef, + boolean files, + boolean folders, + Set ignoreTypeQNames, + List> sortProps, + PagingRequest pagingRequest) + { + ParameterCheck.mandatory("contextNodeRef", contextNodeRef); + ParameterCheck.mandatory("pagingRequest", pagingRequest); + + Set searchTypeQNames = buildTypes(files, folders, ignoreTypeQNames); + + // execute query + final CannedQueryResults results = listImpl(contextNodeRef, null, searchTypeQNames, sortProps, pagingRequest); + return getPagingResults(pagingRequest, results); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.model.FileFolderService#list(org.alfresco.service.cmr.repository.NodeRef, boolean, boolean, String, java.util.Set, org.alfresco.service.cmr.model.PagingSortRequest) + */ + public PagingResults list(NodeRef contextNodeRef, boolean files, boolean folders, String pattern, Set ignoreQNameTypes, List> sortProps, PagingRequest pagingRequest) + { + ParameterCheck.mandatory("contextNodeRef", contextNodeRef); + ParameterCheck.mandatory("pagingRequest", pagingRequest); + + Set searchTypeQNames = buildTypes(files, folders, ignoreQNameTypes); + + // execute query + final CannedQueryResults results = listImpl(contextNodeRef, pattern, searchTypeQNames, sortProps, pagingRequest); + return getPagingResults(pagingRequest, results); + } + + private CannedQueryResults listImpl(NodeRef contextNodeRef, boolean files, boolean folders) + { + Set searchTypeQNames = buildTypes(files, folders, null); + return listImpl(contextNodeRef, searchTypeQNames); + } + + private CannedQueryResults listImpl(NodeRef contextNodeRef, Set searchTypeQNames) + { + return listImpl(contextNodeRef, null, searchTypeQNames, null, new PagingRequest(defaultListMaxResults, null)); + } + + // note: similar to getChildAssocs(contextNodeRef, searchTypeQNames) but enables paging features, including max items, sorting etc (with permissions per-applied) + private CannedQueryResults listImpl(NodeRef contextNodeRef, String pattern, Set searchTypeQNames, List> sortProps, PagingRequest pagingRequest) + { + Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); + + // get canned query + GetChildrenCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_FILEFOLDER_LIST); + + GetChildrenCannedQuery cq = (GetChildrenCannedQuery)getChildrenCannedQueryFactory.getCannedQuery(contextNodeRef, pattern, Collections.singleton(ContentModel.ASSOC_CONTAINS), searchTypeQNames, null, sortProps, pagingRequest); + + // execute canned query + CannedQueryResults results = cq.execute(); + + if (start != null) + { + int cnt = results.getPagedResultCount(); + int skipCount = pagingRequest.getSkipCount(); + int maxItems = pagingRequest.getMaxItems(); + boolean hasMoreItems = results.hasMoreItems(); + Pair totalCount = (pagingRequest.getRequestTotalCountMax() > 0 ? results.getTotalResultCount() : null); + int pageNum = (skipCount / maxItems) + 1; + + logger.debug("List: "+cnt+" items in "+(System.currentTimeMillis()-start)+" msecs [pageNum="+pageNum+",skip="+skipCount+",max="+maxItems+",hasMorePages="+hasMoreItems+",totalCount="+totalCount+",parentNodeRef="+contextNodeRef+"]"); + } + + return results; + } + + public List listFiles(NodeRef contextNodeRef) + { + // execute the query + List results = listSimple(contextNodeRef, true, false); + // done + if (logger.isTraceEnabled()) + { + logger.trace("List files: \n" + + " context: " + contextNodeRef + "\n" + + " results: " + results); + } + return results; + } + + public List listFolders(NodeRef contextNodeRef) + { + // execute the query + List results = listSimple(contextNodeRef, false, true); + // done + if (logger.isTraceEnabled()) + { + logger.trace("List for folders: \n" + + " context: " + contextNodeRef + "\n" + + " results: " + results); + } + return results; + } + + public List listDeepFolders(NodeRef contextNodeRef, + SubFolderFilter filter) + { + List nodeRefs = listSimpleDeep(contextNodeRef, false, true, filter); + + List results = toFileInfo(nodeRefs); + + // done + if (logger.isTraceEnabled()) + { + logger.trace("Deep search for files: \n" + + " context: " + contextNodeRef + "\n" + + " results: " + results.size()); + } + return results; + + } + + @Override + public NodeRef getLocalizedSibling(NodeRef nodeRef) + { + Locale userLocale = I18NUtil.getLocale(); + + String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + NodeRef parentNodeRef = nodeService.getPrimaryParent(nodeRef).getParentRef(); + // Work out the base name we are working with + Pair split = getExtension(name, false); + String base = split.getFirst(); + String ext = split.getSecond(); + + NodeRef resultNodeRef = nodeRef; + // Search for siblings with the same name + Control resourceHelper = Control.getControl(Control.FORMAT_DEFAULT); + List candidateLocales = resourceHelper.getCandidateLocales(base, userLocale); + for (Locale candidateLocale : candidateLocales) + { + String filename = resourceHelper.toBundleName(base, candidateLocale) + "." + ext; + // Attempt to find the file + NodeRef foundNodeRef = searchSimple(parentNodeRef, filename); + if (foundNodeRef != null) // TODO: Check for read permissions + { + resultNodeRef = foundNodeRef; + break; + } + } + // Done + return resultNodeRef; + } + + public NodeRef searchSimple(NodeRef contextNodeRef, String name) + { + NodeRef childNodeRef = nodeService.getChildByName(contextNodeRef, ContentModel.ASSOC_CONTAINS, name); + if (logger.isTraceEnabled()) + { + logger.trace( + "Simple name search results: \n" + + " parent: " + contextNodeRef + "\n" + + " name: " + name + "\n" + + " result: " + childNodeRef); + } + return childNodeRef; + } + + /** + * @see #search(NodeRef, String, boolean, boolean, boolean) + */ + public List search(NodeRef contextNodeRef, String namePattern, boolean includeSubFolders) + { + return search(contextNodeRef, namePattern, true, true, includeSubFolders); + } + + private static final String LUCENE_MULTI_CHAR_WILDCARD = "*"; + + /** + * Full search with all options + */ + public List search( + NodeRef contextNodeRef, + String namePattern, + boolean fileSearch, + boolean folderSearch, + boolean includeSubFolders) + { + // get the raw nodeRefs + List nodeRefs = searchInternal(contextNodeRef, namePattern, fileSearch, folderSearch, includeSubFolders); + + List results = toFileInfo(nodeRefs); + + // eliminate unwanted files/folders + Iterator iterator = results.iterator(); + while (iterator.hasNext()) + { + FileInfo file = iterator.next(); + if (file.isFolder() && !folderSearch) + { + iterator.remove(); + } + else if (!file.isFolder() && !fileSearch) + { + iterator.remove(); + } + } + // done + if (logger.isTraceEnabled()) + { + logger.trace("Deep search: \n" + + " context: " + contextNodeRef + "\n" + + " pattern: " + namePattern + "\n" + + " files: " + fileSearch + "\n" + + " folders: " + folderSearch + "\n" + + " deep: " + includeSubFolders + "\n" + + " results: " + results); + } + return results; + } + + /** + * Performs a full search, but doesn't translate the node references into + * file info objects. This allows {@link #checkExists(NodeRef, String)} to + * bypass the retrieval of node properties. + */ + private List searchInternal( + NodeRef contextNodeRef, + String namePattern, + boolean fileSearch, + boolean folderSearch, + boolean includeSubFolders) + { + // shortcut if the search is requesting nothing + if (!fileSearch && !folderSearch) + { + return Collections.emptyList(); + } + + if (namePattern == null) + { + namePattern = LUCENE_MULTI_CHAR_WILDCARD; // default to wildcard + } + // now check if we can use Lucene to handle this query + boolean anyName = namePattern.equals(LUCENE_MULTI_CHAR_WILDCARD); + + List nodeRefs = null; + if (anyName) + { + // This is search for any name + if(includeSubFolders) + { + nodeRefs = listSimpleDeep(contextNodeRef, fileSearch, folderSearch, null); + } + else + { + nodeRefs = listImpl(contextNodeRef, fileSearch, folderSearch).getPage(); + } + } + else + { + // TODO - we need to get rid of this xpath stuff + // if the name pattern is null, then we use the ANY pattern + QueryParameterDefinition[] params = null; + if (namePattern != null) + { + // the interface specifies the Lucene syntax, so perform a conversion + namePattern = SearchLanguageConversion.convert( + SearchLanguageConversion.DEF_LUCENE, + SearchLanguageConversion.DEF_XPATH_LIKE, + namePattern); + + params = new QueryParameterDefinition[1]; + params[0] = new QueryParameterDefImpl( + ContentModel.PROP_NAME, + dictionaryService.getDataType(DataTypeDefinition.TEXT), + true, + namePattern); + } + // determine the correct query to use + String query = null; + if (includeSubFolders) + { + // this is a deep search + if(!fileSearch && folderSearch) + { + // This is a folder search only; + query = XPATH_QUERY_DEEP_FOLDERS; + } + else if(fileSearch && !folderSearch) + { + // This is a folder search only; + query = XPATH_QUERY_DEEP_FILES; + } + else + { + query = XPATH_QUERY_DEEP_ALL; + } + } + else + { + // this is a shallow search + query = XPATH_QUERY_SHALLOW_ALL; + } + // execute the query + nodeRefs = searchService.selectNodes( + contextNodeRef, + query, + params, + namespaceService, + false); + } + // done + return nodeRefs; + } + + private List listSimple(NodeRef contextNodeRef, boolean files, boolean folders) throws InvalidTypeException + { + CannedQueryResults cq = listImpl(contextNodeRef, files, folders); + List nodeRefs = cq.getPage(); + + List results = toFileInfo(nodeRefs); + + // avoid re-applying permissions (for "list" canned queries) + return PermissionCheckedValueMixin.create(results); + } + + private Set buildTypes(boolean files, boolean folders, Set ignoreQNameTypes) + { + Set searchTypeQNames = new HashSet(100); + + // Build a list of file and folder types + if (folders) + { + searchTypeQNames.addAll(buildFolderTypes()); + } + if (files) + { + searchTypeQNames.addAll(buildFileTypes()); + } + + if (ignoreQNameTypes != null) + { + searchTypeQNames.removeAll(ignoreQNameTypes); + } + + return searchTypeQNames; + } + + private Set buildFolderTypes() + { + Set folderTypeQNames = new HashSet(50); + + // Build a list of folder types + Collection qnames = dictionaryService.getSubTypes(ContentModel.TYPE_FOLDER, true); + folderTypeQNames.addAll(qnames); + folderTypeQNames.add(ContentModel.TYPE_FOLDER); + + // Remove 'system' folders + qnames = dictionaryService.getSubTypes(ContentModel.TYPE_SYSTEM_FOLDER, true); + folderTypeQNames.removeAll(qnames); + folderTypeQNames.remove(ContentModel.TYPE_SYSTEM_FOLDER); + + return folderTypeQNames; + } + + private Set buildFileTypes() + { + Set fileTypeQNames = new HashSet(50); + + // Build a list of file types + Collection qnames = dictionaryService.getSubTypes(ContentModel.TYPE_CONTENT, true); + fileTypeQNames.addAll(qnames); + fileTypeQNames.add(ContentModel.TYPE_CONTENT); + qnames = dictionaryService.getSubTypes(ContentModel.TYPE_LINK, true); + fileTypeQNames.addAll(qnames); + fileTypeQNames.add(ContentModel.TYPE_LINK); + + return fileTypeQNames; + } + + /** + * A deep version of listSimple. Which recursively walks down the tree from a given starting point, returning + * the node refs of files or folders found along the way. + *

+ * The folder filter is called for each sub-folder to determine whether to search in that sub-folder, should a subfolder be excluded + * then all its chidren are excluded as well. + * + * @param contextNodeRef the starting point. + * @param folders return nodes of type folders. + * @param files return nodes of type files. + * @param subfolder filter controls which folders to search. If null then all subfolders are searched. + * @return list of node references + */ + /*

+ * MER: I've added this rather than changing listSimple to minimise the risk of breaking + * the existing code. This is a quick performance improvement between using + * XPath which is awful or adding new methods to the NodeService/DB This is also a dangerous method in that it can return a + * lot of data and take a long time. + */ + private List listSimpleDeep(NodeRef contextNodeRef, boolean files, boolean folders, SubFolderFilter folderFilter) + { + if(logger.isDebugEnabled()) + { + logger.debug("searchSimpleDeep contextNodeRef:" + contextNodeRef); + } + + // To hold the results. + List result = new ArrayList(); + + // Build a list of folder types + Set folderTypeQNames = buildFolderTypes(); + Set fileTypeQNames = (files ? buildFileTypes() : new HashSet(0)); + + if(!folders && !files) + { + return Collections.emptyList(); + + } + + // Shortcut + if (folderTypeQNames.size() == 0) + { + return Collections.emptyList(); + } + + Stack toSearch = new Stack(); + toSearch.push(contextNodeRef); + + // Now we need to walk down the folders. + while(!toSearch.empty()) + { + NodeRef currentDir = toSearch.pop(); + + List folderAssocRefs = nodeService.getChildAssocs(currentDir, folderTypeQNames); + + for (ChildAssociationRef folderRef : folderAssocRefs) + { + // We have some child folders + boolean include = true; + if(folderFilter != null) + { + include = folderFilter.isEnterSubfolder(folderRef); + if(include) + { + // yes search in these subfolders + toSearch.push(folderRef.getChildRef()); + } + } + else + { + // No filter - Add the folders in the currentDir + toSearch.push(folderRef.getChildRef()); + } + + if(folders && include) + { + result.add(folderRef.getChildRef()); + } + } + + if(files) + { + // Add the files in the current dir + List fileAssocRefs = nodeService.getChildAssocs(currentDir, fileTypeQNames); + for (ChildAssociationRef fileRef : fileAssocRefs) + { + result.add(fileRef.getChildRef()); + } + } + } + + + if(logger.isDebugEnabled()) + { + logger.debug("searchSimpleDeep finished size:" + result.size()); + } + + // Done + return result; + } + + /** + * @see #move(NodeRef, NodeRef, String) + */ + public FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException + { + return moveOrCopy(sourceNodeRef, null, null, newName, true); + } + + /** + * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) + */ + @Override + public FileInfo move(NodeRef sourceNodeRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException + { + return moveOrCopy(sourceNodeRef, null, targetParentRef, newName, true); + } + + /** + * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) + */ + @Override + public FileInfo moveFrom(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException + { + return moveOrCopy(sourceNodeRef, sourceParentRef, targetParentRef, newName, true); + } + + /** + * @deprecated + */ + @Override + public FileInfo move(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException + { + return moveOrCopy(sourceNodeRef, sourceParentRef, targetParentRef, newName, true); + } + + /** + * @see #moveOrCopy(NodeRef, NodeRef, String, boolean) + */ + public FileInfo copy(NodeRef sourceNodeRef, NodeRef targetParentRef, String newName) throws FileExistsException, FileNotFoundException + { + return moveOrCopy(sourceNodeRef, null, targetParentRef, newName, false); + } + + /** + * Implements both move and copy behaviour + * + * @param move true to move, otherwise false to copy + */ + private FileInfo moveOrCopy(NodeRef sourceNodeRef, NodeRef sourceParentRef, NodeRef targetParentRef, String newName, boolean move) throws FileExistsException, FileNotFoundException + { + // get file/folder in its current state + FileInfo beforeFileInfo = toFileInfo(sourceNodeRef, true); + // check the name - null means keep the existing name + if (newName == null) + { + newName = beforeFileInfo.getName(); + } + + boolean nameChanged = (newName.equals(beforeFileInfo.getName()) == false); + + // check is primary parent + boolean isPrimaryParent = true; + if (sourceParentRef != null) + { + isPrimaryParent = sourceParentRef.equals(nodeService.getPrimaryParent(sourceNodeRef).getParentRef()); + } + + // we need the current association type + ChildAssociationRef assocRef = null; + if (isPrimaryParent) + { + assocRef = nodeService.getPrimaryParent(sourceNodeRef); + } + else + { + List assocList = nodeService.getParentAssocs(sourceNodeRef); + if (assocList != null) + { + for (ChildAssociationRef assocListEntry : assocList) + { + if (sourceParentRef.equals(assocListEntry.getParentRef())) + { + assocRef = assocListEntry; + break; + } + } + } + } + if (targetParentRef == null) + { + targetParentRef = assocRef.getParentRef(); + } + + boolean changedParent = !targetParentRef.equals(assocRef.getParentRef()); + // there is nothing to do if both the name and parent folder haven't changed + if (!nameChanged && !changedParent) + { + if (logger.isDebugEnabled()) + { + logger.debug("Doing nothing - neither filename or parent has changed: \n" + + " parent: " + targetParentRef + "\n" + + " before: " + beforeFileInfo + "\n" + + " new name: " + newName); + } + return beforeFileInfo; + } + + QName existingQName = assocRef.getQName(); + QName qname; + if (nameChanged && !systemNamespaces.contains(existingQName.getNamespaceURI())) + { + // Change the localname to match the new name + qname = QName.createQName( + assocRef.getQName().getNamespaceURI(), + QName.createValidLocalName(newName)); + } + else + { + // Keep the localname + qname = existingQName; + } + + QName targetParentType = nodeService.getType(targetParentRef); + + // Fix AWC-1517 & ALF-5569 + QName assocTypeQname = null; + if (nameChanged && move) + { + // if it's a rename use the existing assoc type + assocTypeQname = assocRef.getTypeQName(); + } + else + { + if (dictionaryService.isSubClass(targetParentType, ContentModel.TYPE_FOLDER)) + { + assocTypeQname = ContentModel.ASSOC_CONTAINS; // cm:folder -> cm:contains + } + else if (dictionaryService.isSubClass(targetParentType, ContentModel.TYPE_CONTAINER)) + { + assocTypeQname = ContentModel.ASSOC_CHILDREN; // sys:container -> sys:children + } + else + { + throw new InvalidTypeException("Unexpected type (" + targetParentType + ") for target parent: " + targetParentRef); + } + } + + // move or copy + NodeRef targetNodeRef = null; + if (move) + { + // TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) + if (!isSystemPath(sourceNodeRef)) + { + // The cm:name might clash with another node in the target location. + if (nameChanged) + { + // The name will be changing, so we really need to set the node's name to the new + // name. This can't be done at the same time as the move - to avoid incorrect violations + // of the name constraints, the cm:name is set to something random and will be reset + // to the correct name later. + nodeService.setProperty(sourceNodeRef, ContentModel.PROP_NAME, GUID.generate()); + } + try + { + ChildAssociationRef newAssocRef = null; + + if (isPrimaryParent) + { + // move the node so that the association moves as well + newAssocRef = nodeService.moveNode(sourceNodeRef, targetParentRef, assocTypeQname, qname); + } + else + { + nodeService.removeChild(sourceParentRef, sourceNodeRef); + newAssocRef = nodeService.addChild(targetParentRef, sourceNodeRef, assocRef.getTypeQName(), assocRef.getQName()); + } + + targetNodeRef = newAssocRef.getChildRef(); + } + catch (DuplicateChildNodeNameException e) + { + throw new FileExistsException(targetParentRef, newName); + } + } + else + { + // system path folders do not need to be moved + targetNodeRef = sourceNodeRef; + } + } + else + { + try + { + // Copy the node. The cm:name will be dropped and reset later. + targetNodeRef = copyService.copy( + sourceNodeRef, + targetParentRef, + assocTypeQname, + qname, + true); + } + catch (DuplicateChildNodeNameException e) + { + throw new FileExistsException(targetParentRef, newName); + } + } + + // Only update the name if it has changed + String currentName = (String)nodeService.getProperty(targetNodeRef, ContentModel.PROP_NAME); + if (currentName.equals(newName) == false) + { + try + { + // changed the name property + nodeService.setProperty(targetNodeRef, ContentModel.PROP_NAME, newName); + + // May need to update the mimetype, to support apps using .tmp files when saving + ContentData contentData = (ContentData)nodeService.getProperty(targetNodeRef, ContentModel.PROP_CONTENT); + + // Check the newName and oldName extensions. + // Keep previous mimetype if + // 1. new extension is empty + // 2. new extension is '.tmp' + // 3. extension was not changed, + // + // It fixes the ETWOTWO-16 issue. + String oldExt = getExtension(beforeFileInfo.getName(), true).getSecond(); + String newExt = getExtension(newName, true).getSecond(); + if (contentData != null && + newExt.length() != 0 && + !"tmp".equalsIgnoreCase(newExt) && + !newExt.equalsIgnoreCase(oldExt)) + { + String targetMimetype = contentData.getMimetype(); + String newMimetype = mimetypeService.guessMimetype(newName); + if (!targetMimetype.equalsIgnoreCase(newMimetype)) + { + contentData = ContentData.setMimetype(contentData, newMimetype); + nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData); + } + } + } + catch (DuplicateChildNodeNameException e) + { + throw new FileExistsException(targetParentRef, newName); + } + } + + // get the details after the operation + FileInfo afterFileInfo = toFileInfo(targetNodeRef, true); + // done + if (logger.isDebugEnabled()) + { + logger.debug("" + (move ? "Moved" : "Copied") + " node: \n" + + " parent: " + targetParentRef + "\n" + + " before: " + beforeFileInfo + "\n" + + " after: " + afterFileInfo); + } + return afterFileInfo; + } + + /** + * Determine if the specified node is a special "system" folder path based node + * + * TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID) + * + * @param nodeRef node to check + * @return true => system folder path based node + */ + private boolean isSystemPath(NodeRef nodeRef) + { + Path path = nodeService.getPath(nodeRef); + String prefixedPath = path.toPrefixString(namespaceService); + return systemPaths.contains(prefixedPath); + } + + public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException + { + return createImpl(parentNodeRef, name, typeQName, null); + } + + public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException + { + return createImpl(parentNodeRef, name, typeQName, assocQName); + } + + private FileInfo createImpl(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException + { + // set up initial properties + Map properties = new HashMap(11); + properties.put(ContentModel.PROP_NAME, (Serializable) name); + + // create the node + if (assocQName == null) + { + assocQName = QName.createQName( + NamespaceService.CONTENT_MODEL_1_0_URI, + QName.createValidLocalName(name)); + } + ChildAssociationRef assocRef = null; + try + { + assocRef = nodeService.createNode( + parentNodeRef, + ContentModel.ASSOC_CONTAINS, + assocQName, + typeQName, + properties); + } + catch (DuplicateChildNodeNameException e) + { + throw new FileExistsException(parentNodeRef, name); + } + + NodeRef nodeRef = assocRef.getChildRef(); + + FileInfo fileInfo = toFileInfo(nodeRef, true); + // done + if (logger.isDebugEnabled()) + { + logger.debug("Created: \n" + + " parent: " + parentNodeRef + "\n" + + " created: " + fileInfo); + } + return fileInfo; + } + + public void delete(NodeRef nodeRef) + { + nodeService.deleteNode(nodeRef); + // Done + if (logger.isDebugEnabled()) + { + logger.debug("Deleted: \n" + + " node: " + nodeRef); + } + } + + /** + * Checks for the presence of, and creates as necessary, the folder structure in the provided path. + *

+ * An empty path list is not allowed as it would be impossible to necessarily return file info + * for the parent node - it might not be a folder node. + * @param parentNodeRef the node under which the path will be created + * @param pathElements the folder name path to create - may not be empty + * @param folderTypeQName the types of nodes to create. This must be a valid subtype of + * {@link org.alfresco.model.ContentModel#TYPE_FOLDER they folder type}. + * @return Returns the info of the last folder in the path. + * @deprecated Use FileFolderUtil.makeFolders rather than directly accessing this implementation class. + */ + public FileInfo makeFolders(NodeRef parentNodeRef, List pathElements, QName folderTypeQName) + { + return FileFolderUtil.makeFolders(this, parentNodeRef, pathElements, folderTypeQName); + } + + /** + * Checks for the presence of, and creates as necessary, the folder structure in the provided path. + *

+ * An empty path list is not allowed as it would be impossible to necessarily return file info + * for the parent node - it might not be a folder node. + * @param parentNodeRef the node under which the path will be created + * @param pathElements the folder name path to create - may not be empty + * @param folderTypeQName the types of nodes to create. This must be a valid subtype of + * {@link org.alfresco.model.ContentModel#TYPE_FOLDER they folder type}. + * @return Returns the info of the last folder in the path. + * @deprecated Use FileFolderUtil.makeFolders rather than directly accessing this implementation class. + */ + public static FileInfo makeFolders(FileFolderService service, NodeRef parentNodeRef, List pathElements, QName folderTypeQName) + { + return FileFolderUtil.makeFolders(service, parentNodeRef, pathElements, folderTypeQName); + } + + public List getNamePath(NodeRef rootNodeRef, NodeRef nodeRef) throws FileNotFoundException + { + // check the root + if (rootNodeRef == null) + { + rootNodeRef = nodeService.getRootNode(nodeRef.getStoreRef()); + } + try + { + ArrayList results = new ArrayList(10); + // get the primary path + Path path = nodeService.getPath(nodeRef); + // iterate and turn the results into file info objects + boolean foundRoot = false; + for (Path.Element element : path) + { + // ignore everything down to the root + Path.ChildAssocElement assocElement = (Path.ChildAssocElement) element; + final NodeRef childNodeRef = assocElement.getRef().getChildRef(); + if (childNodeRef.equals(rootNodeRef)) + { + // just found the root - but we don't put in an entry for it + foundRoot = true; + continue; + } + else if (!foundRoot) + { + // keep looking for the root + continue; + } + // we found the root and expect to be building the path up + //Run as system as the user could not have access to all folders in the path, see ALF-13816 + FileInfo pathInfo = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + public FileInfo doWork() throws Exception + { + return toFileInfo(childNodeRef, true); + } + }, AuthenticationUtil.getSystemUserName()); + + // we can't append a path element to the results if there is already a (non-folder) file at the tail + // since this would result in a path anomoly - file's cannot contain other files. + if (!results.isEmpty() && !results.get(results.size()-1).isFolder()) + { + throw new InvalidTypeException( + "File is not the last element in path: files cannot contain other files."); + } + results.add(pathInfo); + } + // check that we found the root + if (!foundRoot || results.size() == 0) + { + throw new FileNotFoundException(nodeRef); + } + // done + if (logger.isDebugEnabled()) + { + logger.debug("Built name path for node: \n" + + " root: " + rootNodeRef + "\n" + + " node: " + nodeRef + "\n" + + " path: " + results); + } + return results; + } + catch (InvalidNodeRefException e) + { + throw new FileNotFoundException(nodeRef); + } + } + + public FileInfo resolveNamePath(NodeRef rootNodeRef, List pathElements) throws FileNotFoundException + { + return resolveNamePath(rootNodeRef, pathElements, true); + } + + public FileInfo resolveNamePath(NodeRef rootNodeRef, List pathElements, boolean mustExist) throws FileNotFoundException + { + if (pathElements.size() == 0) + { + throw new IllegalArgumentException("Path elements list is empty"); + } + // walk the folder tree first + NodeRef parentNodeRef = rootNodeRef; + StringBuilder currentPath = new StringBuilder(pathElements.size() << 4); + int folderCount = pathElements.size() - 1; + for (int i = 0; i < folderCount; i++) + { + String pathElement = pathElements.get(i); + NodeRef folderNodeRef = searchSimple(parentNodeRef, pathElement); + if (folderNodeRef == null) + { + StringBuilder sb = new StringBuilder(128); + sb.append("Folder not found: " + currentPath); + throw new FileNotFoundException(sb.toString()); + } + parentNodeRef = folderNodeRef; + } + // we have resolved the folder path - resolve the last component + String pathElement = pathElements.get(pathElements.size() - 1); + NodeRef fileNodeRef = searchSimple(parentNodeRef, pathElement); + if (fileNodeRef == null) + { + if (mustExist) + { + throw new FileNotFoundException("File not found: " + currentPath); + } + else + { + return null; + } + } + FileInfo result = getFileInfo(fileNodeRef); + // found it + if (logger.isDebugEnabled()) + { + logger.debug("Resoved path element: \n" + + " root: " + rootNodeRef + "\n" + + " path: " + currentPath + "\n" + + " node: " + result); + } + return result; + } + + public FileInfo getFileInfo(NodeRef nodeRef) + { + try + { + return toFileInfo(nodeRef, true); + } + catch (InvalidTypeException e) + { + return null; + } + } + + public ContentReader getReader(NodeRef nodeRef) + { + FileInfo fileInfo = toFileInfo(nodeRef, false); + if (fileInfo.isFolder()) + { + throw new InvalidTypeException("Unable to get a content reader for a folder: " + fileInfo); + } + return contentService.getReader(nodeRef, ContentModel.PROP_CONTENT); + } + + public ContentWriter getWriter(NodeRef nodeRef) + { + FileInfo fileInfo = toFileInfo(nodeRef, false); + if (fileInfo.isFolder()) + { + throw new InvalidTypeException("Unable to get a content writer for a folder: " + fileInfo); + } + final ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true); + // Ensure that a mimetype is set based on the filename (ALF-6560) + // This has been removed from the create code in 3.4 to prevent insert-update behaviour + // of the ContentData. + if (writer.getMimetype() == null) + { + final String name = fileInfo.getName(); + writer.guessMimetype(name); + } + // Done + return writer; + } + + /** + * Split a filename into the base (part before the '.') and the extension (part after the '.') + */ + private Pair getExtension(String name, boolean useLastDot) + { + String ext = ""; + String base = name; + if (name != null) + { + name = name.trim(); + int index = useLastDot ? name.lastIndexOf('.') : name.indexOf('.'); + if (index > -1 && (index < name.length() - 1)) + { + base = name.substring(0, index); + ext = name.substring(index + 1); + } + } + return new Pair(base, ext); + } +} diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrChildApplicationContextFactory.java b/source/java/org/alfresco/repo/search/impl/solr/SolrChildApplicationContextFactory.java index e1c3261bd5..dac45e9e99 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/SolrChildApplicationContextFactory.java +++ b/source/java/org/alfresco/repo/search/impl/solr/SolrChildApplicationContextFactory.java @@ -104,21 +104,21 @@ public class SolrChildApplicationContextFactory extends ChildApplicationContextF Date now = new Date(); JSONObject alfresco = summary.getJSONObject("alfresco"); - String alfrescoLag = alfresco.getString("Lag"); + String alfrescoLag = alfresco.getString("TX Lag"); String alfrescoActive = alfresco.getString("Active"); - String alfrescoDuration = alfresco.getString("Duration"); + String alfrescoDuration = alfresco.getString("TX Duration"); String alfrescoLastIndexedTxn = alfresco.getString("Id for last TX in index"); String alfrescoApproxTxnsReminaing = alfresco.getString("Approx transactions remaining"); - String alfrescoApproxIndexingTimeReminaing = alfresco.getString("Approx indexing time remaining"); + String alfrescoApproxIndexingTimeReminaing = alfresco.getString("Approx transaction indexing time remaining"); JSONObject archive = summary.getJSONObject("archive"); - String archiveLag = archive.getString("Lag"); + String archiveLag = archive.getString("TX Lag"); String archiveActive = archive.getString("Active"); - String archiveDuration = archive.getString("Duration"); + String archiveDuration = archive.getString("TX Duration"); String archiveLastIndexedTxn = archive.getString("Id for last TX in index"); String archiveApproxTxnsReminaing = archive.getString("Approx transactions remaining"); - String archiveApproxIndexingTimeReminaing = archive.getString("Approx indexing time remaining"); + String archiveApproxIndexingTimeReminaing = archive.getString("Approx transaction indexing time remaining"); if (name.equals(SolrChildApplicationContextFactory.ALFRESCO_ACTIVE)) {