From b12f60e443014c6bcd7d849f35099680543b7448 Mon Sep 17 00:00:00 2001 From: Steve Temple Date: Thu, 27 Jun 2013 00:04:37 +0100 Subject: [PATCH 01/85] Allow for absolute URLs as well as virtual in ResolveUrl to allow for FileSystemProviders that use CDNs --- src/Umbraco.Core/IO/IOHelper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index bc860705a2..22dc0814d5 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -45,6 +45,8 @@ namespace Umbraco.Core.IO { if (virtualPath.StartsWith("~")) return virtualPath.Replace("~", SystemDirectories.Root).Replace("//", "/"); + else if (Uri.IsWellFormedUriString(virtualPath, UriKind.Absolute)) + return virtualPath; else return VirtualPathUtility.ToAbsolute(virtualPath, SystemDirectories.Root); } From cc91977e9417e04a66da9f084a9a05adbd4ec277 Mon Sep 17 00:00:00 2001 From: Murray Roke Date: Tue, 9 Jul 2013 11:19:51 +1200 Subject: [PATCH 02/85] Fix notification-email link to unpublished page http://issues.umbraco.org/issue/U4-2482 I've added links to language files which did not contain it. I used the %5% syntax in the sv.xml file which seems to otherwise use {5} syntax --- src/Umbraco.Web.UI/umbraco/config/lang/da.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 2 +- .../umbraco/config/lang/en_us.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/es.xml | 1498 ++++++------- src/Umbraco.Web.UI/umbraco/config/lang/fr.xml | 1906 ++++++++--------- src/Umbraco.Web.UI/umbraco/config/lang/he.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/it.xml | 1702 +++++++-------- src/Umbraco.Web.UI/umbraco/config/lang/ja.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/ko.xml | 6 +- src/Umbraco.Web.UI/umbraco/config/lang/nl.xml | 1624 +++++++------- src/Umbraco.Web.UI/umbraco/config/lang/no.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/pl.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/pt.xml | 1670 +++++++-------- src/Umbraco.Web.UI/umbraco/config/lang/ru.xml | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/sv.xml | 1518 ++++++------- src/Umbraco.Web.UI/umbraco/config/lang/zh.xml | 2 +- 17 files changed, 4972 insertions(+), 4972 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml index d800f72a6b..e1c707c518 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml @@ -438,7 +438,7 @@ Ha' en dejlig dag! Mange hilsner fra umbraco robotten ]]> - Hej %0%

Dette er en automatisk mail for at informere dig om at opgaven '%1%' er blevet udførtpå siden '%2%' af brugeren '%3%'


  PUBLISÉr          RET            SLET    

Opdateringssammendrag:

%6%


  PUBLISÉR          RET            SLET    

Hav en fortsat god dag!

De bedste hilsner fra umbraco robotten

]]>
+ Hej %0%

Dette er en automatisk mail for at informere dig om at opgaven '%1%' er blevet udførtpå siden '%2%' af brugeren '%3%'


  PUBLISÉr          RET            SLET    

Opdateringssammendrag:

%6%


  PUBLISÉR          RET            SLET    

Hav en fortsat god dag!

De bedste hilsner fra umbraco robotten

]]>
[%0%] Notificering om %1% udført på %2% Notificeringer diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index c721c7e227..78f19a6865 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -471,7 +471,7 @@ Ihr freundlicher Umbraco-Robot Hallo %0%,

-

die Aufgabe '%1%' (von Benutzer '%3%') an der Seite '%2%' wurde ausgeführt.

+

die Aufgabe '%1%' (von Benutzer '%3%') an der Seite '%2%' wurde ausgeführt.


  VERÖFFENTLICHEN     diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index e895731f4b..222f208855 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -572,7 +572,7 @@ To manage your website, simply open the umbraco back office and start adding con Hi %0%

This is an automated mail to inform you that the task '%1%' - has been performed on the page '%2%' + has been performed on the page '%2%' by the user '%3%'

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index a3e66517da..1e7c891178 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -559,7 +559,7 @@ To manage your website, simply open the umbraco back office and start adding con Hi %0%

This is an automated mail to inform you that the task '%1%' - has been performed on the page '%2%' + has been performed on the page '%2%' by the user '%3%'

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml index 68236ed401..c5652f5061 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml @@ -1,750 +1,750 @@ - - - - The umbraco community - http://umbraco.org/documentation/language-files - - - Administrar hostnames - Auditoría - Nodo de Exploración - Copiar - Crear - Crear Paquete - Borrar - Deshabilitar - Vaciar Papelera - Exportar Documento (tipo) - TRANSLATE ME: 'Export to .NET' - TRANSLATE ME: 'Export to .NET' - Importar Documento (tipo) - Importar Paquete - Editar en lienzo - Salir - Mover - Notificaciones - Acceso Público - Publicar - Recargar Nodos - Republicar sitio completo - Permisos - Deshacer - Enviar a Publicar - Enviar a Traducir - Ordernar - Enviar a publicación - Traducir - Actualizar - - - Añadir nuevo dominio - Dominio - El nuevo dominio %0% ha sido creado - El dominio %0% ha sido borrado - El dominio'%0%' ya ha sido asignado - p.ej.: tudominio.com, www.tudominio.com - El dominio %0% ha sido actualizado - Editar dominios actuales - - - Visualización de - - - Negrita - Cancelar Sangría del Párrafo - Insertar campo de formulario - Insertar gráfico de titular - Editar Html - Sangría - Cursiva - Centrar - Alinear a la Izquierda - Alinear a la Derecha - Insertar Link - Insertar link local (anchor) - Lista en Viñetas - Lista Numérica - Insertar macro - Insertar imagen - Editar relaciones - Guardar - Guardar y publicar - Guardar y enviar para aprobación - Previsualizar - Elegir estilo - Mostrar estilos - Insertar tabla - - - Acerca de - Link alternativo - (como describe la imagen sobre el teléfono) - Vinculos Alternativos - Click para editar esta entrada - Creado por - Creado - Tipo de Documento - Editando - Remover el - Esta entrada ha sido modificada después de haber sido publicada - Esta entrada no esta publicada - Último publicado - Tipo de Medio - Miembro de Grupo - Rol - Tipo de miembro - Sin fecha - Título de la página - Propiedades - Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado - Publicar - Estado de la Publicación - Publicar el - Fecha de Eliminación - El Orden esta actualizado - Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona - Estadísticas - Título (opcional) - Tipo - No Publicar - Última actualización - Eliminar archivo - Vínculo al documento - - - ¿Dónde quieres crear el nuevo %0% - Crear debajo de - Elije un tipo y un título - - - Navega en tu sitio Web - TRANSLATE ME: '- Hide' - Si Umbraco no se ha abierto tendrás que permitir ventanas emergentes para este sitio Web - se ha abierto en una nueva ventana - Reinicio - Visita - Bienvenido - - - Nombre - Administrar dominios - Cerrar esta ventana - Esta usted seguro que desea borrar - Esta usted seguro que desea deshabilitar - Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s) - Esta usted seguro? - Esta usted Seguro? - TRANSLATE ME: 'Cut' - Editar entrada del Diccionario - Editar idioma - Agregar enlace interno - TRANSLATE ME: 'Insert character' - Insertar titular gráfico - Insertar imagen - Insertar enlace - Insertar macro - Insertar tabla - Última edición - Enlace - Enlace interno - Al usar enlaces locales, insertar "#" delante del enlace - ¿Abrir en nueva ventana? - TRANSLATE ME: 'Macro Settings' - Esta macro no contiene ninguna propiedad que pueda editar - Pegar - Editar permisos para - Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso - La papelera está vacía - No podrá recuperar los items una vez sean borrados de la papelera - regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]> - Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url " - TRANSLATE ME: 'Remove Macro' - Campo obligatorio - El sitio ha sido reindexado - Se ha actualizado la caché y se ha publicado el contenido del sitio web. - La caché del sitio web será actualizada. Todos los contenidos publicados serán actualizados, mientras el contenido no publicado permanecerá no publicado. - Número de columnas - Número de filas - Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]> - Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio. - Haga clic sobre la imagen para verla a tamaño completo. - Seleccionar item - Ver item en la caché - - - Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda - - - - Tipos de nodos hijos permitidos - Crear - Borrar pestaña - TRANSLATE ME: 'Description' - Nueva pestaña - Pestaña - TRANSLATE ME: 'Thumbnail' - - - añadir prevalor - - Tipo de datos GUID - Tipo de datos GUIDprestar control - Botones - Habilitar la configuración avanzada para - Habilitar menú contextual - Por defecto, el tamaño máximo de imágenes insertado - - Mostrar etiqueta - - - - Se ha guardado la información pero debes solucionar los siguientes errores para poder publicar: - La composición actual del proveedor no es compatible con el cambio de la contraseña (Habilitar la contraseña de recuperación es necesaria para que sea cierta) - %0% ya existe - Se han encontrado los siguientes errores: - Se han encontrado los siguientes errores: - La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos - %0% debe ser un número entero - Debe llenar los campos del %0% al %1% - Debe llenar el campo %0% - Debe poner el formato correcto del %0% al %1% - Debe poner un formato correcto en %0% - - - TRANSLATE ME: 'NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.' - Debe llenar el alias y el nombre en el propertytype - Hay un problema de lectura y escritura al acceder a un archivo o carpeta - - Por favor, elija un tipo - Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar? - Error en script python - El script python no se ha guardado debido a que contenía error(es) - - Por favor, marque el contenido antes de cambiar de estilo - No active estilos disponibles - - - - El XSLT no se ha guardado, porque contenía un error (s) - - - Acerca de - Acción - Añadir - Alias - ¿Está seguro? - Borde - o - Cancelar - Margen de la celda - Elegir - Cerrar - Cerrar ventana - Comentario - Confirmar - Mantener proporciones - Continuar - Copiar - Crear - Base de datos - Fecha - Por defecto - Borrar - Borrado - Borrando... - Diseño - Dimensiones - Abajo - Descargar - Editar - Editado - Elementos - Email - Error - Buscar - Altura - Ayuda - Icono - Importar - Margen interno - Insertar - Instalar - Justificar - Idioma - Diseño - Cargando - TRANSLATE ME: 'Locked' - Iniciar sesión - Cerrar sesión - Cerrar sesión - Macro - Mover - Nombre - New - Próximo - No - de - OK - Abrir - o - Contraseña - Ruta - ID de marcador de posición - Un momento por favor... - Anterior - Propiedades - Email para recibir los datos del formulario - Papelera - Restantes - Renombrar - TRANSLATE ME: 'Renew' - Reintentar - Permisos - Buscar - Servidor - Mostrar - Mostrar página al enviar - Tamaño - Ordenar - Tipo - Tipo que buscar... - Arriba - Actualizar - Actualizar - Upload - Url - Usuario - Nombre de usuario - Valor - Ver - Bienvenido... - Ancho - Si - - - Color de fondo - Negritas - Color del texto - Fuente - Texto - - - Página - - - El instalador no puede conectar con la base de datos. - No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente. - Su base de datos ha sido encontrada y ha sido identificada como - Configuración de la base de datos - instalar para instalar %0% la base de datos de Umbraco]]> - Próximo para continuar]]> - ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta.

Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.

Pinche en reintentar cuando haya terminado.
Pinche aquí para mayor información de como editar el web.config (en inglés)

]]>
- Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]> - Pinche en actualizar para actualizar la base de datos a Umbraco %0%

Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización

]]>
- Pinche en Próximo para continuar. ]]> - próximo para continuar con el asistente de configuración]]> - La contraseña del usuario por defecto debe ser cambiada]]> - El usuario por defecto ha sido desabilitado o ha perdido el acceso a umbraco!

Pinche en Próximo para continuar.]]> - ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!

No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]> - ¡La constraseña se ha cambiado! - umbraco crea un usuario por defecto con un nombre de usuario ('admin') y constraseña ('default'). Es importante que la contraseña se cambie a algo único.

Este paso comprobará la contraseña del usuario por defecto y sugerirá si debe cambiarse.

]]>
- Ten un buen comienzo, visita nuestros videos de introducción - Pulsando el botón de Siguiente (o modificando el umbracoConfigurationStatus en el web.config), aceptar la licencia de este software tal y como se especifica en el cuadro de debajo. Ten en cuenta que esta distribución de umbraco consta de dos licencias diferentes, la licencia open source MIT para el framework y la licencia umbraco freeware que cubre la IU. - No ha sido instalado. - Archivos y directorios afectados - Mas información en configurar los permisos para umbraco aquí - Necesitas dar permisos de modificación a ASP.NET para los siguientes archivos/directorios - ¡Tu configuración de permisos es casi perfecta!

Puedes ejecutar umbraco sin problemas, pero no podrás instalar paquetes que es algo recomendable para explotar el potencial de umbraco.]]>
- Como Resolver - Pulsa aquí para leer la versión de texto - video tutoriales acerca de cómo configurar los permisos de los directorios para umbraco o lee la versión de texto.]]> - ¡La configuración de tus permisos podría ser un problema!

Puedes ejecutar umbraco sin problemas, pero no serás capaz de crear directorios o instalar paquetes que es algo recomendable para explotar el potencial de umbraco.]]>
- ¡Tu configuración de permisos no está lista para umbraco!

Para ejecutar umbraco, necesitarás actualizar tu configuración de permisos.]]>
- ¡Tu configuración de permisos es perfecta!

¡Estás listo para ejecutar umbraco e instalar paquetes!]]>
- Resolviendo problemas con directorios - Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios - Configurando los permisos de directorios - Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web - Quiero empezar de cero - learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]> - Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora? - Se ha instalado Runway - Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]> - Sólo recomendado para usuarios expertos - Quiero empezar con un sitio web sencillo - "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos.
Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería.
-However, Runway offers an easy foundation based on best practices to get you started faster than ever. If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.

Included with Runway: Home page, Getting Started page, Installing Modules page.
Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
]]>
- ¿Qué es Runway? - Paso 1 de 5. Aceptar los términos de la licencia - Paso 2 de 5. Configuración de la base de datos - Paso 3 de 5. Autorizar / validar permiso en los archivos - Paso 4 de 5. Configurar seguridad en umbraco - Paso 5 de 5. Umbraco está listo para ser usado - Gracias por elegir Umbraco - Navega a tu nuevo sitio Has instalado Runway, por qué no ves el aspecto de tu nuevo sitio web.]]> - Más ayuda e información Consigue ayuda de nuestra premiada comunidad, navega por la documentación o mira algunos videos gratuitos de cómo crear un sitio sencillo, cómo utilizar los paquetes y una guía rápida de la terminología de umbraco]]> - Umbraco %0% ha sido instalado y está listo para ser usado - archivo /web.config y actualizar la clave del AppSetting umbracoConfigurationStatus del final al valor '%0%'.]]> - empezar inmediatamente pulsando el botón "Lanzar Umbraco" de debajo.
Si eres nuevo con umbraco, puedes encontrar cantidad de recursos en nuestras páginas de cómo empezar.]]>
- Lanzar Umbraco Para administrar tu sitio web, simplemente abre el back office de umbraco y empieza a añadir contenido, a actualizar plantillas y hojas de estilo o a añadir nueva funcionalidad]]> - No se ha podido establecer la conexión con la base de datos - Umbraco versión 3 - Umbraco versión 4 - Mirar - umbraco %0% o actualizar la versión 3.0 a umbraco %0%.

Pinche en "próximo" para empezar con el asistente de configuración.]]>
- - - Código de cultura - Nombre de cultura - - - TRANSLATE ME: 'You've been idle and logout will automatically occur in' - TRANSLATE ME: 'Renew now to save your work' - - - © 2001 - %0%
umbraco.org

]]>
- Bienvenido a umbraco, escribe tu nombre de usuario y clave en los campos de debajo: - - - Panel de Administración - Secciones - Contenido - - - Elija una página arriba... - %0% ha sido copiado al %1% - Seleccione donde el documento %0% debe ser copiado abajo - %0% ha sido movido a %1% - Seleccione debajo donde mover el documento %0% - ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo. - No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue) - No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo - El nodo actual no puede moverse a ninguna de sus subpáginas - TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' - - - Edite su notificación para %0% - Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/actions/editContent.aspx?id=%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de umbraco - Hola %0%

Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'

Resumen de actualización:

%6%

¡Espero que tenga un buen día!

Saludos del robot umbraco.

]]>
- [%0%] Notificación acerca de %1% realizado en %2% - Notificaciones - - - y localizando el paquete. Los paquetes de umbraco normalmente tienen la extensión ".umb" o ".zip".]]> - Autor - - Documentación - Meta datos del paquete - Nombre del paquete - El paquete no contiene ningún elemento -
Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
- No hay actualizaciones disponibles - Opciones del paquete - Leeme del paquete - Repositorio de paquetes - Confirma la desinstalación - El paquete ha sido desinstalado - El paquete se ha desinstalado correctamente - Desinstalar paquete - Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]> - Descargar actualización del repositorio - Actualizar paquete - Instrucciones de actualización - Hay una actualización disponible para este paquete. Puedes descargarla directamente del repositorio de paquetes de umbraco. - Versión del paquete - Ver página web del paquete - - - Pegar con formato completo (No recomendado) - El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web. - Pegar como texto sin formato - Pegar, pero quitando el formato (Recomendado) - - - Proteccion basada en roles - usando los grupos de miembros de umbraco.]]> - autenticación basada en roles.]]> - Página de error - Usada cuando alguien hace login, pero no tiene acceso - Elija cómo restringir el acceso a esta página - %0% está protegido - Protección borrada de %0% - Página de login - Elija la página que contenga el formulario de login - Borrar protección - Elija las páginas que contendrán el formulario de login y mensajes de error - Elija los roles que tendrán acceso a esta página - Elija el login y password para esta página - Protección de usuario único - Si sólo necesita configurar una protección simple usando un único login y password - - - %0% no ha podido ser publicado, debido a que una extensión de otro proveedor ha cancelado la acción. - Incluir las páginas hija sin publicar - Publicación en progreso - por favor, espera... - Se han publicado %0% de %1% páginas... - %0% se ha publicado - %0% y sus subpáginas se han publicado - Publicar %0% y todas sus subpáginas - aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público.

Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
- - - TRANSLATE ME: 'Add external link' - TRANSLATE ME: 'Add internal link' - TRANSLATE ME: 'Add' - TRANSLATE ME: 'Caption' - TRANSLATE ME: 'Internal page' - TRANSLATE ME: 'URL' - TRANSLATE ME: 'Move Down' - TRANSLATE ME: 'Move Up' - TRANSLATE ME: 'Open in new window' - TRANSLATE ME: 'Remove link' - - - Versión actual - Red el texto de la versión seleccionada no se mostrará. , green means added]]> - Se ha recuperado la última versión del documento. - Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff - Volver a - Elija versión - Vista - - - Editar fichero de script - - - Conserje - Contenido - Mensajero - Desarrollador - Asistente de configuración de Umbraco - Media - Miembros - Boletín informativo - Ajustes - Estadísticas - Traducción - Usuarios - - - Plantilla por defecto - Clave de diccionario - Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla) - Nuevo nombre de la pestaña - Tipo de nodo - Tipo - Hoja de estilos - Propiedades de la hoja de estilos - Pestaña - Nombre de la pestaña - Pestañas - - - Ordenación completa. - Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas - -
No cierre esta ventana mientras se está ordenando ]]>
- - - La publicación fue cancelada por un complemento de terceros - El tipo de propiedad ya existe - Tipo de propiedad creado - Tipo de Dato: %1%]]> - Tipo de propiedad eliminado - Tipo de contenido guardado - Pestaña creada - Pestaña eliminada - Pestaña con id: %0% eliminada - La hoja de estilos no se ha guardado - Hoja de estilos guardada - La hoja de estilos se ha guardado sin errores - Tipo de dato guardado - Elemento del diccionario guardado - La publicación ha fallado porque la página padre no está publicada - Contenido publicado - y visible en el sitio web - Contenido guardado - Recuerda publicar para hacer los cambios visibles - Mandado para ser aprobado - Los cambios se han mandado para ser aprobados - Miembro guardado - Propiedad de la hoja de estilos guardada - Hoja de estilos guardada - Plantilla guardada - Error grabando usuario (comprueba el log) - Usuario grabado - El archivo no se ha guardado - El archivo no se ha grabado. Por favor, comprueba los permisos de los ficheros - Archivo guardado - Archivo grabado sin errores - Lenguaje guardado - El script en Python no se ha guardado - El script en Python no se ha podido guardar debido a un error - Script en Python guardado - No hay errores en el script en Python - La plantilla no se ha guardado - Por favor, asegúrate de que no hay 2 plantillas con el mismo alias - Plantilla guardada - Plantilla guardada sin errores - El Xslt no se ha guardado - El Xslt tenía un error - El Xslt no se ha podido guardar, comprueba los permisos de los ficheros - Xslt guardado - No hay errores en el Xslt - - - Usa sintaxis CSS, p.ej.: h1, .redHeader, .blueTex - Editar hoja de estilos - Editar propiedades de la hoja de estilos - Nombre para identificar la propiedad del estilo en el editor de texto rico - Previsualizar - Estilos - - - Editar plantilla - Insertar área de contenido - Insertar marcador de posición de área de contenido - Insertar objeto del diccionario - Insertar macro - Insertar campo de página de umbraco - Plantilla principal - Guía rápida sobre las etiquetas de plantilla de umbraco - Plantilla - - - Campo opcional - Texto opcional - MAYÚSCULA/minúscula - Elegir campo - Convertir a salto de línea - Reemplaza los saltos de línea con la etiqueta HTML &lt;br&gt; - Si, solamente la fecha - Cambiar formato a fecha - Codificar HTML - Se reemplazarán los caracteres especiales por su código HTML equivalente. - Será insertado después del valor del campo - Será insertado antes del valor del campo - Minúscula - Ninguno/ninguna - Insertar después del campo - Insertar antes del campo - Recursivo - Borrar los tags del párrafo - Borrará cualquier &lt;P&gt; al principio y al final del texto - Mayúscula - Codificar URL - Formateará los caracteres especiales de las URLs - Sólo será usado cuando el campo superior esté vacio - Este campo será usado unicamente si el campo primario está vacío - Si, con el tiempo. Separador: - - - Tareas asignadas a usted - asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML".
Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
- cerrar tarea - Detalles de traducción - Descargar todas las tareas pendientes de traducción como archivo xml - Descargar xml - Descargar xml DTD - Campos - Incluir subpáginas - Hola %0%. Este email se ha generado automáticamente para informale que %2% ha solicitado que el documento '%1%' sea traducido en '%5%'. Para editarlo, vaya a la dirección http://%3%/umbraco/translation/details.aspx?id=%4% o inicie la sesión en umbraco y vaya a http://%3%/umbraco/umbraco.aspx para ver las tareas pendientes de traducir. Espero que tenga un buen dia. Saludos de parte de el robot de umbraco - Tarea para tradudir [%0%] por %1% - No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción - Tareas creadas por ti - creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]> - La página '%0%' se ha mandado a traducción - Manda la página '%0%' a traducción - Asignada por - Tarea abierta - Total de palabras - Traducir a - Traducción hecha. - Puedes previsualizar las páginas que acabas de traducir, pulsando debajo. Si la página original existe, se mostrará una comparación de las 2 páginas. - La traducción ha fallado. El archivo xml es inválido - Opciones para traducir - Traductor - Subir traducción xml - - - Caché del navegador - Papelera de reciclaje - Paquetes creados - Tipos de datos - Diccionario - Paquetes instalados - TRANSLATE ME: 'Install skin' - TRANSLATE ME: 'Install starter kit' - Idiomas - Instalar paquete local - Macros - Tipos de medios - Miembros - Grupos de miembros - Roles - Tipos de miembros - Tipos de documento - Paquetes - Paquetes - Ficheros Python - Instalar desde repositorio - Instalar pasarela - Módulos pasarela - TRANSLATE ME: 'Scripting Files' - Scripts - Hojas de estilo - Plantillas - Archivos XSLT - - - Existe una nueva actualización - %0% esta listo, pulsa aquí para descargar - No hay conexión al servidor - Error al comprobar la actualización. Por favor revisa "trace-stack" para conseguir más información. - - - Administrador - Campo de categoria - TRANSLATE ME: 'Change Your Password' - TRANSLATE ME: 'You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button' - Canal de contenido - Redirigir al canvas al entrar - Campo descriptivo - Deshabilitar usuario - Tipo de documento - Editor - Campo de citas - Idioma - Login - Nodo de comienzo en la libreria de medios - Secciones - Deshabilitar acceso a Umbraco - Password - TRANSLATE ME: 'Your password has been changed!' - TRANSLATE ME: 'Please confirm the new password' - TRANSLATE ME: 'Enter your new password' - TRANSLATE ME: 'Your new password cannot be blank!' - TRANSLATE ME: 'There was a difference between the new password and the confirmed password. Please try again!' - TRANSLATE ME: 'The confirmed password doesn't match the new password!' - Reemplazar los permisos de los nodos hijo - Estas modificando los permisos para las páginas: - Selecciona las páginas para modificar sus permisos - Buscar en todos los hijos - Nodo de comienzo en contenido - Nombre de usuario - Permisos de usuarios - Tipo de usuario - Tipos de usuarios - Redactor - + + + + The umbraco community + http://umbraco.org/documentation/language-files + + + Administrar hostnames + Auditoría + Nodo de Exploración + Copiar + Crear + Crear Paquete + Borrar + Deshabilitar + Vaciar Papelera + Exportar Documento (tipo) + TRANSLATE ME: 'Export to .NET' + TRANSLATE ME: 'Export to .NET' + Importar Documento (tipo) + Importar Paquete + Editar en lienzo + Salir + Mover + Notificaciones + Acceso Público + Publicar + Recargar Nodos + Republicar sitio completo + Permisos + Deshacer + Enviar a Publicar + Enviar a Traducir + Ordernar + Enviar a publicación + Traducir + Actualizar + + + Añadir nuevo dominio + Dominio + El nuevo dominio %0% ha sido creado + El dominio %0% ha sido borrado + El dominio'%0%' ya ha sido asignado + p.ej.: tudominio.com, www.tudominio.com + El dominio %0% ha sido actualizado + Editar dominios actuales + + + Visualización de + + + Negrita + Cancelar Sangría del Párrafo + Insertar campo de formulario + Insertar gráfico de titular + Editar Html + Sangría + Cursiva + Centrar + Alinear a la Izquierda + Alinear a la Derecha + Insertar Link + Insertar link local (anchor) + Lista en Viñetas + Lista Numérica + Insertar macro + Insertar imagen + Editar relaciones + Guardar + Guardar y publicar + Guardar y enviar para aprobación + Previsualizar + Elegir estilo + Mostrar estilos + Insertar tabla + + + Acerca de + Link alternativo + (como describe la imagen sobre el teléfono) + Vinculos Alternativos + Click para editar esta entrada + Creado por + Creado + Tipo de Documento + Editando + Remover el + Esta entrada ha sido modificada después de haber sido publicada + Esta entrada no esta publicada + Último publicado + Tipo de Medio + Miembro de Grupo + Rol + Tipo de miembro + Sin fecha + Título de la página + Propiedades + Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado + Publicar + Estado de la Publicación + Publicar el + Fecha de Eliminación + El Orden esta actualizado + Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona + Estadísticas + Título (opcional) + Tipo + No Publicar + Última actualización + Eliminar archivo + Vínculo al documento + + + ¿Dónde quieres crear el nuevo %0% + Crear debajo de + Elije un tipo y un título + + + Navega en tu sitio Web + TRANSLATE ME: '- Hide' + Si Umbraco no se ha abierto tendrás que permitir ventanas emergentes para este sitio Web + se ha abierto en una nueva ventana + Reinicio + Visita + Bienvenido + + + Nombre + Administrar dominios + Cerrar esta ventana + Esta usted seguro que desea borrar + Esta usted seguro que desea deshabilitar + Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s) + Esta usted seguro? + Esta usted Seguro? + TRANSLATE ME: 'Cut' + Editar entrada del Diccionario + Editar idioma + Agregar enlace interno + TRANSLATE ME: 'Insert character' + Insertar titular gráfico + Insertar imagen + Insertar enlace + Insertar macro + Insertar tabla + Última edición + Enlace + Enlace interno + Al usar enlaces locales, insertar "#" delante del enlace + ¿Abrir en nueva ventana? + TRANSLATE ME: 'Macro Settings' + Esta macro no contiene ninguna propiedad que pueda editar + Pegar + Editar permisos para + Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso + La papelera está vacía + No podrá recuperar los items una vez sean borrados de la papelera + regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]> + Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url " + TRANSLATE ME: 'Remove Macro' + Campo obligatorio + El sitio ha sido reindexado + Se ha actualizado la caché y se ha publicado el contenido del sitio web. + La caché del sitio web será actualizada. Todos los contenidos publicados serán actualizados, mientras el contenido no publicado permanecerá no publicado. + Número de columnas + Número de filas + Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]> + Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio. + Haga clic sobre la imagen para verla a tamaño completo. + Seleccionar item + Ver item en la caché + + + Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda + + + + Tipos de nodos hijos permitidos + Crear + Borrar pestaña + TRANSLATE ME: 'Description' + Nueva pestaña + Pestaña + TRANSLATE ME: 'Thumbnail' + + + añadir prevalor + + Tipo de datos GUID + Tipo de datos GUIDprestar control + Botones + Habilitar la configuración avanzada para + Habilitar menú contextual + Por defecto, el tamaño máximo de imágenes insertado + + Mostrar etiqueta + + + + Se ha guardado la información pero debes solucionar los siguientes errores para poder publicar: + La composición actual del proveedor no es compatible con el cambio de la contraseña (Habilitar la contraseña de recuperación es necesaria para que sea cierta) + %0% ya existe + Se han encontrado los siguientes errores: + Se han encontrado los siguientes errores: + La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos + %0% debe ser un número entero + Debe llenar los campos del %0% al %1% + Debe llenar el campo %0% + Debe poner el formato correcto del %0% al %1% + Debe poner un formato correcto en %0% + + + TRANSLATE ME: 'NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.' + Debe llenar el alias y el nombre en el propertytype + Hay un problema de lectura y escritura al acceder a un archivo o carpeta + + Por favor, elija un tipo + Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar? + Error en script python + El script python no se ha guardado debido a que contenía error(es) + + Por favor, marque el contenido antes de cambiar de estilo + No active estilos disponibles + + + + El XSLT no se ha guardado, porque contenía un error (s) + + + Acerca de + Acción + Añadir + Alias + ¿Está seguro? + Borde + o + Cancelar + Margen de la celda + Elegir + Cerrar + Cerrar ventana + Comentario + Confirmar + Mantener proporciones + Continuar + Copiar + Crear + Base de datos + Fecha + Por defecto + Borrar + Borrado + Borrando... + Diseño + Dimensiones + Abajo + Descargar + Editar + Editado + Elementos + Email + Error + Buscar + Altura + Ayuda + Icono + Importar + Margen interno + Insertar + Instalar + Justificar + Idioma + Diseño + Cargando + TRANSLATE ME: 'Locked' + Iniciar sesión + Cerrar sesión + Cerrar sesión + Macro + Mover + Nombre + New + Próximo + No + de + OK + Abrir + o + Contraseña + Ruta + ID de marcador de posición + Un momento por favor... + Anterior + Propiedades + Email para recibir los datos del formulario + Papelera + Restantes + Renombrar + TRANSLATE ME: 'Renew' + Reintentar + Permisos + Buscar + Servidor + Mostrar + Mostrar página al enviar + Tamaño + Ordenar + Tipo + Tipo que buscar... + Arriba + Actualizar + Actualizar + Upload + Url + Usuario + Nombre de usuario + Valor + Ver + Bienvenido... + Ancho + Si + + + Color de fondo + Negritas + Color del texto + Fuente + Texto + + + Página + + + El instalador no puede conectar con la base de datos. + No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente. + Su base de datos ha sido encontrada y ha sido identificada como + Configuración de la base de datos + instalar para instalar %0% la base de datos de Umbraco]]> + Próximo para continuar]]> + ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta.

Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.

Pinche en reintentar cuando haya terminado.
Pinche aquí para mayor información de como editar el web.config (en inglés)

]]>
+ Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]> + Pinche en actualizar para actualizar la base de datos a Umbraco %0%

Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización

]]>
+ Pinche en Próximo para continuar. ]]> + próximo para continuar con el asistente de configuración]]> + La contraseña del usuario por defecto debe ser cambiada]]> + El usuario por defecto ha sido desabilitado o ha perdido el acceso a umbraco!

Pinche en Próximo para continuar.]]> + ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!

No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]> + ¡La constraseña se ha cambiado! + umbraco crea un usuario por defecto con un nombre de usuario ('admin') y constraseña ('default'). Es importante que la contraseña se cambie a algo único.

Este paso comprobará la contraseña del usuario por defecto y sugerirá si debe cambiarse.

]]>
+ Ten un buen comienzo, visita nuestros videos de introducción + Pulsando el botón de Siguiente (o modificando el umbracoConfigurationStatus en el web.config), aceptar la licencia de este software tal y como se especifica en el cuadro de debajo. Ten en cuenta que esta distribución de umbraco consta de dos licencias diferentes, la licencia open source MIT para el framework y la licencia umbraco freeware que cubre la IU. + No ha sido instalado. + Archivos y directorios afectados + Mas información en configurar los permisos para umbraco aquí + Necesitas dar permisos de modificación a ASP.NET para los siguientes archivos/directorios + ¡Tu configuración de permisos es casi perfecta!

Puedes ejecutar umbraco sin problemas, pero no podrás instalar paquetes que es algo recomendable para explotar el potencial de umbraco.]]>
+ Como Resolver + Pulsa aquí para leer la versión de texto + video tutoriales acerca de cómo configurar los permisos de los directorios para umbraco o lee la versión de texto.]]> + ¡La configuración de tus permisos podría ser un problema!

Puedes ejecutar umbraco sin problemas, pero no serás capaz de crear directorios o instalar paquetes que es algo recomendable para explotar el potencial de umbraco.]]>
+ ¡Tu configuración de permisos no está lista para umbraco!

Para ejecutar umbraco, necesitarás actualizar tu configuración de permisos.]]>
+ ¡Tu configuración de permisos es perfecta!

¡Estás listo para ejecutar umbraco e instalar paquetes!]]>
+ Resolviendo problemas con directorios + Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios + Configurando los permisos de directorios + Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web + Quiero empezar de cero + learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]> + Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora? + Se ha instalado Runway + Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]> + Sólo recomendado para usuarios expertos + Quiero empezar con un sitio web sencillo + "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos.
Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería.
+However, Runway offers an easy foundation based on best practices to get you started faster than ever. If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.

Included with Runway: Home page, Getting Started page, Installing Modules page.
Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
]]>
+ ¿Qué es Runway? + Paso 1 de 5. Aceptar los términos de la licencia + Paso 2 de 5. Configuración de la base de datos + Paso 3 de 5. Autorizar / validar permiso en los archivos + Paso 4 de 5. Configurar seguridad en umbraco + Paso 5 de 5. Umbraco está listo para ser usado + Gracias por elegir Umbraco + Navega a tu nuevo sitio Has instalado Runway, por qué no ves el aspecto de tu nuevo sitio web.]]> + Más ayuda e información Consigue ayuda de nuestra premiada comunidad, navega por la documentación o mira algunos videos gratuitos de cómo crear un sitio sencillo, cómo utilizar los paquetes y una guía rápida de la terminología de umbraco]]> + Umbraco %0% ha sido instalado y está listo para ser usado + archivo /web.config y actualizar la clave del AppSetting umbracoConfigurationStatus del final al valor '%0%'.]]> + empezar inmediatamente pulsando el botón "Lanzar Umbraco" de debajo.
Si eres nuevo con umbraco, puedes encontrar cantidad de recursos en nuestras páginas de cómo empezar.]]>
+ Lanzar Umbraco Para administrar tu sitio web, simplemente abre el back office de umbraco y empieza a añadir contenido, a actualizar plantillas y hojas de estilo o a añadir nueva funcionalidad]]> + No se ha podido establecer la conexión con la base de datos + Umbraco versión 3 + Umbraco versión 4 + Mirar + umbraco %0% o actualizar la versión 3.0 a umbraco %0%.

Pinche en "próximo" para empezar con el asistente de configuración.]]>
+ + + Código de cultura + Nombre de cultura + + + TRANSLATE ME: 'You've been idle and logout will automatically occur in' + TRANSLATE ME: 'Renew now to save your work' + + + © 2001 - %0%
umbraco.org

]]>
+ Bienvenido a umbraco, escribe tu nombre de usuario y clave en los campos de debajo: + + + Panel de Administración + Secciones + Contenido + + + Elija una página arriba... + %0% ha sido copiado al %1% + Seleccione donde el documento %0% debe ser copiado abajo + %0% ha sido movido a %1% + Seleccione debajo donde mover el documento %0% + ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo. + No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue) + No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo + El nodo actual no puede moverse a ninguna de sus subpáginas + TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + + + Edite su notificación para %0% + Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/actions/editContent.aspx?id=%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de umbraco + Hola %0%

Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'

Resumen de actualización:

%6%

¡Espero que tenga un buen día!

Saludos del robot umbraco.

]]>
+ [%0%] Notificación acerca de %1% realizado en %2% + Notificaciones + + + y localizando el paquete. Los paquetes de umbraco normalmente tienen la extensión ".umb" o ".zip".]]> + Autor + + Documentación + Meta datos del paquete + Nombre del paquete + El paquete no contiene ningún elemento +
Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
+ No hay actualizaciones disponibles + Opciones del paquete + Leeme del paquete + Repositorio de paquetes + Confirma la desinstalación + El paquete ha sido desinstalado + El paquete se ha desinstalado correctamente + Desinstalar paquete + Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]> + Descargar actualización del repositorio + Actualizar paquete + Instrucciones de actualización + Hay una actualización disponible para este paquete. Puedes descargarla directamente del repositorio de paquetes de umbraco. + Versión del paquete + Ver página web del paquete + + + Pegar con formato completo (No recomendado) + El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web. + Pegar como texto sin formato + Pegar, pero quitando el formato (Recomendado) + + + Proteccion basada en roles + usando los grupos de miembros de umbraco.]]> + autenticación basada en roles.]]> + Página de error + Usada cuando alguien hace login, pero no tiene acceso + Elija cómo restringir el acceso a esta página + %0% está protegido + Protección borrada de %0% + Página de login + Elija la página que contenga el formulario de login + Borrar protección + Elija las páginas que contendrán el formulario de login y mensajes de error + Elija los roles que tendrán acceso a esta página + Elija el login y password para esta página + Protección de usuario único + Si sólo necesita configurar una protección simple usando un único login y password + + + %0% no ha podido ser publicado, debido a que una extensión de otro proveedor ha cancelado la acción. + Incluir las páginas hija sin publicar + Publicación en progreso - por favor, espera... + Se han publicado %0% de %1% páginas... + %0% se ha publicado + %0% y sus subpáginas se han publicado + Publicar %0% y todas sus subpáginas + aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público.

Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
+ + + TRANSLATE ME: 'Add external link' + TRANSLATE ME: 'Add internal link' + TRANSLATE ME: 'Add' + TRANSLATE ME: 'Caption' + TRANSLATE ME: 'Internal page' + TRANSLATE ME: 'URL' + TRANSLATE ME: 'Move Down' + TRANSLATE ME: 'Move Up' + TRANSLATE ME: 'Open in new window' + TRANSLATE ME: 'Remove link' + + + Versión actual + Red el texto de la versión seleccionada no se mostrará. , green means added]]> + Se ha recuperado la última versión del documento. + Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff + Volver a + Elija versión + Vista + + + Editar fichero de script + + + Conserje + Contenido + Mensajero + Desarrollador + Asistente de configuración de Umbraco + Media + Miembros + Boletín informativo + Ajustes + Estadísticas + Traducción + Usuarios + + + Plantilla por defecto + Clave de diccionario + Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla) + Nuevo nombre de la pestaña + Tipo de nodo + Tipo + Hoja de estilos + Propiedades de la hoja de estilos + Pestaña + Nombre de la pestaña + Pestañas + + + Ordenación completa. + Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas + +
No cierre esta ventana mientras se está ordenando ]]>
+ + + La publicación fue cancelada por un complemento de terceros + El tipo de propiedad ya existe + Tipo de propiedad creado + Tipo de Dato: %1%]]> + Tipo de propiedad eliminado + Tipo de contenido guardado + Pestaña creada + Pestaña eliminada + Pestaña con id: %0% eliminada + La hoja de estilos no se ha guardado + Hoja de estilos guardada + La hoja de estilos se ha guardado sin errores + Tipo de dato guardado + Elemento del diccionario guardado + La publicación ha fallado porque la página padre no está publicada + Contenido publicado + y visible en el sitio web + Contenido guardado + Recuerda publicar para hacer los cambios visibles + Mandado para ser aprobado + Los cambios se han mandado para ser aprobados + Miembro guardado + Propiedad de la hoja de estilos guardada + Hoja de estilos guardada + Plantilla guardada + Error grabando usuario (comprueba el log) + Usuario grabado + El archivo no se ha guardado + El archivo no se ha grabado. Por favor, comprueba los permisos de los ficheros + Archivo guardado + Archivo grabado sin errores + Lenguaje guardado + El script en Python no se ha guardado + El script en Python no se ha podido guardar debido a un error + Script en Python guardado + No hay errores en el script en Python + La plantilla no se ha guardado + Por favor, asegúrate de que no hay 2 plantillas con el mismo alias + Plantilla guardada + Plantilla guardada sin errores + El Xslt no se ha guardado + El Xslt tenía un error + El Xslt no se ha podido guardar, comprueba los permisos de los ficheros + Xslt guardado + No hay errores en el Xslt + + + Usa sintaxis CSS, p.ej.: h1, .redHeader, .blueTex + Editar hoja de estilos + Editar propiedades de la hoja de estilos + Nombre para identificar la propiedad del estilo en el editor de texto rico + Previsualizar + Estilos + + + Editar plantilla + Insertar área de contenido + Insertar marcador de posición de área de contenido + Insertar objeto del diccionario + Insertar macro + Insertar campo de página de umbraco + Plantilla principal + Guía rápida sobre las etiquetas de plantilla de umbraco + Plantilla + + + Campo opcional + Texto opcional + MAYÚSCULA/minúscula + Elegir campo + Convertir a salto de línea + Reemplaza los saltos de línea con la etiqueta HTML &lt;br&gt; + Si, solamente la fecha + Cambiar formato a fecha + Codificar HTML + Se reemplazarán los caracteres especiales por su código HTML equivalente. + Será insertado después del valor del campo + Será insertado antes del valor del campo + Minúscula + Ninguno/ninguna + Insertar después del campo + Insertar antes del campo + Recursivo + Borrar los tags del párrafo + Borrará cualquier &lt;P&gt; al principio y al final del texto + Mayúscula + Codificar URL + Formateará los caracteres especiales de las URLs + Sólo será usado cuando el campo superior esté vacio + Este campo será usado unicamente si el campo primario está vacío + Si, con el tiempo. Separador: + + + Tareas asignadas a usted + asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML".
Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
+ cerrar tarea + Detalles de traducción + Descargar todas las tareas pendientes de traducción como archivo xml + Descargar xml + Descargar xml DTD + Campos + Incluir subpáginas + Hola %0%. Este email se ha generado automáticamente para informale que %2% ha solicitado que el documento '%1%' sea traducido en '%5%'. Para editarlo, vaya a la dirección http://%3%/umbraco/translation/details.aspx?id=%4% o inicie la sesión en umbraco y vaya a http://%3%/umbraco/umbraco.aspx para ver las tareas pendientes de traducir. Espero que tenga un buen dia. Saludos de parte de el robot de umbraco + Tarea para tradudir [%0%] por %1% + No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción + Tareas creadas por ti + creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]> + La página '%0%' se ha mandado a traducción + Manda la página '%0%' a traducción + Asignada por + Tarea abierta + Total de palabras + Traducir a + Traducción hecha. + Puedes previsualizar las páginas que acabas de traducir, pulsando debajo. Si la página original existe, se mostrará una comparación de las 2 páginas. + La traducción ha fallado. El archivo xml es inválido + Opciones para traducir + Traductor + Subir traducción xml + + + Caché del navegador + Papelera de reciclaje + Paquetes creados + Tipos de datos + Diccionario + Paquetes instalados + TRANSLATE ME: 'Install skin' + TRANSLATE ME: 'Install starter kit' + Idiomas + Instalar paquete local + Macros + Tipos de medios + Miembros + Grupos de miembros + Roles + Tipos de miembros + Tipos de documento + Paquetes + Paquetes + Ficheros Python + Instalar desde repositorio + Instalar pasarela + Módulos pasarela + TRANSLATE ME: 'Scripting Files' + Scripts + Hojas de estilo + Plantillas + Archivos XSLT + + + Existe una nueva actualización + %0% esta listo, pulsa aquí para descargar + No hay conexión al servidor + Error al comprobar la actualización. Por favor revisa "trace-stack" para conseguir más información. + + + Administrador + Campo de categoria + TRANSLATE ME: 'Change Your Password' + TRANSLATE ME: 'You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button' + Canal de contenido + Redirigir al canvas al entrar + Campo descriptivo + Deshabilitar usuario + Tipo de documento + Editor + Campo de citas + Idioma + Login + Nodo de comienzo en la libreria de medios + Secciones + Deshabilitar acceso a Umbraco + Password + TRANSLATE ME: 'Your password has been changed!' + TRANSLATE ME: 'Please confirm the new password' + TRANSLATE ME: 'Enter your new password' + TRANSLATE ME: 'Your new password cannot be blank!' + TRANSLATE ME: 'There was a difference between the new password and the confirmed password. Please try again!' + TRANSLATE ME: 'The confirmed password doesn't match the new password!' + Reemplazar los permisos de los nodos hijo + Estas modificando los permisos para las páginas: + Selecciona las páginas para modificar sus permisos + Buscar en todos los hijos + Nodo de comienzo en contenido + Nombre de usuario + Permisos de usuarios + Tipo de usuario + Tipos de usuarios + Redactor +
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml index 0e646278f8..94a7bb91f2 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml @@ -1,953 +1,953 @@ - - - - The umbraco community - http://umbraco.org/documentation/language-files - - - Gérer les noms d'hôtes - Information d'audition - Parcourir le noeud - Copier - Créer - Créer Package - Supprimer - Désactivé - Vider la corbeille - Exporter un type - Exporter en .NET - Exporter en .NET - Importer un type - Importer Package - Editer avec prévisualisation - Sortie - Déplacer - Notifications - Accès public - Publier - Dépublier - Rafraîchir - Republier le site en entier - Permissions - Restaurer - Envoyer pour publication - Envoyer pour traduction - Trier - Envoyer pour publication - Traduire - Mise à jour - - - Ajouter un nouveau domaine - Nom d'hôte invalide - Domaine - Le nouveau domaine '%0%' a été créé - Le domaine '%0%' est supprimé - Le domaine '%0%' a déjà été assigné - - - https://www.exemple.com/, exemple.com/en, etc... Utiliser * pour - répondre
à n'importe quel domaine et définissez la culture.]]> -
- Le domaine '%0%' a été mis à jour - ou editer les domaines courants - - - Lecture en cours pour - - - Gras - Annuler l'indentation du paragraphe - Inserer un champ de formulaire - Bannière graphique principale - Editer l'Html - Indenter le paragraphe - Italique - Centrer - Justifié Gauche - Justifié Droit - Insérer un lien - Insérer un lien local (ancre) - Liste à puces - Liste numérique - Inserer une macro - Insérer une image - Editer les relations - Sauver - Sauver et publier - Envoyer et envoyer pour approbation - Prévisualiser - La prévisualisation est desactivée car aucun template n'a été assigné - Choisir un style - Montrer les styles - Inserer une table - - - A propos de cette page - Lien alternatif - (comment voulez-vous décrire l'image au dessus du téléphone) - Liens alternatifs - Cliquez pour éditer cet élément - Créé par - Créé le - Type de document - En cours d'édition - Supprimé le - Cet élément a été modifié après la publication - Cet élément n'est pas publié - Dernière publication - Types de média - Lien vers l'élément Média associé - Groupe de membres - Rôle - Types de membres - Aucune date choisie - Titre de la page - Propriétés - Ce document est publié mais n'est pas visible car le parent '%0%' n'est pas publié - Outch: ce document est publié mais absent du cache (erreur interne) - Publier - Statut de la publication - Publié le - Effacer la date - L'ordre de tri a été mis à jour - Pour trier les noeuds, vous pouvez simplement glisser et déplacer les noeuds ou cliquer sur un des titres de colonne. Vous pouvez sélectionner plusieurs noeuds en gardant la touche "MAJ" ou "Control" enfoncée lors de la sélection - Statistiques - Titre (option) - Type - Annuler la publication - Dernière modification - Supprimer le fichier - Lien vers le document - - - Où voulez-vous créer le nouveau %0% - Créer à - Choisissez un titre et un type - - - Parcourir votre site - - Masquer - Si umbraco ne s'ouvre pas, vous devez peut-être autoriser les popups pour ce site. - a ouvert une nouvelle fenêtre - Redémarrer - Visitez - Bienvenue - - - Nom - Gestion des domaines - Fermer cette fenêtre - Êtes-vous sur de supprimer - Êtes-vous sur de désactiver - Cocher cette case pour confirmer la suppression de %0% élément(s) - Êtes-vous sur ? - Êtes-vous sur? - Couper - Editer un élément du dictionnaire - Editer une langue - Insérer un lien local - Insérer un caractère - Insérer une image - Insérer une image - Insérer un lien - Insérer une macro - Insérer une table - Dernière modification - Lien - Lien international: - Lorsque vous utiliser des liens locaux, insérez un "#" devant le lient - Ouvrir dans une nouvelle fenêtre ? - Paramétrage de la macro - Cette macro ne contient pas de propriété editable - Coller - Editer les permissions pour - Votre corbeille est en train d'être vidée. Veuillez ne pas fermer cettre fenêtre tant que l'opération n'est pas terminée. - La corbeille est vide - Lorsque vous videz la corbeille, les objets s'y trouvant sont supprimés à jamais. - regexlib.com semble interrompu. Ce probleme n'est pas lié à Umbraco. Veuillez réessayer plus tard.]]> - - Retirez la macro - Champs obligatoire - Le site est ré-indexé - Le site a été republié. Tout le contenu publié est à jour. - Le cache du site sera rafraîchi. Tout le contenu publié sera mis à jour, et le contenue non publié restera non publié. - Nombre de colonnes - Nombre de lignes - - Définir un id pour le placeholder cela vous permet d'injecter du contenu dans le placeholder depuis un template enfant, - en référençant cet ID de la manière suivante <asp:content /> element.]]> - - - Séléctionnez un id de placeholder depuis la liste suivante. Vous pouvez - choisir l'id du template maitre.]]> - Cliquer sur l'image pour voir l'original - Choisir un élément - Voir un élemant du Cache - - - - %0%'
Vous pouvez ajouter des langues dans la section 'Langues' du menu de gauche. - ]]>
- Nom de la culture - - - Types de noeuds enfants permis - Créer - Supprimer l'onglet - Description - Nouvel onglet - Onglet - Miniature - - - Ajouter un couple clé / valeur - Type de données en base de données - Identifiant unique de l'éditeur de données - Prévisualiser le contenu du control - Boutons - Activer les paramètres avancés - Activer le menu contextuel - Taille maximum par défaut des images insérées - Feuille de style associée - Afficher le nom du champs - Largeur et hauteur - - - Vos données ont été enregistrée, avant de pouvoir publier la page vous devez corriger les erreurs suivantes : - Le fournisseur d'authentification n'autorise pas le changement de mot de passe(EnablePasswordRetrieval doit être paramétré à true dans le web.config)' - %0% existe déjà - Des erreurs se sont produites : - Des erreurs se sont produites : - Le mot de passe doit contenir un minimum de %0% caractères et en contenir au moins %1% qui soit non alphanumérique(s)' - %0% doit être un entier - %0% à %1% est un champ obligatoire - %0% est un champ obligatoire - %0% à %1% n'a pas un format correct - %0% n'a pas un format correct - - - ATTENTION! Même si 'CodeMirror' est activé via la configuration, il reste desactivé dans Internet Explorer car il n'est pas encore assez stable. - Veuillez remplir l'alias et le nom pour les nouveaux types de propriétés ! - Il y a un probleme de droit d'accès en lecture/écriture sur un fichier ou un dossier spécifique - Entrez un titre - Choisissez un type - Vous allez élargir la photo par rapport à sa taille originale. Êtes-vous sur de vouloir contnier ? - Erreur dans le script python - Le script python n'a pas été sauvé, car il contient une ou des erreurs - Noeud de départ supprimé, contactez votre administrateur - Veuillez marquer le contenu avant de changer le style - Aucun style actif disponible - Placez le curseur à gauche des deux cellules que vous voulez fusionner - Vous ne pouvez pas diviser une cellule qui n'a pas été fusionnée. - Erreur dans la source xslt - Le fichier XSLT n'a pas été sauvé car il contient une ou des erreurs - - - A propos - Action - Ajouter - Alias - Êtes-vou sur? - Bordure - ou - Annuler - Marge cellule - Choisir - Fermer - Fermer la fenêtre - Commentaire - Confirmer - Respecter les proportions - Continuer - Copier - Créer - Base de données - Date - Defaut - Supprimer - Supprimé - Suppression en cours... - Design - Taille - Bas - Télécharger - Editer - Edité - Eléments - E-mail - Erreur - Trouver - Hauteur - Aide - Icône - Importer - Marge interne - Insérer - Installer - Justifié - Langue - Mise en page - Chargement en cours - Verrouillé - Login - Se déconnecter - Se déconnecter - Macro - Déplacer - Nom - Nouveau - Suivant - Non - de - OK - Ouvrir - ou - Mot de passe - Chemin - Placeholder ID - Un moment svp... - Précédent - Propriétés - Formulaire de données Email à recevoir - Corbeille - Restant - Renommer - Renvoyer - Réessayer - Permissions - Rechercher - Serveur - Montrer - Afficher la page à l'envoi - Taille - Trier - Type - Je cherche... - Haut - Mise à jour - Mettre à jour - Uploader - Adresse - Utilisateur - Nom d'utilisateur - Valeur - Voir - Bienvenue... - Largeur - Oui - Répertoire - - - Couleur de fond - Gras - Couleur du texte - Police - Texte - - - Page - - - L'installer ne peut pas se connecter à la base données. - Impossible d'enregistrer le fichier web.config. Veuillez modifier la chaine de connection manuellement. - Votre base de données a été trouvée et est identifiée comme - Configuration de la base de données - - installer pour installer la base de données Umbraco %0% - ]]> - - Suivant pour continuer.]]> - - Base de données non trouvée! Veuillez vérifier que les informations de connexion à la base de données situées dans le fichier "web.config" sont correctes.

-

Pour se faire, veuillez éditer le fichier "web.config" (avec Visual Studio ou votre editeur texte préféré), ajouter la chaine de connexion à votre base dans la clé nommée "umbracoDbDSN" et enregister le fichier.

-

- Cliquez ensuite sur le bouton Réessayer.
- Plus d'information sur l'édition du web.config - ici .

]]>
- - - Veuillez contacter votre hébergeur si necessaire. - Si vous installez sur une machine locale ou un serveur vous pourriez avoir besoin d'informations de votre administrateur système.]]> - - - Cliquer sur le bouton Mettre à jour pour mettre à jour votre base de données pour Umbraco %0%

-

- Pas d'inquiétude - aucun contenu ne sera supprimé et tout continuera à fonctionner comme avant! -

- ]]>
- - Cliquer sur Suivant pour continuer. - ]]> - - Suivant pour poursuivre l'assistant d'installation]]> - Le password par défaut de l'utilisateur doit être modifié!]]> - L'utilisateur par défaut a été desactivé ou n'a pas l'autorisation d'accéder à Umbraco!

Aucune action supplémentaire n'est nécessaire. Cliquer sur Suivant pour continuer.]]> - Le mot de passe de l'utilisateur par défaut a été modifié avec succès depuis l'installation!

Aucune action supplémentaire n'est nécessaire. Cliquer sur Suivant pour continuer.]]> - Le mot de passe a été modifié! - umbraco crée un utilisateur par défaut avec un login ('admin') et un mot de passe ('default'). Il est important que le mot de passe soit changé pour quelquechose d'unique.

Cette étape va vérifier le mot de passe utilisateur par défaut et suggérer s'il est nécessaire de le changer.

]]>
- Prenez un bon départ, regardez nos vidéos d'introduction. - En cliquant sur le bouton suivant (ou en modifiant le paramètre umbracoConfigurationStatus dans le web.config), vous acceptez la licence d'utilisation de ce logiciel comme décrite dans la boite suivante. Veuillez noter que cette distribution d'Umbraco inclue 2 licence différentes, la licence open source "MIT license" pour le framework et la licence "umbraco freeware" qui couvre l'interface utilisateur. - Pas encore installé. - Liste des fichiers et répertoires modifiés - Plus d'information sur le paramétrage des permissions pour Umbraco ici - Vous devez accorder au processus du pool d'application de votre site l'autorisation de modification pour les fichiers/répertoire suivants - - Le paramètrage des permissions est presque parfait!

- vous devriez pouvoir lancer Umbraco sans rencontrer de problèmes, mais vous n'avez pas l'autorisation d'installer des packages qui sont pourtant recommandé pour tirer le maximum d'Umbraco.]]> -
- Comment résoudre - Cliquer ici pour lire la version texte - tutorial vidéo pour apprendre comment définir au mieux les permissions de fichiers pour Umbraco ou lisez la version texte.]]> - - Vos paramétrages de permissions fichiers peuvent poser des problèmes! -

- vous devriez pouvoir lancer Umbraco sans rencontrer de problèmes, mais vous n'avez pas l'autorisation de créer des repertoires ou d'installer des packages qui sont pourtant recommandé pour tirer le maximum d'Umbraco - ]]> -
- - Le paramétrage de vos permissions fichiers n'est pas adapté pour Umbraco! -

- Pour pouvoir lancer Umbraco, vous devez mettre à jour le paramétrages des permissions fichiers.]]> -
- - Votre paramétrage de permissions fichiers est parfait!

- Vous êtes prêt a lancer Umbradco et installer des packages!]]> -
- Problème de répertoire en cours de résolution - Cliquer sur ce lien pour plus d'information sur les problèmes liés à ASP.NET et la création de répertoire - Paramétrage des permissions fichiers - - - - I want to start from scratch' - - Voici comment procéder) - Vous pouvez aussi choisir d'installer Runway plus tard. Veuillez pour cela vous rendre dans la section Developer et choisir Packages. - ]]> - - Vous venez jsute de terminer l'installation d'une instance d'Umbraco. Que souhaitez-vous faire maintenant? - Runway a été installé avec succès - - - Voici une liste des modules que nous recommendons, vérifiez celui que vous souhcheck off the ones you would like to install, or view the full list of modules - ]]> - - Utilisateurs expérimentés seulement - Je veux commencer avec un site simple - - - "Runway" est site web simple fournissant quelques types de document simple et quelques templates. Le logiciel d'installation peut installer Runway pour vous automatiquement, - mais vous pouvez facilement l'editer, l'étendre ou le supprimer. Il n'est pas indisapensable et vous pouvez parfaitement utiliser Umbraco sans. Cependant, - Runway offre une bonne base basée sur des bonnes pratiques pour vous permettre de demarrer rapidement. - Si vous choisissez d'installer Runway, vous pouvez sélectionner un ensemble de briques appelée modules Runway pour personnaliser vos pages. -

- - Voici les éléments inclus dans Runway: Page d'accueil, page de mise en route, installation de module de page.
- Modules optionnels: Navigation principale, Plan du site, Contact, Gallerie. -
- ]]> -
- Qu'est ce que Runway - Etape 1/5 Accepter la licence - Etape 2/5: Configuration de la base de données - Etape 3/5: Validation des permissions fichiers - Etape 4/5: Vérification de la sécurité - Etape 5/5: Umbraco est prêt - Merci d'avoir choisi Umbraco - -Visitez votre nouveau site -Vous venez d'installer Runway, pourquoi ne pas voir à quoi il ressemble.]]> - - -Besoin d'aide et d'informations -Obtenez de l'aide de notre communauté, parcourez la documentation ou regarder quelques vidéos gratuites décrivant les meilleures pratiques pour construire un site simple, comment utiliser les packages et un guide sur les termes utilisés sur Umbraco]]> - - Umbraco %0% est installé et prêt à l'emploi - - le fichier /web.config et mettre à jour l'entrée AppSetting umbracoConfigurationStatus en dessous de la valeur de '%0%'.]]> - - commencer dès maintenant en cliquant sur le bouton "Lancer Umbraco" ci-dessous.
si vous êtes un nouvel utilisateur d'Umbraco, -vous pourrez trouver des tonnes de ressources sur nos pages de tutoriaux.]]> -
- - Lancer Umbraco -Pour gerer votre site, accéder simplement au back office et commencez à contribuer du contenu, modifiez les templates et ajoutez de nouvelle fonctionnalités]]> - - La connection à la base de données à échouée. - Umbraco Version 3 - Umbraco Version 4 - Visionner - - umbraco %0% pour une nouvelle installation ou une mise à jour depuis une version précédente. -

- Cliquez sur le bouton "suivant" pour demarrer l'assistant.]]> -
- - - Code culture - Nom de culture - - - Vous avez été deconnecté car vous êtes resté incatif trop longtemps - Authentifier vous de nouveau pour enregistrer votre travail - - - © 2001 - %0%
umbraco.org

]]>
- Bienvenue dans Umbraco, veuillez saisir votre nom d'utilisateur et votre mot de passe dans les champs ci-dessous: - - - Tableau de bord - Sections - Contenu - - - Choisissez une page ci-dessus... - %0% a été copié vers %1% - Copier vers - %0% a été déplacé vers %1% - Déplacer vers - a été selectionné à la racine de votre nouveau document, cliquer 'ok' ci-dessous. - Aucune node n'est sélectionnée pour l'instant; veuillez sélectionner une node dans la liste ci-dessus puis cliquez 'ok' - Le noeud actuel n'est pas permis en dessous du noeud choisi à cause de son type - Le noeud actuel ne peut pas être déplacé vers une de ses sous-pages - Cette action n'est pas autorisée car vos privilèges sont insuffisants sur un ou plusieurs document(s) enfants. - Lier les éléments copiés à l'original - - - Editer la notification pour %0% - - - - - Bonjour %0%

- -

Ceci est un email automatique pour vous informer que la tâche '%1%' - a été activée sur la page '%2%' - par l'utilisateur '%3%' -

- -

-

Update summary:

- - %6% -
-

- - - -

Bonne journée !

- Salutation du robot Umbraco -

]]> -
- [%0%] Notification sur %1% achevée sur %2% - Notifications - - - - - Lespackages umbraco ont une extension en ".umb" ou ".zip". - ]]> - - Auteur - Demonstration - Documentation - Meta données du package - Nom du package - Le package ne contient aucun élément - -
- Vous pouvez sans risque le supprimer de votre système en cliquant sur le bouton "Desinstaller le package" ci-dessous.]]> -
- Aucune mises à jour disponibles - Options du package - Informations sur le package - Dépot du package - Confirmer la suppression - Le package a été supprimé - Le package a été supprimé avec succès - Supprimer le package - - - Attention: tout document, media, etc ayant une dependance sur les éléments que vous allez supprimer, peuvent cesser de fonctionner ou conduire à des instabilités, - donc supprimer avec prudence. Si vous avez un doute contactez l'auteur du package.]]> - - Obtenir les mises à jour depuis le dépot - Mettre le package à jour - Instructions de mise à jour - Une mise à jour est disponible pour ce package. Vous pouvez la télécharger directment depuis le depot de packages Umbraco. - Version du package - Visitez le site du package. - - - Coller avec tout le formattage (Non recommandé) - Le texte que vous êtes en train de coller contient des caractères spéciaux ou est formatté de manière spéciale. Vous avez peut-être copié du texte de Microsoft Word. Umbraco peut enlever les caractères spéciaux ou les formats spéciaux automtiquement, donc le contenu collé sera plus lisible pour le web. - Coller comme texte brut sans aucun formattage - Coller, mais enlever le formattage spéciale (Recommandé) - - - Avancé: Protéger en sélectionnant un groupe de membres qui peut accéder à la page - utilisez les groupes de membres.]]> - Vous devez créer un groupe de membres avant de pouvoir utiliser l'authentification basée sur les rôles. - Page d'erreur - A utiliser quand les gens sont identifies mais n'ayant pas accès - Comment voulez-vous protéger votre page ? - %0% est maintenant protégé(e) - Protection supprimée pour %0% - Page de login - Choisissez la page qui a le formulaire d'autentifiaction - Enlever la protection - Séléctionnez la page contenant le formulaire d'authentification - Séléctionnez les roles qui peuvent accéder à cette page - Veuillez définir le nom d'utilisateur et le mot de passe pour accéder à cette page - Simple: Protéger avec un nom d'utilisateur et un mot de passe - Si vous désirez mettre en place une protection basée sur un nom d'utilisateur et un mot de passe unique - - - - - - - - - Inclure les pages enfants - Publication en cours - patience... - %0% page(s) sur %1% a/ont été(s) publiée(s)... - %0% a été publié - %0% et les sous-pages ont été publiées - Publier tous les enfants - - ok pour publier %0% et donc rendre ce contenu visible au public.

- Vous publier cette page et toutes ces sous-pages en cochant la case Publier tous les enfants ci-dessous. - ]]> -
- - - Ajouter un lien externe - Ajouter un lien interne - Ajouter un lien - Libellé - Page interne - Url - Descendre - Remonter - Ouvrir dans une nouvelle fenêtre - Supprimer le lien - - - Version actuelle - Le texte en Rouge ne sera pas affiché dans la version sélectionnée. , Le texte en vert signifie ajouté]]> - Le document a été restauré - Ceci affiche la version selectionnée sous forme html, si vous souhaitez voir les différences entre les 2 versions en même temps, utiliser la vue différence - Restaurer à - Choisir la version - Visualiser - - - Editer le fichier de script - - - Concierge - Contenu - Courier - Développeur - Assistant de configuration Umbraco - Media - Membres - Newsletters - Propriétés - Statistiques - Traduction - Utilisateurs - - - Modèle par défaut - Clé du dictionnaire - Pour importer un type de document, veuillez chercher le fichier ".udt" sur votre ordinateur en cliquant sur le bouton "Parcourir" et cliquez sur "Importer" (une confirmation vous sera demandée à l'écran suivant) - Nouveau titre de l'onglet - Type de noeud - Type - Feuille de style - Propriété de la feuille de style - Onglet - Titre de l'onglet - Onglets - Le type de contenu maître est activé - Utilisations du type de contenu - comme un type de contenu maître. Les onglets du type de contenu maître ne sont pas affichés et peuvent uniquement être édité via le type de contenu maître lui-même - - - Tri terminé - Ordornner les éléments par glisser/déposer. Vous pouvez également cliquer sur les titres de colonne pour trier un groupe d'éléments. -
Ne fermez pas cette fenêtre pendant le tri.]]>
- - - La publication a été annulée part un plugin tiers - Ce type de propriété existe déjà - Type de propriété créé - Type de données: %1%]]> - Type de propriété supprimé - Type de contnue sauvé - Onglet créer - Onglet supprimé - Onglet avec identifiant: %0% supprimé - Impossible d'enregistrer la feuille de style - La feuille de style a été enregistrée - La feuille de style a été enregistrée sans erreurs. - Type de données sauvé - L'élément du dictionnaire a été enregistré - La publication a échoué car le parent n'est pas publié - Contenu publié - et visible sur le site web - Contenu sauvé - N'oubliez pas de publier pour rendre les changements visibles - Envoyé pour approbation - Les modifications ont été envoyées pour approbation - Membre sauvé - Propriété de feuille de style sauvée - Feuille de style sauvée - Modèle sauvé - Une erreur est survenue lors de l'enregistrement de l'utilisateur (vérifiez le journal) - Utilisateur sauvé - le type d'utilisateur a été enregistré - Erreur d'enregistrement du fichier - Erreur d'enregistrement du fichier vérifier les permissions - Fichier enregistré. - Fichier enregistré sans erreur - Langue enregistré - Erreur d'enregistrement du scripte Python. - Une erreur est survenue lors de l'enregistrement du script Python - Script python enregistré ! - Aucune erreur dans le script python! - Une erreur est survenue lors de l'enregistrement du template - Veuillez vous assurer que vous n'avez pas 2 templates avec le même alias - Template enregistré - Le template a été enregistré avec succès! - Une erreur est survenue lors de l'enregistrement du fichier Xslt - Le fichier Xslt contient des erreurs - Le fichier Xslt n'a pas pu être enregistré, vérifier les permissions de fichiers - Fichier Xslt enregistré - Aucune erreur dans le fichier xslt! - Contenu non publié - Vue partielle enregistrée - Vue partielle enregistrée avec succès! - L'enregistrement de la vue partielle a échoué - Une erreur est survenue lors de l'enregistrement du fichier. - - - Utiliser la syntaxe CSS ex: h1, .redHeader, .blueTex - Editer la feuille de style - Editer la proppriété de la feuille de style - Nom permettant d'identifier la propriété dans l'editeur WYSIWYG - Prévisualiser - Styles - - - Editer le modèle - Inserer une zone de contenu - Inserer un modèle de zone de contenu - Insérer un élément de dictionnaire - Insérer une macro - Insérer un champs de page Umbraco - Modèle principal - Guide rapide des tags disponible dans un template de page - Modèle - - - Champ alternatif - Texte alternatif - Casse - Choisisez un champ - Convertir les retours à la ligne - Remplace les retours à la ligne par le tag html &lt;br&gt; - Champs personalisés - Oui, une date uniquement - Formater en date - Encoder en HTML - Remplace les caractères spéciaux (é,è,à, etc) par leur representation HTML. - Sera inséré après la valeur du champ - Sera inséré avant la valeur du champ - Miniscule - Aucune - Insérer après le champ - Insérer avant le champ - Recursif - Enlève les tags de paragraphe - Enlevera chaque tag &lt;P&gt; au début et à la fin du texte - Champs standards - Majuscule - Encodate de l'URL - Formatera les caractères spéciaux dans les urls - Sera uniquement utilisé quand les champs ci-dessus seront vides - Ce champ ne sera utilisé que si le champ principal est vide - Oui, avec l'heure. spérateur : - - - Tâches qui vous sont assignées - - qui vous sont assignées. Pour accéder à une vue détaillée des commentaires, veuillez cliquer sur "Details" ou sur le nom de la page.
- Vous pouvez télécharger la page au format XML en cliquant sur le lien "Télécharger au format XML" - Pour fermer un tâche de tradution, veuillez vous rendre sur la vue détaillée et cliquer sur le bouton "Fermer". - ]]> -
- Fermer la tâche - Détails de la traduction - Télécharger toutes les tâches de traduction au format XML - Télécharger au format XML - Télécharger la DTD au format XML - Champs - Incluere les pages enfant - - - - [%0%] Tâche de traduction pour %1% - Aucun utilisateur disposant des droits de traduction n'a été trouvé. Veuillez créer un utilisateur disposant de ce droit avant d'envoyer des demandes de traduction de contenu. - Tâches crées par vous - - crées par vous. Pour accéder à une vue détaillée incluant les commentaires, - cliquez sur "Détails" ou sur le nom de la page. Vous pouvez également télécharger la page au format XML en cliquant sur "Télécharger au format Xml". - Pour fermer un tâche de traduction, veuillez vous rendre sur la vue détaillée et cliquer sur le bouton "Fermer". - ]]> - - La page '%0%' a été envoyé pour traduction - Envoyer à la traduction - Assigné par - Tâches ouverte - Nombre total de mots - Traduire en - Traduction effectée. - Vous pouvez prévisualiser les pages que vous venez de traduire, en cliquant ci-dessous. Si la page originale existe, vous obtiendrez une comparaison des 2 pages. - La traduction a échouée, le fichier xml est surement corrompu - Options de traduction - Traducteur - Uploader le fichier de traduction XML - - - Cache navigateur - Corbeille - Packages crées - Types de données - Dictionnaire - Package(s) installé(s) - Installer un thème - Installer un kit de démarrage - Langues - Installer un package local - Macros - Types de média - Membres - Groupes - Rôles - Type de Membre - Types de Document - Packages - Packages - Fichiers python - Installer depuis le dépot - Installer Runway - Modules Runway - Fichiers de scripts - Scripts - Feuilles de style - Modèles - Fichiers XSLT - - - Nouvelle mise à jour prête - %0% est prêt(e), cliquez ici pour le téléchargement - Aucune connexion au serveur - Erreur de vérification de mise à jour. Allez voir les logs pour plus d'informations. - - - Administrateur - Champs catégorie - Modifier votre mot de passe - Modifier votre mot de passe - Confirmer votre nouveau mot de passe - Vous pouvez modifier votre mot de passe pour accéder au backoffice d'Umbraco en remplissant le formulaire ci-dessous et en cliquant sur le bouton 'Change Password' - Section contenu - Rediriger en mode edition live après l'authentification - Champ description - Désactiver l'utilisateur - Type de document - Editeur - Champ résumé - Langue - Login - Noeud de départ dans la librairie des Médias - Modules - Désactiver l'accès à Umbraco - Mot de passe - Votre password a bien été modifié! - Veuillez confirmer votre nouveau mot de passe - Veuillez saisir votre nouveau mot de passe - Votre nouveau mot de passe ne peut être vide!' - Password actuel - Password actuel invalide - Votre mot de passe et le mot de passe confirmé doivent être identiques. Veuillez recommencer! - Votre mot de passe confirmé new correspond pas à votre nouveau mot de passe! - Modifier les permissions des noeuds enfants - Vous êtes sur le point de modifier les permissions des pages: - Selectionnez les pages dont vous souhaitez modifier les permissions - Rechercher tous les enfants - Noeud de départ du contenu - Nom d'utilisateur - Permissions utilisateur - Type d'utilisateur - Types d'utilisateur - Rédacteur - -
+ + + + The umbraco community + http://umbraco.org/documentation/language-files + + + Gérer les noms d'hôtes + Information d'audition + Parcourir le noeud + Copier + Créer + Créer Package + Supprimer + Désactivé + Vider la corbeille + Exporter un type + Exporter en .NET + Exporter en .NET + Importer un type + Importer Package + Editer avec prévisualisation + Sortie + Déplacer + Notifications + Accès public + Publier + Dépublier + Rafraîchir + Republier le site en entier + Permissions + Restaurer + Envoyer pour publication + Envoyer pour traduction + Trier + Envoyer pour publication + Traduire + Mise à jour + + + Ajouter un nouveau domaine + Nom d'hôte invalide + Domaine + Le nouveau domaine '%0%' a été créé + Le domaine '%0%' est supprimé + Le domaine '%0%' a déjà été assigné + + + https://www.exemple.com/, exemple.com/en, etc... Utiliser * pour + répondre
à n'importe quel domaine et définissez la culture.]]> +
+ Le domaine '%0%' a été mis à jour + ou editer les domaines courants + + + Lecture en cours pour + + + Gras + Annuler l'indentation du paragraphe + Inserer un champ de formulaire + Bannière graphique principale + Editer l'Html + Indenter le paragraphe + Italique + Centrer + Justifié Gauche + Justifié Droit + Insérer un lien + Insérer un lien local (ancre) + Liste à puces + Liste numérique + Inserer une macro + Insérer une image + Editer les relations + Sauver + Sauver et publier + Envoyer et envoyer pour approbation + Prévisualiser + La prévisualisation est desactivée car aucun template n'a été assigné + Choisir un style + Montrer les styles + Inserer une table + + + A propos de cette page + Lien alternatif + (comment voulez-vous décrire l'image au dessus du téléphone) + Liens alternatifs + Cliquez pour éditer cet élément + Créé par + Créé le + Type de document + En cours d'édition + Supprimé le + Cet élément a été modifié après la publication + Cet élément n'est pas publié + Dernière publication + Types de média + Lien vers l'élément Média associé + Groupe de membres + Rôle + Types de membres + Aucune date choisie + Titre de la page + Propriétés + Ce document est publié mais n'est pas visible car le parent '%0%' n'est pas publié + Outch: ce document est publié mais absent du cache (erreur interne) + Publier + Statut de la publication + Publié le + Effacer la date + L'ordre de tri a été mis à jour + Pour trier les noeuds, vous pouvez simplement glisser et déplacer les noeuds ou cliquer sur un des titres de colonne. Vous pouvez sélectionner plusieurs noeuds en gardant la touche "MAJ" ou "Control" enfoncée lors de la sélection + Statistiques + Titre (option) + Type + Annuler la publication + Dernière modification + Supprimer le fichier + Lien vers le document + + + Où voulez-vous créer le nouveau %0% + Créer à + Choisissez un titre et un type + + + Parcourir votre site + - Masquer + Si umbraco ne s'ouvre pas, vous devez peut-être autoriser les popups pour ce site. + a ouvert une nouvelle fenêtre + Redémarrer + Visitez + Bienvenue + + + Nom + Gestion des domaines + Fermer cette fenêtre + Êtes-vous sur de supprimer + Êtes-vous sur de désactiver + Cocher cette case pour confirmer la suppression de %0% élément(s) + Êtes-vous sur ? + Êtes-vous sur? + Couper + Editer un élément du dictionnaire + Editer une langue + Insérer un lien local + Insérer un caractère + Insérer une image + Insérer une image + Insérer un lien + Insérer une macro + Insérer une table + Dernière modification + Lien + Lien international: + Lorsque vous utiliser des liens locaux, insérez un "#" devant le lient + Ouvrir dans une nouvelle fenêtre ? + Paramétrage de la macro + Cette macro ne contient pas de propriété editable + Coller + Editer les permissions pour + Votre corbeille est en train d'être vidée. Veuillez ne pas fermer cettre fenêtre tant que l'opération n'est pas terminée. + La corbeille est vide + Lorsque vous videz la corbeille, les objets s'y trouvant sont supprimés à jamais. + regexlib.com semble interrompu. Ce probleme n'est pas lié à Umbraco. Veuillez réessayer plus tard.]]> + + Retirez la macro + Champs obligatoire + Le site est ré-indexé + Le site a été republié. Tout le contenu publié est à jour. + Le cache du site sera rafraîchi. Tout le contenu publié sera mis à jour, et le contenue non publié restera non publié. + Nombre de colonnes + Nombre de lignes + + Définir un id pour le placeholder cela vous permet d'injecter du contenu dans le placeholder depuis un template enfant, + en référençant cet ID de la manière suivante <asp:content /> element.]]> + + + Séléctionnez un id de placeholder depuis la liste suivante. Vous pouvez + choisir l'id du template maitre.]]> + Cliquer sur l'image pour voir l'original + Choisir un élément + Voir un élemant du Cache + + + + %0%'
Vous pouvez ajouter des langues dans la section 'Langues' du menu de gauche. + ]]>
+ Nom de la culture + + + Types de noeuds enfants permis + Créer + Supprimer l'onglet + Description + Nouvel onglet + Onglet + Miniature + + + Ajouter un couple clé / valeur + Type de données en base de données + Identifiant unique de l'éditeur de données + Prévisualiser le contenu du control + Boutons + Activer les paramètres avancés + Activer le menu contextuel + Taille maximum par défaut des images insérées + Feuille de style associée + Afficher le nom du champs + Largeur et hauteur + + + Vos données ont été enregistrée, avant de pouvoir publier la page vous devez corriger les erreurs suivantes : + Le fournisseur d'authentification n'autorise pas le changement de mot de passe(EnablePasswordRetrieval doit être paramétré à true dans le web.config)' + %0% existe déjà + Des erreurs se sont produites : + Des erreurs se sont produites : + Le mot de passe doit contenir un minimum de %0% caractères et en contenir au moins %1% qui soit non alphanumérique(s)' + %0% doit être un entier + %0% à %1% est un champ obligatoire + %0% est un champ obligatoire + %0% à %1% n'a pas un format correct + %0% n'a pas un format correct + + + ATTENTION! Même si 'CodeMirror' est activé via la configuration, il reste desactivé dans Internet Explorer car il n'est pas encore assez stable. + Veuillez remplir l'alias et le nom pour les nouveaux types de propriétés ! + Il y a un probleme de droit d'accès en lecture/écriture sur un fichier ou un dossier spécifique + Entrez un titre + Choisissez un type + Vous allez élargir la photo par rapport à sa taille originale. Êtes-vous sur de vouloir contnier ? + Erreur dans le script python + Le script python n'a pas été sauvé, car il contient une ou des erreurs + Noeud de départ supprimé, contactez votre administrateur + Veuillez marquer le contenu avant de changer le style + Aucun style actif disponible + Placez le curseur à gauche des deux cellules que vous voulez fusionner + Vous ne pouvez pas diviser une cellule qui n'a pas été fusionnée. + Erreur dans la source xslt + Le fichier XSLT n'a pas été sauvé car il contient une ou des erreurs + + + A propos + Action + Ajouter + Alias + Êtes-vou sur? + Bordure + ou + Annuler + Marge cellule + Choisir + Fermer + Fermer la fenêtre + Commentaire + Confirmer + Respecter les proportions + Continuer + Copier + Créer + Base de données + Date + Defaut + Supprimer + Supprimé + Suppression en cours... + Design + Taille + Bas + Télécharger + Editer + Edité + Eléments + E-mail + Erreur + Trouver + Hauteur + Aide + Icône + Importer + Marge interne + Insérer + Installer + Justifié + Langue + Mise en page + Chargement en cours + Verrouillé + Login + Se déconnecter + Se déconnecter + Macro + Déplacer + Nom + Nouveau + Suivant + Non + de + OK + Ouvrir + ou + Mot de passe + Chemin + Placeholder ID + Un moment svp... + Précédent + Propriétés + Formulaire de données Email à recevoir + Corbeille + Restant + Renommer + Renvoyer + Réessayer + Permissions + Rechercher + Serveur + Montrer + Afficher la page à l'envoi + Taille + Trier + Type + Je cherche... + Haut + Mise à jour + Mettre à jour + Uploader + Adresse + Utilisateur + Nom d'utilisateur + Valeur + Voir + Bienvenue... + Largeur + Oui + Répertoire + + + Couleur de fond + Gras + Couleur du texte + Police + Texte + + + Page + + + L'installer ne peut pas se connecter à la base données. + Impossible d'enregistrer le fichier web.config. Veuillez modifier la chaine de connection manuellement. + Votre base de données a été trouvée et est identifiée comme + Configuration de la base de données + + installer pour installer la base de données Umbraco %0% + ]]> + + Suivant pour continuer.]]> + + Base de données non trouvée! Veuillez vérifier que les informations de connexion à la base de données situées dans le fichier "web.config" sont correctes.

+

Pour se faire, veuillez éditer le fichier "web.config" (avec Visual Studio ou votre editeur texte préféré), ajouter la chaine de connexion à votre base dans la clé nommée "umbracoDbDSN" et enregister le fichier.

+

+ Cliquez ensuite sur le bouton Réessayer.
+ Plus d'information sur l'édition du web.config + ici .

]]>
+ + + Veuillez contacter votre hébergeur si necessaire. + Si vous installez sur une machine locale ou un serveur vous pourriez avoir besoin d'informations de votre administrateur système.]]> + + + Cliquer sur le bouton Mettre à jour pour mettre à jour votre base de données pour Umbraco %0%

+

+ Pas d'inquiétude - aucun contenu ne sera supprimé et tout continuera à fonctionner comme avant! +

+ ]]>
+ + Cliquer sur Suivant pour continuer. + ]]> + + Suivant pour poursuivre l'assistant d'installation]]> + Le password par défaut de l'utilisateur doit être modifié!]]> + L'utilisateur par défaut a été desactivé ou n'a pas l'autorisation d'accéder à Umbraco!

Aucune action supplémentaire n'est nécessaire. Cliquer sur Suivant pour continuer.]]> + Le mot de passe de l'utilisateur par défaut a été modifié avec succès depuis l'installation!

Aucune action supplémentaire n'est nécessaire. Cliquer sur Suivant pour continuer.]]> + Le mot de passe a été modifié! + umbraco crée un utilisateur par défaut avec un login ('admin') et un mot de passe ('default'). Il est important que le mot de passe soit changé pour quelquechose d'unique.

Cette étape va vérifier le mot de passe utilisateur par défaut et suggérer s'il est nécessaire de le changer.

]]>
+ Prenez un bon départ, regardez nos vidéos d'introduction. + En cliquant sur le bouton suivant (ou en modifiant le paramètre umbracoConfigurationStatus dans le web.config), vous acceptez la licence d'utilisation de ce logiciel comme décrite dans la boite suivante. Veuillez noter que cette distribution d'Umbraco inclue 2 licence différentes, la licence open source "MIT license" pour le framework et la licence "umbraco freeware" qui couvre l'interface utilisateur. + Pas encore installé. + Liste des fichiers et répertoires modifiés + Plus d'information sur le paramétrage des permissions pour Umbraco ici + Vous devez accorder au processus du pool d'application de votre site l'autorisation de modification pour les fichiers/répertoire suivants + + Le paramètrage des permissions est presque parfait!

+ vous devriez pouvoir lancer Umbraco sans rencontrer de problèmes, mais vous n'avez pas l'autorisation d'installer des packages qui sont pourtant recommandé pour tirer le maximum d'Umbraco.]]> +
+ Comment résoudre + Cliquer ici pour lire la version texte + tutorial vidéo pour apprendre comment définir au mieux les permissions de fichiers pour Umbraco ou lisez la version texte.]]> + + Vos paramétrages de permissions fichiers peuvent poser des problèmes! +

+ vous devriez pouvoir lancer Umbraco sans rencontrer de problèmes, mais vous n'avez pas l'autorisation de créer des repertoires ou d'installer des packages qui sont pourtant recommandé pour tirer le maximum d'Umbraco + ]]> +
+ + Le paramétrage de vos permissions fichiers n'est pas adapté pour Umbraco! +

+ Pour pouvoir lancer Umbraco, vous devez mettre à jour le paramétrages des permissions fichiers.]]> +
+ + Votre paramétrage de permissions fichiers est parfait!

+ Vous êtes prêt a lancer Umbradco et installer des packages!]]> +
+ Problème de répertoire en cours de résolution + Cliquer sur ce lien pour plus d'information sur les problèmes liés à ASP.NET et la création de répertoire + Paramétrage des permissions fichiers + + + + I want to start from scratch' + + Voici comment procéder) + Vous pouvez aussi choisir d'installer Runway plus tard. Veuillez pour cela vous rendre dans la section Developer et choisir Packages. + ]]> + + Vous venez jsute de terminer l'installation d'une instance d'Umbraco. Que souhaitez-vous faire maintenant? + Runway a été installé avec succès + + + Voici une liste des modules que nous recommendons, vérifiez celui que vous souhcheck off the ones you would like to install, or view the full list of modules + ]]> + + Utilisateurs expérimentés seulement + Je veux commencer avec un site simple + + + "Runway" est site web simple fournissant quelques types de document simple et quelques templates. Le logiciel d'installation peut installer Runway pour vous automatiquement, + mais vous pouvez facilement l'editer, l'étendre ou le supprimer. Il n'est pas indisapensable et vous pouvez parfaitement utiliser Umbraco sans. Cependant, + Runway offre une bonne base basée sur des bonnes pratiques pour vous permettre de demarrer rapidement. + Si vous choisissez d'installer Runway, vous pouvez sélectionner un ensemble de briques appelée modules Runway pour personnaliser vos pages. +

+ + Voici les éléments inclus dans Runway: Page d'accueil, page de mise en route, installation de module de page.
+ Modules optionnels: Navigation principale, Plan du site, Contact, Gallerie. +
+ ]]> +
+ Qu'est ce que Runway + Etape 1/5 Accepter la licence + Etape 2/5: Configuration de la base de données + Etape 3/5: Validation des permissions fichiers + Etape 4/5: Vérification de la sécurité + Etape 5/5: Umbraco est prêt + Merci d'avoir choisi Umbraco + +Visitez votre nouveau site +Vous venez d'installer Runway, pourquoi ne pas voir à quoi il ressemble.]]> + + +Besoin d'aide et d'informations +Obtenez de l'aide de notre communauté, parcourez la documentation ou regarder quelques vidéos gratuites décrivant les meilleures pratiques pour construire un site simple, comment utiliser les packages et un guide sur les termes utilisés sur Umbraco]]> + + Umbraco %0% est installé et prêt à l'emploi + + le fichier /web.config et mettre à jour l'entrée AppSetting umbracoConfigurationStatus en dessous de la valeur de '%0%'.]]> + + commencer dès maintenant en cliquant sur le bouton "Lancer Umbraco" ci-dessous.
si vous êtes un nouvel utilisateur d'Umbraco, +vous pourrez trouver des tonnes de ressources sur nos pages de tutoriaux.]]> +
+ + Lancer Umbraco +Pour gerer votre site, accéder simplement au back office et commencez à contribuer du contenu, modifiez les templates et ajoutez de nouvelle fonctionnalités]]> + + La connection à la base de données à échouée. + Umbraco Version 3 + Umbraco Version 4 + Visionner + + umbraco %0% pour une nouvelle installation ou une mise à jour depuis une version précédente. +

+ Cliquez sur le bouton "suivant" pour demarrer l'assistant.]]> +
+ + + Code culture + Nom de culture + + + Vous avez été deconnecté car vous êtes resté incatif trop longtemps + Authentifier vous de nouveau pour enregistrer votre travail + + + © 2001 - %0%
umbraco.org

]]>
+ Bienvenue dans Umbraco, veuillez saisir votre nom d'utilisateur et votre mot de passe dans les champs ci-dessous: + + + Tableau de bord + Sections + Contenu + + + Choisissez une page ci-dessus... + %0% a été copié vers %1% + Copier vers + %0% a été déplacé vers %1% + Déplacer vers + a été selectionné à la racine de votre nouveau document, cliquer 'ok' ci-dessous. + Aucune node n'est sélectionnée pour l'instant; veuillez sélectionner une node dans la liste ci-dessus puis cliquez 'ok' + Le noeud actuel n'est pas permis en dessous du noeud choisi à cause de son type + Le noeud actuel ne peut pas être déplacé vers une de ses sous-pages + Cette action n'est pas autorisée car vos privilèges sont insuffisants sur un ou plusieurs document(s) enfants. + Lier les éléments copiés à l'original + + + Editer la notification pour %0% + + + + + Bonjour %0%

+ +

Ceci est un email automatique pour vous informer que la tâche '%1%' + a été activée sur la page '%2%' + par l'utilisateur '%3%' +

+ +

+

Update summary:

+ + %6% +
+

+ + + +

Bonne journée !

+ Salutation du robot Umbraco +

]]> +
+ [%0%] Notification sur %1% achevée sur %2% + Notifications + + + + + Lespackages umbraco ont une extension en ".umb" ou ".zip". + ]]> + + Auteur + Demonstration + Documentation + Meta données du package + Nom du package + Le package ne contient aucun élément + +
+ Vous pouvez sans risque le supprimer de votre système en cliquant sur le bouton "Desinstaller le package" ci-dessous.]]> +
+ Aucune mises à jour disponibles + Options du package + Informations sur le package + Dépot du package + Confirmer la suppression + Le package a été supprimé + Le package a été supprimé avec succès + Supprimer le package + + + Attention: tout document, media, etc ayant une dependance sur les éléments que vous allez supprimer, peuvent cesser de fonctionner ou conduire à des instabilités, + donc supprimer avec prudence. Si vous avez un doute contactez l'auteur du package.]]> + + Obtenir les mises à jour depuis le dépot + Mettre le package à jour + Instructions de mise à jour + Une mise à jour est disponible pour ce package. Vous pouvez la télécharger directment depuis le depot de packages Umbraco. + Version du package + Visitez le site du package. + + + Coller avec tout le formattage (Non recommandé) + Le texte que vous êtes en train de coller contient des caractères spéciaux ou est formatté de manière spéciale. Vous avez peut-être copié du texte de Microsoft Word. Umbraco peut enlever les caractères spéciaux ou les formats spéciaux automtiquement, donc le contenu collé sera plus lisible pour le web. + Coller comme texte brut sans aucun formattage + Coller, mais enlever le formattage spéciale (Recommandé) + + + Avancé: Protéger en sélectionnant un groupe de membres qui peut accéder à la page + utilisez les groupes de membres.]]> + Vous devez créer un groupe de membres avant de pouvoir utiliser l'authentification basée sur les rôles. + Page d'erreur + A utiliser quand les gens sont identifies mais n'ayant pas accès + Comment voulez-vous protéger votre page ? + %0% est maintenant protégé(e) + Protection supprimée pour %0% + Page de login + Choisissez la page qui a le formulaire d'autentifiaction + Enlever la protection + Séléctionnez la page contenant le formulaire d'authentification + Séléctionnez les roles qui peuvent accéder à cette page + Veuillez définir le nom d'utilisateur et le mot de passe pour accéder à cette page + Simple: Protéger avec un nom d'utilisateur et un mot de passe + Si vous désirez mettre en place une protection basée sur un nom d'utilisateur et un mot de passe unique + + + + + + + + + Inclure les pages enfants + Publication en cours - patience... + %0% page(s) sur %1% a/ont été(s) publiée(s)... + %0% a été publié + %0% et les sous-pages ont été publiées + Publier tous les enfants + + ok pour publier %0% et donc rendre ce contenu visible au public.

+ Vous publier cette page et toutes ces sous-pages en cochant la case Publier tous les enfants ci-dessous. + ]]> +
+ + + Ajouter un lien externe + Ajouter un lien interne + Ajouter un lien + Libellé + Page interne + Url + Descendre + Remonter + Ouvrir dans une nouvelle fenêtre + Supprimer le lien + + + Version actuelle + Le texte en Rouge ne sera pas affiché dans la version sélectionnée. , Le texte en vert signifie ajouté]]> + Le document a été restauré + Ceci affiche la version selectionnée sous forme html, si vous souhaitez voir les différences entre les 2 versions en même temps, utiliser la vue différence + Restaurer à + Choisir la version + Visualiser + + + Editer le fichier de script + + + Concierge + Contenu + Courier + Développeur + Assistant de configuration Umbraco + Media + Membres + Newsletters + Propriétés + Statistiques + Traduction + Utilisateurs + + + Modèle par défaut + Clé du dictionnaire + Pour importer un type de document, veuillez chercher le fichier ".udt" sur votre ordinateur en cliquant sur le bouton "Parcourir" et cliquez sur "Importer" (une confirmation vous sera demandée à l'écran suivant) + Nouveau titre de l'onglet + Type de noeud + Type + Feuille de style + Propriété de la feuille de style + Onglet + Titre de l'onglet + Onglets + Le type de contenu maître est activé + Utilisations du type de contenu + comme un type de contenu maître. Les onglets du type de contenu maître ne sont pas affichés et peuvent uniquement être édité via le type de contenu maître lui-même + + + Tri terminé + Ordornner les éléments par glisser/déposer. Vous pouvez également cliquer sur les titres de colonne pour trier un groupe d'éléments. +
Ne fermez pas cette fenêtre pendant le tri.]]>
+ + + La publication a été annulée part un plugin tiers + Ce type de propriété existe déjà + Type de propriété créé + Type de données: %1%]]> + Type de propriété supprimé + Type de contnue sauvé + Onglet créer + Onglet supprimé + Onglet avec identifiant: %0% supprimé + Impossible d'enregistrer la feuille de style + La feuille de style a été enregistrée + La feuille de style a été enregistrée sans erreurs. + Type de données sauvé + L'élément du dictionnaire a été enregistré + La publication a échoué car le parent n'est pas publié + Contenu publié + et visible sur le site web + Contenu sauvé + N'oubliez pas de publier pour rendre les changements visibles + Envoyé pour approbation + Les modifications ont été envoyées pour approbation + Membre sauvé + Propriété de feuille de style sauvée + Feuille de style sauvée + Modèle sauvé + Une erreur est survenue lors de l'enregistrement de l'utilisateur (vérifiez le journal) + Utilisateur sauvé + le type d'utilisateur a été enregistré + Erreur d'enregistrement du fichier + Erreur d'enregistrement du fichier vérifier les permissions + Fichier enregistré. + Fichier enregistré sans erreur + Langue enregistré + Erreur d'enregistrement du scripte Python. + Une erreur est survenue lors de l'enregistrement du script Python + Script python enregistré ! + Aucune erreur dans le script python! + Une erreur est survenue lors de l'enregistrement du template + Veuillez vous assurer que vous n'avez pas 2 templates avec le même alias + Template enregistré + Le template a été enregistré avec succès! + Une erreur est survenue lors de l'enregistrement du fichier Xslt + Le fichier Xslt contient des erreurs + Le fichier Xslt n'a pas pu être enregistré, vérifier les permissions de fichiers + Fichier Xslt enregistré + Aucune erreur dans le fichier xslt! + Contenu non publié + Vue partielle enregistrée + Vue partielle enregistrée avec succès! + L'enregistrement de la vue partielle a échoué + Une erreur est survenue lors de l'enregistrement du fichier. + + + Utiliser la syntaxe CSS ex: h1, .redHeader, .blueTex + Editer la feuille de style + Editer la proppriété de la feuille de style + Nom permettant d'identifier la propriété dans l'editeur WYSIWYG + Prévisualiser + Styles + + + Editer le modèle + Inserer une zone de contenu + Inserer un modèle de zone de contenu + Insérer un élément de dictionnaire + Insérer une macro + Insérer un champs de page Umbraco + Modèle principal + Guide rapide des tags disponible dans un template de page + Modèle + + + Champ alternatif + Texte alternatif + Casse + Choisisez un champ + Convertir les retours à la ligne + Remplace les retours à la ligne par le tag html &lt;br&gt; + Champs personalisés + Oui, une date uniquement + Formater en date + Encoder en HTML + Remplace les caractères spéciaux (é,è,à, etc) par leur representation HTML. + Sera inséré après la valeur du champ + Sera inséré avant la valeur du champ + Miniscule + Aucune + Insérer après le champ + Insérer avant le champ + Recursif + Enlève les tags de paragraphe + Enlevera chaque tag &lt;P&gt; au début et à la fin du texte + Champs standards + Majuscule + Encodate de l'URL + Formatera les caractères spéciaux dans les urls + Sera uniquement utilisé quand les champs ci-dessus seront vides + Ce champ ne sera utilisé que si le champ principal est vide + Oui, avec l'heure. spérateur : + + + Tâches qui vous sont assignées + + qui vous sont assignées. Pour accéder à une vue détaillée des commentaires, veuillez cliquer sur "Details" ou sur le nom de la page.
+ Vous pouvez télécharger la page au format XML en cliquant sur le lien "Télécharger au format XML" + Pour fermer un tâche de tradution, veuillez vous rendre sur la vue détaillée et cliquer sur le bouton "Fermer". + ]]> +
+ Fermer la tâche + Détails de la traduction + Télécharger toutes les tâches de traduction au format XML + Télécharger au format XML + Télécharger la DTD au format XML + Champs + Incluere les pages enfant + + + + [%0%] Tâche de traduction pour %1% + Aucun utilisateur disposant des droits de traduction n'a été trouvé. Veuillez créer un utilisateur disposant de ce droit avant d'envoyer des demandes de traduction de contenu. + Tâches crées par vous + + crées par vous. Pour accéder à une vue détaillée incluant les commentaires, + cliquez sur "Détails" ou sur le nom de la page. Vous pouvez également télécharger la page au format XML en cliquant sur "Télécharger au format Xml". + Pour fermer un tâche de traduction, veuillez vous rendre sur la vue détaillée et cliquer sur le bouton "Fermer". + ]]> + + La page '%0%' a été envoyé pour traduction + Envoyer à la traduction + Assigné par + Tâches ouverte + Nombre total de mots + Traduire en + Traduction effectée. + Vous pouvez prévisualiser les pages que vous venez de traduire, en cliquant ci-dessous. Si la page originale existe, vous obtiendrez une comparaison des 2 pages. + La traduction a échouée, le fichier xml est surement corrompu + Options de traduction + Traducteur + Uploader le fichier de traduction XML + + + Cache navigateur + Corbeille + Packages crées + Types de données + Dictionnaire + Package(s) installé(s) + Installer un thème + Installer un kit de démarrage + Langues + Installer un package local + Macros + Types de média + Membres + Groupes + Rôles + Type de Membre + Types de Document + Packages + Packages + Fichiers python + Installer depuis le dépot + Installer Runway + Modules Runway + Fichiers de scripts + Scripts + Feuilles de style + Modèles + Fichiers XSLT + + + Nouvelle mise à jour prête + %0% est prêt(e), cliquez ici pour le téléchargement + Aucune connexion au serveur + Erreur de vérification de mise à jour. Allez voir les logs pour plus d'informations. + + + Administrateur + Champs catégorie + Modifier votre mot de passe + Modifier votre mot de passe + Confirmer votre nouveau mot de passe + Vous pouvez modifier votre mot de passe pour accéder au backoffice d'Umbraco en remplissant le formulaire ci-dessous et en cliquant sur le bouton 'Change Password' + Section contenu + Rediriger en mode edition live après l'authentification + Champ description + Désactiver l'utilisateur + Type de document + Editeur + Champ résumé + Langue + Login + Noeud de départ dans la librairie des Médias + Modules + Désactiver l'accès à Umbraco + Mot de passe + Votre password a bien été modifié! + Veuillez confirmer votre nouveau mot de passe + Veuillez saisir votre nouveau mot de passe + Votre nouveau mot de passe ne peut être vide!' + Password actuel + Password actuel invalide + Votre mot de passe et le mot de passe confirmé doivent être identiques. Veuillez recommencer! + Votre mot de passe confirmé new correspond pas à votre nouveau mot de passe! + Modifier les permissions des noeuds enfants + Vous êtes sur le point de modifier les permissions des pages: + Selectionnez les pages dont vous souhaitez modifier les permissions + Rechercher tous les enfants + Noeud de départ du contenu + Nom d'utilisateur + Permissions utilisateur + Type d'utilisateur + Types d'utilisateur + Rédacteur + +
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml index dbf19ab100..0b3e9b54d8 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml @@ -498,7 +498,7 @@ To manage your website, simply open the umbraco back office and start adding con Hi %0%

This is an automated mail to inform you that the task '%1%' - has been performed on the page '%2%' + has been performed on the page '%2%' by the user '%3%'

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml index 65ad6abb02..0a1370fbf3 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml @@ -1,851 +1,851 @@ - - - - The umbraco community - http://umbraco.org/documentation/language-files - - - Gestisci hostnames - Audit Trail - Sfoglia - Copia - Crea - Crea pacchetto - Cancella - Disabilita - Svuota il cestino - Esporta il tipo di documento - Importa il tipo di documento - Importa il pacchetto - Modifica in Area di Lavoro - Uscita - Sposta - Notifiche - Accesso pubblico - Pubblica - Aggiorna nodi - Ripubblica intero sito - Permessi - Annulla ultima modifica - Invia per la pubblicazione - Invia per la traduzione - Ordina - Invia la pubblicazione - Traduci - Annulla pubblicazione - Aggiorna - - - Aggiungi nuovo dominio - Dominio - - - - - - Hostname non valido - Modifica il dominio corrente - - - Visualizzazione per - - - Grassetto - Cancella rientro paragrafo - Inserisci dal file - Inserisci intestazione grafica - Modifica Html - Inserisci rientro paragrafo - Corsivo - Centra - Allinea testo a sinistra - Allinea testo a destra - Inserisci Link - Inserisci local link (ancora) - Elenco puntato - Elenco numerato - Inserisci macro - Inserisci immagine - Modifica relazioni - Salva - Salva e pubblica - Salva e invia per approvazione - Anteprima - - Scegli lo stile - Mostra gli stili - Inserisci tabella - - - Informazioni su questa pagina - Link alternativo - - Links alternativi - Clicca per modificare questo elemento - Creato da - Creato il - Tipo di documento - Modifica - Attivo fino al - - - Ultima pubblicazione - Link ai media - Tipo di media - Gruppo di membri - Ruolo - Tipologia Membro - - Titolo della Pagina - - - Pubblicato - Stato della pubblicazione - Pubblicato il - Rimuovi data - Ordinamento dei nodi aggiornato - - Statistiche - Titolo (opzionale) - Tipo - Non pubblicato - Ultima modifica - Rimuovi il file - Link al documento - - - - Crea al - Scegli il tipo ed il titolo - - - - - - hai aperto una nuova finestra - Riavvia - Visita - Benvenuto - - - Nome - Gestione alias Hostnames - Chiudi questa finestra - - - - - - Taglia - Modifica elemento Dictionary - Modifica il linguaggio - Inserisci il link locale - Inserisci carattere - - - Inserisci link - Inserisci macro - Inserisci tabella - Ultima modifica - Link - - - - Impostazioni Macro - - Incolla - Modifica il Permesso per - - - - regexlib.com ha attualmente qualche problema, di cui non abbiamo il controllo. Siamo spiacevoli dell'inconveniente.]]> - - Elimina Macro - Campo obbligatorio - - - - Numero di colonne - Numero di righe - Imposta identificativo del placeholder. Settando tale ID puoi inserire il contenuto in questo template dai template figli, facendo riferimento a questo ID usando il codice <asp:content />.]]> - Seleziona Identificativo del placeholder dalla lista seguente. Puoi scegliere solo l'ID appartenente al template master corrente.]]> - - Seleziona elemento - Visualizza gli elementi in cache - - - - - - - Possibili nodetypes figli - Crea - Cancella tab - Descrizione - Nuova tab - Tab - Miniatura - - - - - - Rendering controllo - Bottoni - Abilita impostazioni avanzate per - Abilita menu contestuale - Dimensione massima delle immagini inserite - Fogli di stile collegati - Visualizza etichetta - Larghezza e altezza - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Info - Azione - Aggiungi - Alias - - Bordo - o - Annulla - - Scegli - Chiudi - Chiudi la finestra - Commento - Conferma - Blocca le proporzioni - Continua - Copia - Crea - Base di dati - Data - Default - Elimina - Eliminato - Elimina... - Design - Dimensioni - - Scarica - Modifica - Modificato - Elementi - Email - Errore - Trova - Cartella - Altezza - Aiuto - Icona - Importa - - Inserisci - Installa - Giustificato - Lingua - Layout - Caricamento - Bloccato - Login - Log off - Logout - Macro - Sposta - Nome - Nuovo - Successivo - No - di - Ok - Apri - o - Password - Percorso - - - Precedente - - - Cestino - Rimangono - Rinomina - Rinnova - Riprova - Permessi - Cerca - Server - Mostra - Mostra la pagina inviata - Dimensione - Ordina - Tipo - - Su - Aggiorna - Aggiornamento - Carica - Url - Utente - - Valore - Vedi - Benvenuto... - Larghezza - Si - - - Colore di sfondo - Grassetto - Colore del testo - Carattere - Testo - - - Pagina - - - - - - - installa per installare il database Umbraco %0% ]]> - Avanti per proseguire.]]> - - Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.

-

Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.

Clicca il tasto riprova quando hai finito.
Maggiori dettagli per la modifica del file web.config qui.

]]> -
- - Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%

Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!

]]>
- Premi il tasto Avanti per continuare.]]> - Avanti per continuare la configurazione.]]> - La password predefinita per l'utente di default deve essere cambiata!]]> - L'utente di default è stato disabilitato o non ha accesso ad Umbraco!

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> - La password è stata modificata con successo

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> - - Umbraco crea un utente ('admin')predefinito e password ('default'). E' importante modificare la password con una personale.

Questo passaggio controlla la password predefinita e ricorda, se necessario, di modificarla.

]]>
- - - - - - - Le impostazioni dei permessi sono perfette!

Puoi eseguire umbraco senza problemi, ma potresti non poter installare i pacchetti che sono consigliati per sfruttare tutti i vantaggi offerti da Umbraco.]]>
- - - video tutorial su come impostare i permessi delle cartelle per Umbraco o leggi la versione testuale.]]> - Le impostazioni dei permessi potrebbero avere dei problemi!

Puoi eseguire Umbraco, ma potresti non essere in grado di creare cartelle o installare pacchetti che sono raccomandati per sfruttare tutti i vantaggi di Umbraco.]]>
- Le impostazioni dei permessi non sono corrette per Umbraco!

Per eseguire Umbraco, devi aggiornare le impostazioni dei permessi.]]>
- La configurazione dei permessi è perfetta!

Sei pronto per avviare Umbraco e installare i pacchetti!]]>
- - - - - - Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]> - - Runway è installato - - Questa è la lista dei nostri moduli raccomandati, seleziona quali vorresti installare, o vedi l'intera lista di moduli - ]]> - Raccommandato solo per utenti esperti - Vorrei iniziare da un sito semplice - - "Runway" è un semplice sito web contenente alcuni tipi di documento e alcuni templates di base. L'installer configurerà Runway per te automaticamente, - ma tu potrai facilmente modificarlo, estenderlo o eliminarlo. Non è necessario installarlo e potrai usare Umbraco anche senza di esso, ma - Runway ti offre le basi e le best practices per cominciare velocemente. - Se sceglierai di installare Runway, volendo potrai anche selezionare i moduli di Runway per migliorare le pagine. -

- - Inclusi in Runway: Home page, pagina Guida introduttiva, pagina Installazione moduli
- Moduli opzionali: Top Navigation, Sitemap, Contatti, Gallery. -
- ]]>
- Cosa è Runway - Passo 1/5 Accettazione licenza - Passo 2/5: Configurazione database - Passo 3/5: Controllo permessi dei file - Passo 4/5: Controllo impostazioni sicurezza - Passo 5/5: Umbraco è pronto per iniziare - Grazie per aver scelto Umbraco - Naviga per il tuo nuovo sito -Hai installato Runway, quindi perché non dare uno sguardo al vostro nuovo sito web.]]> - Ulteriori informazioni e assistenza -Fatti aiutare dalla nostra community, consulta la documentazione o guarda alcuni video gratuiti su come costruire un semplice sito web, come usare i pacchetti e una guida rapida alla terminologia Umbraco]]> - - /web.config e aggiornare la chiave AppSetting umbracoConfigurationStatus impostando il valore '%0%'.]]> - - iniziare immediatamente cliccando sul bottone "Avvia Umbraco".
Se sei nuovo a Umbraco, si possono trovare un sacco di risorse sulle nostre pagine Getting Started.]]>
- - Avvia Umbraco -Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e iniziare ad aggiungere i contenuti, aggiornando i modelli e i fogli di stile o aggiungere nuove funzionalità]]> - Connessione al database non riuscita. - Umbraco Versione 3 - Umbraco Versione 4 - Guarda - Umbraco %0% per una nuova installazione o per l'aggiornamento dalla versione 3.0. -

- Clicca "avanti" per avviare la procedura.]]>
- - - Codice cultura - Nome cultura - - - - Riconnetti adesso per salvare il tuo lavoro - - - © 2001 - %0%
umbraco.org

]]>
- Benvenuti in Umbraco, digita il tuo username e la tua password nelle caselle seguenti: - - - Dashboard - Sezioni - Contenuto - - - Scegli la pagina sopra... - - Seleziona dove il documento %0% deve essere copiato - - Seleziona dove il documento %0% deve essere spostato - - - - - - - - - - - - Salve %0%

- -

Questa è un'email automatica per informare che l'azione '%1%' - è stata eseguita sulla pagina '%2%' - dall'utente '%3%' -

- -

-

Riepilogo aggiornamento:

- - %6% -
-

- - - -

Buona giornata!

- Grazie da Umbraco -

]]>
- [%0%] Notifica per %1% eseguita su %2% - Notifiche - - - - e selezionando il pacchetto. I pacchetti Umbraco generalmente hanno l'estensione ".umb" o ".zip". - ]]> - Autore - Dimostrazione - Documentazione - Meta dati pacchetto - Nome del pacchetto - Il pacchetto non contiene tutti gli elementi -
- E' possibile rimuovere questo pacchetto dal sistema cliccando "rimuovi pacchetto" in basso.]]>
- Non ci sono aggiornamenti disponibili - Opzioni pacchetto - Pacchetto leggimi - Pacchetto repository - Conferma eliminazione - - - Disinstalla pacchetto - - Avviso: tutti i documenti, i media, etc a seconda degli elementi che rimuoverai, smetteranno di funzionare, e potrebbero portare a un'instabilità del sistema, - perciò disinstalla con cautela. In caso di dubbio contattare l'autore del pacchetto.]]> - - Aggiorna pacchetto - - - Versione del pacchetto - Vedi sito web pacchetto - - - - - - - - - - usando i gruppi di membri di Umbraco.]]> - l'autenticazione basata sui ruoli.]]> - - - - - - - - - - - - - - - - - - - - - - - - ok per pubblicare %0% e rendere questo contenuto accessibile al pubblico.

Puoi pubblicare questa pagina e tutte le sue sottopagine selezionando pubblica tutti i figli qui sotto.]]>
- - - - - - - - - - - - - - - - Il testo in rosso non verrà mostrato nella versione selezionata, quello in verde verrà aggiunto]]> - - - - - - - - - - - Concierge - Contenuto - Courier - Sviluppo - Configurazione guidata Umbraco - Media - Membri - Newsletters - Impostazioni - Statistiche - Traduzione - Utenti - - - - Tipo di contenuto master abilitato - Questo tipo di contenuto usa - - - - - - Tipo - Foglio di stile - - Tab - Titolo tab - Tabs - - - - -
Non chiudere questa finestra durante l'operazione]]>
- - - - - - Tipo di dati: %1%]]> - - Tipo di documento salvato - Tab creata - Tab eliminata - Tab con id: %0% eliminata - Contenuto non pubblicato - - - - Tipo di dato salvato - - - - - - - - - - - - - - - Tipo utente salvato - - - - - - Partial view salvata - Partial view salvata senza errori! - Partial view non salvata - Errore durante il salvataggio del file. - - - - - - - - - - - - - - - - - - - - Anteprima - Stili - - - - - - - - - Master template - - Template - - - - - - Scegli il campo - Converte le interruzioni di linea - - Campi Personalizzati - - - - - - - Minuscolo - Nessuno - - - Ricorsivo - - - Campi Standard - Maiuscolo - - - - - - - - Task assegnati a te - assegnate a te. Per vedere i dettagli, commenti inclusi, clicca su "Dettagli" o sul nome della pagina. - Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
- Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". - ]]>
- chiudi task - Dettagli - Scarica tutte le traduzioni in formato xml - Scarica xml - Scarica xml DTD - Campi - Includi le sottopagine - - [%0%] Traduzione per %1% - - - create da te. Per vedere i dettagli, inclusi i commenti, - clicca su "Dettagli" o sul nome della pagina. Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml". - Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". - ]]> - - - - - - - - - - - Traduttore - - - - Cache Browser - Cestino - Pacchetti creati - Tipi di dato - Dizionario - Pacchetti installati - Installare skin - Installare starter kit - Lingue - Installa un pacchetto locale - Macros - Tipi di media - Membri - Gruppi di Membri - Ruoli - Tipologia Membri - Tipi di documento - Pacchetti - Pacchetti - Files Python - Installa dal repository - Installa Runway - Moduli Runway - Files di scripting - Scripts - Fogli di stile - Templates - Files XSLT - - - - - - - - - Amministratore - Campo Categoria - Cambia la tua password - - Conferma la nuova password - Contenuto del canale - Ridireziona al canvas al login - Campo Descrizione - Disabilita l'utente - Tipo di Documento - Editor - Campo Eccezione - Lingua - Login - - Sezioni - Modifica la tua password - - Password - - - Password attuale - - - - - - - - - - - Username - - - - Writer - -
+ + + + The umbraco community + http://umbraco.org/documentation/language-files + + + Gestisci hostnames + Audit Trail + Sfoglia + Copia + Crea + Crea pacchetto + Cancella + Disabilita + Svuota il cestino + Esporta il tipo di documento + Importa il tipo di documento + Importa il pacchetto + Modifica in Area di Lavoro + Uscita + Sposta + Notifiche + Accesso pubblico + Pubblica + Aggiorna nodi + Ripubblica intero sito + Permessi + Annulla ultima modifica + Invia per la pubblicazione + Invia per la traduzione + Ordina + Invia la pubblicazione + Traduci + Annulla pubblicazione + Aggiorna + + + Aggiungi nuovo dominio + Dominio + + + + + + Hostname non valido + Modifica il dominio corrente + + + Visualizzazione per + + + Grassetto + Cancella rientro paragrafo + Inserisci dal file + Inserisci intestazione grafica + Modifica Html + Inserisci rientro paragrafo + Corsivo + Centra + Allinea testo a sinistra + Allinea testo a destra + Inserisci Link + Inserisci local link (ancora) + Elenco puntato + Elenco numerato + Inserisci macro + Inserisci immagine + Modifica relazioni + Salva + Salva e pubblica + Salva e invia per approvazione + Anteprima + + Scegli lo stile + Mostra gli stili + Inserisci tabella + + + Informazioni su questa pagina + Link alternativo + + Links alternativi + Clicca per modificare questo elemento + Creato da + Creato il + Tipo di documento + Modifica + Attivo fino al + + + Ultima pubblicazione + Link ai media + Tipo di media + Gruppo di membri + Ruolo + Tipologia Membro + + Titolo della Pagina + + + Pubblicato + Stato della pubblicazione + Pubblicato il + Rimuovi data + Ordinamento dei nodi aggiornato + + Statistiche + Titolo (opzionale) + Tipo + Non pubblicato + Ultima modifica + Rimuovi il file + Link al documento + + + + Crea al + Scegli il tipo ed il titolo + + + + + + hai aperto una nuova finestra + Riavvia + Visita + Benvenuto + + + Nome + Gestione alias Hostnames + Chiudi questa finestra + + + + + + Taglia + Modifica elemento Dictionary + Modifica il linguaggio + Inserisci il link locale + Inserisci carattere + + + Inserisci link + Inserisci macro + Inserisci tabella + Ultima modifica + Link + + + + Impostazioni Macro + + Incolla + Modifica il Permesso per + + + + regexlib.com ha attualmente qualche problema, di cui non abbiamo il controllo. Siamo spiacevoli dell'inconveniente.]]> + + Elimina Macro + Campo obbligatorio + + + + Numero di colonne + Numero di righe + Imposta identificativo del placeholder. Settando tale ID puoi inserire il contenuto in questo template dai template figli, facendo riferimento a questo ID usando il codice <asp:content />.]]> + Seleziona Identificativo del placeholder dalla lista seguente. Puoi scegliere solo l'ID appartenente al template master corrente.]]> + + Seleziona elemento + Visualizza gli elementi in cache + + + + + + + Possibili nodetypes figli + Crea + Cancella tab + Descrizione + Nuova tab + Tab + Miniatura + + + + + + Rendering controllo + Bottoni + Abilita impostazioni avanzate per + Abilita menu contestuale + Dimensione massima delle immagini inserite + Fogli di stile collegati + Visualizza etichetta + Larghezza e altezza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Info + Azione + Aggiungi + Alias + + Bordo + o + Annulla + + Scegli + Chiudi + Chiudi la finestra + Commento + Conferma + Blocca le proporzioni + Continua + Copia + Crea + Base di dati + Data + Default + Elimina + Eliminato + Elimina... + Design + Dimensioni + + Scarica + Modifica + Modificato + Elementi + Email + Errore + Trova + Cartella + Altezza + Aiuto + Icona + Importa + + Inserisci + Installa + Giustificato + Lingua + Layout + Caricamento + Bloccato + Login + Log off + Logout + Macro + Sposta + Nome + Nuovo + Successivo + No + di + Ok + Apri + o + Password + Percorso + + + Precedente + + + Cestino + Rimangono + Rinomina + Rinnova + Riprova + Permessi + Cerca + Server + Mostra + Mostra la pagina inviata + Dimensione + Ordina + Tipo + + Su + Aggiorna + Aggiornamento + Carica + Url + Utente + + Valore + Vedi + Benvenuto... + Larghezza + Si + + + Colore di sfondo + Grassetto + Colore del testo + Carattere + Testo + + + Pagina + + + + + + + installa per installare il database Umbraco %0% ]]> + Avanti per proseguire.]]> + + Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.

+

Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.

Clicca il tasto riprova quando hai finito.
Maggiori dettagli per la modifica del file web.config qui.

]]> +
+ + Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%

Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!

]]>
+ Premi il tasto Avanti per continuare.]]> + Avanti per continuare la configurazione.]]> + La password predefinita per l'utente di default deve essere cambiata!]]> + L'utente di default è stato disabilitato o non ha accesso ad Umbraco!

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> + La password è stata modificata con successo

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> + + Umbraco crea un utente ('admin')predefinito e password ('default'). E' importante modificare la password con una personale.

Questo passaggio controlla la password predefinita e ricorda, se necessario, di modificarla.

]]>
+ + + + + + + Le impostazioni dei permessi sono perfette!

Puoi eseguire umbraco senza problemi, ma potresti non poter installare i pacchetti che sono consigliati per sfruttare tutti i vantaggi offerti da Umbraco.]]>
+ + + video tutorial su come impostare i permessi delle cartelle per Umbraco o leggi la versione testuale.]]> + Le impostazioni dei permessi potrebbero avere dei problemi!

Puoi eseguire Umbraco, ma potresti non essere in grado di creare cartelle o installare pacchetti che sono raccomandati per sfruttare tutti i vantaggi di Umbraco.]]>
+ Le impostazioni dei permessi non sono corrette per Umbraco!

Per eseguire Umbraco, devi aggiornare le impostazioni dei permessi.]]>
+ La configurazione dei permessi è perfetta!

Sei pronto per avviare Umbraco e installare i pacchetti!]]>
+ + + + + + Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]> + + Runway è installato + + Questa è la lista dei nostri moduli raccomandati, seleziona quali vorresti installare, o vedi l'intera lista di moduli + ]]> + Raccommandato solo per utenti esperti + Vorrei iniziare da un sito semplice + + "Runway" è un semplice sito web contenente alcuni tipi di documento e alcuni templates di base. L'installer configurerà Runway per te automaticamente, + ma tu potrai facilmente modificarlo, estenderlo o eliminarlo. Non è necessario installarlo e potrai usare Umbraco anche senza di esso, ma + Runway ti offre le basi e le best practices per cominciare velocemente. + Se sceglierai di installare Runway, volendo potrai anche selezionare i moduli di Runway per migliorare le pagine. +

+ + Inclusi in Runway: Home page, pagina Guida introduttiva, pagina Installazione moduli
+ Moduli opzionali: Top Navigation, Sitemap, Contatti, Gallery. +
+ ]]>
+ Cosa è Runway + Passo 1/5 Accettazione licenza + Passo 2/5: Configurazione database + Passo 3/5: Controllo permessi dei file + Passo 4/5: Controllo impostazioni sicurezza + Passo 5/5: Umbraco è pronto per iniziare + Grazie per aver scelto Umbraco + Naviga per il tuo nuovo sito +Hai installato Runway, quindi perché non dare uno sguardo al vostro nuovo sito web.]]> + Ulteriori informazioni e assistenza +Fatti aiutare dalla nostra community, consulta la documentazione o guarda alcuni video gratuiti su come costruire un semplice sito web, come usare i pacchetti e una guida rapida alla terminologia Umbraco]]> + + /web.config e aggiornare la chiave AppSetting umbracoConfigurationStatus impostando il valore '%0%'.]]> + + iniziare immediatamente cliccando sul bottone "Avvia Umbraco".
Se sei nuovo a Umbraco, si possono trovare un sacco di risorse sulle nostre pagine Getting Started.]]>
+ + Avvia Umbraco +Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e iniziare ad aggiungere i contenuti, aggiornando i modelli e i fogli di stile o aggiungere nuove funzionalità]]> + Connessione al database non riuscita. + Umbraco Versione 3 + Umbraco Versione 4 + Guarda + Umbraco %0% per una nuova installazione o per l'aggiornamento dalla versione 3.0. +

+ Clicca "avanti" per avviare la procedura.]]>
+ + + Codice cultura + Nome cultura + + + + Riconnetti adesso per salvare il tuo lavoro + + + © 2001 - %0%
umbraco.org

]]>
+ Benvenuti in Umbraco, digita il tuo username e la tua password nelle caselle seguenti: + + + Dashboard + Sezioni + Contenuto + + + Scegli la pagina sopra... + + Seleziona dove il documento %0% deve essere copiato + + Seleziona dove il documento %0% deve essere spostato + + + + + + + + + + + + Salve %0%

+ +

Questa è un'email automatica per informare che l'azione '%1%' + è stata eseguita sulla pagina '%2%' + dall'utente '%3%' +

+ +

+

Riepilogo aggiornamento:

+ + %6% +
+

+ + + +

Buona giornata!

+ Grazie da Umbraco +

]]>
+ [%0%] Notifica per %1% eseguita su %2% + Notifiche + + + + e selezionando il pacchetto. I pacchetti Umbraco generalmente hanno l'estensione ".umb" o ".zip". + ]]> + Autore + Dimostrazione + Documentazione + Meta dati pacchetto + Nome del pacchetto + Il pacchetto non contiene tutti gli elementi +
+ E' possibile rimuovere questo pacchetto dal sistema cliccando "rimuovi pacchetto" in basso.]]>
+ Non ci sono aggiornamenti disponibili + Opzioni pacchetto + Pacchetto leggimi + Pacchetto repository + Conferma eliminazione + + + Disinstalla pacchetto + + Avviso: tutti i documenti, i media, etc a seconda degli elementi che rimuoverai, smetteranno di funzionare, e potrebbero portare a un'instabilità del sistema, + perciò disinstalla con cautela. In caso di dubbio contattare l'autore del pacchetto.]]> + + Aggiorna pacchetto + + + Versione del pacchetto + Vedi sito web pacchetto + + + + + + + + + + usando i gruppi di membri di Umbraco.]]> + l'autenticazione basata sui ruoli.]]> + + + + + + + + + + + + + + + + + + + + + + + + ok per pubblicare %0% e rendere questo contenuto accessibile al pubblico.

Puoi pubblicare questa pagina e tutte le sue sottopagine selezionando pubblica tutti i figli qui sotto.]]>
+ + + + + + + + + + + + + + + + Il testo in rosso non verrà mostrato nella versione selezionata, quello in verde verrà aggiunto]]> + + + + + + + + + + + Concierge + Contenuto + Courier + Sviluppo + Configurazione guidata Umbraco + Media + Membri + Newsletters + Impostazioni + Statistiche + Traduzione + Utenti + + + + Tipo di contenuto master abilitato + Questo tipo di contenuto usa + + + + + + Tipo + Foglio di stile + + Tab + Titolo tab + Tabs + + + + +
Non chiudere questa finestra durante l'operazione]]>
+ + + + + + Tipo di dati: %1%]]> + + Tipo di documento salvato + Tab creata + Tab eliminata + Tab con id: %0% eliminata + Contenuto non pubblicato + + + + Tipo di dato salvato + + + + + + + + + + + + + + + Tipo utente salvato + + + + + + Partial view salvata + Partial view salvata senza errori! + Partial view non salvata + Errore durante il salvataggio del file. + + + + + + + + + + + + + + + + + + + + Anteprima + Stili + + + + + + + + + Master template + + Template + + + + + + Scegli il campo + Converte le interruzioni di linea + + Campi Personalizzati + + + + + + + Minuscolo + Nessuno + + + Ricorsivo + + + Campi Standard + Maiuscolo + + + + + + + + Task assegnati a te + assegnate a te. Per vedere i dettagli, commenti inclusi, clicca su "Dettagli" o sul nome della pagina. + Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
+ Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". + ]]>
+ chiudi task + Dettagli + Scarica tutte le traduzioni in formato xml + Scarica xml + Scarica xml DTD + Campi + Includi le sottopagine + + [%0%] Traduzione per %1% + + + create da te. Per vedere i dettagli, inclusi i commenti, + clicca su "Dettagli" o sul nome della pagina. Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml". + Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". + ]]> + + + + + + + + + + + Traduttore + + + + Cache Browser + Cestino + Pacchetti creati + Tipi di dato + Dizionario + Pacchetti installati + Installare skin + Installare starter kit + Lingue + Installa un pacchetto locale + Macros + Tipi di media + Membri + Gruppi di Membri + Ruoli + Tipologia Membri + Tipi di documento + Pacchetti + Pacchetti + Files Python + Installa dal repository + Installa Runway + Moduli Runway + Files di scripting + Scripts + Fogli di stile + Templates + Files XSLT + + + + + + + + + Amministratore + Campo Categoria + Cambia la tua password + + Conferma la nuova password + Contenuto del canale + Ridireziona al canvas al login + Campo Descrizione + Disabilita l'utente + Tipo di Documento + Editor + Campo Eccezione + Lingua + Login + + Sezioni + Modifica la tua password + + Password + + + Password attuale + + + + + + + + + + + Username + + + + Writer + +
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml index b5c96e1b58..819461321b 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml @@ -504,7 +504,7 @@ Runwayをインストールして作られた新しいウェブサイトがど ]]> 前略 %0% さま

-

ユーザー '%3%' によりページ '%2%' 上のタスク '%1%' から自動的にメールします。

+

ユーザー '%3%' によりページ '%2%' 上のタスク '%1%' から自動的にメールします。


  公開     diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml index 2801ebaf14..12686daa30 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml @@ -1,4 +1,4 @@ - +h The Umbraco community @@ -54,7 +54,7 @@ 단락 들여쓰기 취소 폼 필드 삽입 그래픽 헤드라인 삽입 - Html 편집 + Html 편집 단락 들여쓰기 기울임꼴 가운데 맞춤 @@ -483,7 +483,7 @@ 안녕하세요 %0%

사용자 '%3%' 가 작업 '%1%' 를 - 페이지 에서 + 페이지 '%2%' 에서 진행했음을 알리는 자동 발송 메일입니다.

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml index 7e8fbd8e3a..ec927c3010 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml @@ -1,813 +1,813 @@ - - - - The umbraco community - http://umbraco.org/documentation/language-files - - - Beheer domeinnamen - Documentgeschiedenis - Node bekijken - Kopiëren - Nieuw - Nieuwe package - Verwijderen - Uitschakelen - Prullenbak leegmaken - Documenttype exporteren - Exporteer naar .NET - Exporteer naar .NET - Documenttype importeren - Package importeren - Aanpassen in Canvas - Afsluiten - Verplaatsen - Meldingen - Publieke toegang - Publiceren - Nodes opnieuw inladen - Herpubliceer de volledige site - Rechten - Vorige versies - Klaar voor publicatie - Klaar voor vertalen - Sorteren - Klaar voor publicatie - Vertalen - Bijwerken - - - Nieuw domein toevoegen - Domein - Nieuw domein '%0%' is aangemaakt - Domein '%0%' is verwijderd - Het domein '%0' is reeds toegekend - vb.: uwdomein.com, www.uwdomein.com - Domein '%0%' is aangepast - Bewerk huidige domeinen - - - Tonen voor - - - Vet - Paragraaf uitspringen - Voeg formulierveld in - Voeg grafische titel in - Wijzig Html - Paragraaf inspringen - Cursief - Centreren - Links Uitlijnen - Rechts Uitlijnen - Link Invoegen - Lokale link invoegen (anker) - Opsomming - Nummering - Macro invoegen - Afbeelding invoegen - Relaties wijzigen - Opslaan - Opslaan en publiceren - Opslaan en verzenden voor goedkeuring - voorbeeld bekijken - Stijl kiezen - Stijlen tonen - Tabel invoegen - - - Over deze pagina - Alternatieve link - (hoe zou jij de foto beschrijven via de telefoon) - Alternatieve links - Klik om dit item te wijzigen - Aangemaakt door - Aangemaakt op - Documenttype - Aanpassen - Verwijder op - Dit item is gewijzigd na publicatie - Dit item is niet gepubliceerd - laatst gepubliceerd op - Media Type - Ledengroep - Rol - Ledentype - Geen datum gekozen - Pagina Titel - Eigenschappen - Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is - Publiceer - Publicatie Status - Publiceer op - Datum Wissen - De sorteervolgorde is gewijzigd - Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren. - Statistieken - Titel (optioneel) - Type - Depubliceren - Laatst gewijzigd - Bestand verwijderen - Link naar het document - - - Waar wil je de nieuwe %0% aanmaken? - Aanmaken op - Kies een type en een titel - - - Open je website - - Verberg - Als Umbraco niet geopend wordt dan moet je misschien popups toelaten voor deze site. - is geopend in een nieuw venster - Herstarten - Bezoek - Welkom - - - Naam - Beheer domeinnamen - Sluit dit venster - Weet je zeker dat je dit wilt verwijderen - Weet je zeker dat je dit wilt uitschakelen - Vink aub dit keuzevak aan om het verwijderen van %0% item(s) te bevestigen - Weet je het zeker? - Weet je het zeker? - Knippen - Pas woordenboekitem aan - Taal aanpassen - Lokale link invoegen - Karakter invoegen - Voeg grafische titel in - Afbeelding invoegen - Link invoegen - Klik om een Macro toe te voegen - Tabel invoegen - Laatst aangepast op - Link - Interne link: - Plaats een hekje (“#”) voor voor interne links. - In nieuw venster openen? - Macro Settings - Deze macro heeft geen eigenschappen die u kunt bewerken - Plakken - Bewerk rechten voor - De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is. - De prullenbak is nu leeg. - Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd. - regexlib.com ondervindt momenteel prolemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]> - Zoek naar een regular expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email, 'post-code' 'url' - Verwijder Macro - Verplicht veld - Site is opnieuw geïndexeerd - De site is opnieuw gepubliceerd - De cache zal worden vernieuwd. Alle gepubliseerde content zal worden ge-update, terwijl ongepubliseerde content ongepubliseerd zal blijven. - Aantal kolommen - Aantal regels - Plaats een placeholder id door een ID op uw placeholder te zetten kunt u content plaatsen in deze template vanuit onderliggende templates, - door te referreren naar deze ID door gebruik te maken van een <asp:content /> element.]]> - Selecteer een placeholder id uit onderstaande lijst. U kunt alleen - Id's kiezen van de master van de huidige template..]]> - Klik op de afbeelding voor volledige grootte - Kies een item - Toon cache item - - - Wijzig de verschillende taalversies voor het woordenboek item '%0%'. Je kunt extra talen toevoegen bij 'talen' in het menu links. - Cultuurnaam - - - Toegelaten subnodetypes - Nieuw - Tab verwijderen - Omschrijving - Nieuwe tab - Tab - Miniatuur - - - Prevalue toevoegen - Datebase datatype - Data Editor GUID - Render control - Buttons - Geavanceerde instellingen inschakelen voor - Context menu inschakelen - Maximum standaard grootte van afbeeldingen - Gerelateerde stylesheets - Toon label - Breedte en hoogte - - - Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen herstellen: - Het wachtwoord veranderen wordt door de huidige Membership Provider niet ondersteund (EnablePasswordRetrieval moet op true staan) - %0% bestaat al - Er zijn fouten geconstateerd: - Er zijn fouten geconstateerd: - Het wachtwoord moet minstens %0% tekens lang zijn en moet minstens %1% cijfers bevatten - %0% moet een geheel getal zijn - %0% op tab %1% is een verplicht veld - %0% is een verplicht veld - %0% op tab %1% is niet in het correcte formaat - %0% is niet in het correcte formaat - - - OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is. - Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld! - Er is een probleem met de lees/schrijf rechten op een bestand of map - Vul een titel in - Selecteer een type - U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan? - Fout in python script - Het python script is niet opgeslagen omdat het fouten bevat - Start node is verwijderd, neem contact op met uw systeembeheerder - Markeer de content voordat u de stijl aanpast - Geen actieve stijlen beschikbaar - Plaats de cursor links van de twee cellen die je wilt samenvoegen - Je kunt een cel die is samengevoegd niet delen - Fout in de xslt bron - De xslt is niet opgeslagen omdat deze fout(en) bevat - - - Over - Actie - Toevoegen - Alias - Weet je het zeker? - Rand - of - Annuleren - Cel marge - Kiezen - Sluiten - Venster sluiten - Opmerking - Bevestigen - Verhouding behouden - Doorgaan - Kopiëren - Aanmaken - Databank - Datum - Standaard - Verwijderen - Verwijderd - Verwijderen... - Ontwerp - Afmetingen - Beneden - Download - Aanpassen - Aangepast - Elementen - Email - Fout - Zoeken - Hoogte - Help - Icoon - Importeer - Binnen marge - Invoegen - Installeren - Uitvullen - Taal - Layout - Bezig met laden - Geblokkeerd - Inloggen - Afmelden - Afmelden - Macro - Verplaats - Naam - Nieuw - Volgende - Nee - of - Ok - Open - of - Wachtwoord - Pad - Placeholder ID - Een ogenblik geduld a.u.b. - Vorige - Eigenschappen - Email om formulier te ontvangen - Prullenbak - Overgebleven - Hernoemen - Vernieuw - Opnieuw proberen - Rechten - Zoek - Server - Tonen - Toon pagina bij versturen - Formaat - Sorteren - Type - Type om te zoeken... - Omhoog - Bijwerken - Upgrade - Upload - Url - Gebruiker - Gebruikersnaam - Waarde - Toon - Welkom... - Breedte - Ja - - - Achtergrondkleur - Vet - Tekstkleur - Font - Tekst - - - Pagina - - - De installer kan geen connectie met de database maken. - De web.config kon niet worden opgeslagen. Gelieve de connectiestring handmatig aan te passen. - Je database is gevonden en is geïdentificeerd als - Database configuratie - installeer om de Umbraco %0% database te installeren]]> - Volgende om door te gaan.]]> - De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is.

Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.

Klik op de knop opnieuw proberen als je hiermee klaar bent.
Meer informatie over het aanpassen van de web.config vind je hier.

]]>
- Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]> - Klik de upgrade knop om je database te upgraden naar Umbraco %0%

Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!

]]>
- Klik Volgende om verder te gaan.]]> - volgende om door te gaan]]> - Het wachtwoord van de default gebruiker dient veranderd te worden!]]> - De default gebruiker is geblokkeerd of heeft geen toegang tot Umbraco!

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> - Het wachtwoord van de default gebruiker is sinds installatie met succes veranderd.

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> - Het wachtwoord is veranderd! - umbraco maakt een default gebruiker aan met login ('admin') and wachtwoord ('default'). Het is belangrijk dat dit wachtwoord wordt veranderd in iets unieks.

Deze stap controleert het password van de default gebruiker en adviseert of het veranderd dient te worden.

]]>
- Neem een jumpstart en bekijk onze introductie videos - - Nog niet geïnstalleerd. - Betreffende bestanden en mappen - Meer informatie over het instellen van machtigingen voor umbraco vind je hier - Je dient ASP.NET 'modify' machtiging te geven voor de volgende bestanden/mappen - Je machtigingen zijn bijna perfect!

Je kunt umbraco zonder problemen starten, maar je kunt nog geen packages installeren om volledig van umbraco te profiteren.]]>
- Hoe op te lossen - Klik hier om de tekst versie te lezen - video tutorial over het instellen van machtigingen voor umbraco, of lees de tekst versie.]]> - Je machtigingen zijn misschien incorrect!

Je kunt umbraco probleemloos starten, maar je kunt nog geen mappen aanmaken of packages installeren om zo volledig van umbraco te profiteren.]]>
- Je machtigingen zijn nog niet gereed gemaakt voor umbraco!

Om umbraco te starten zul je je machtigingen moeten aanpassen.]]>
- Je machtigingen zijn perfect!

Je bent nu klaar om umbraco te starten en om packages te installeren!]]>
- Map probleem wordt opgelost - Volg deze link voor meer informatie over problemen met ASP.NET en het aanmaken van mappen - Machtigingen worden aangepast - umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren. - Ik wil met een lege website beginnen - leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]> - Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen? - Runway is geinstalleerd - Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules]]> - Alleen aanbevolen voor gevorderde gebruikers - Ik wil met een eenvoudige website beginnen - "Runway" is een eenvoudige website die je van enkele elementaire documenttypes en templates voorziet. De installer kan Runway automatisch voor je opzetten, maar je kunt het gemakkelijk aanpassen, uitbreiden of verwijderen. Het is niet vereist en je kunt Umbraco prima zonder Runway gebruiken. - -Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je er voor kiest om Runway te installeren, dan kun je optioneel de bouwstenen (genaamd Runway Modules) kiezen om je Runway pagina's te verbeteren.

Runway omvat: Home pagina, Getting Started pagina, Module installatie pagina.
Optionele Modules: Top Navigatie, Sitemap, Contact, Gallery.
- ]]>
- Wat is Runway - Stap 1/5: Licentie aanvaarden - Stap 2/5: Database configureren - Stap 3/5: Controleren van rechten op bestanden - Stap 4/5: Umbraco beveiliging controleren - Stap 5/5: Umbraco is klaar - Bedankt dat je voor Umbraco hebt gekozen - Browse je nieuwe site Je hebt Runway geinstalleerd, dus kijk eens hoe je nieuwe site eruit ziet.]]> - Meer hulp en informatie Vind hulp in onze bekroonde community, blader door de documentatie of bekijk enkele gratis videos over het bouwen van een eenvoudige site, het gebruiken van packages en een overzicht van umbraco terminologie]]> - Umbraco %0% is geïnstalleerd en klaar voor gebruik. - /web.config bestand aanpassen, en de Appsetting key umbracoConfigurationStatus onder in het bestand veranderen naar '%0%'.]]> - meteen beginnen door de "Launch Umbraco" knop hieronder te klikken.
Als je een beginnende umbraco gebruiker bent, dan kun je you can find veel informatie op onze "getting started" pagina's vinden.]]>
- Launch Umbraco Om je website te beheren open je simpelweg de umbraco back office en begin je content toe te voegen, templates en stylesheets aan te passen of nieuwe functionaliteit toe te voegen]]> - Verbinding met de database mislukt. - Umbraco versie 3 - Umbraco versie 4 - Bekijken - umbraco %0% voor een nieuwe installatie of een upgrade van versie 3.0.

Druk op "volgende" om de wizard te starten.]]>
- - - Culture Code - Culture Naam - - - Je bent inactief en zult automatisch worden uitgelogd over - Vernieuw sessie om wijzigingen te behouden - - - © 2001 - %0%
umbraco.org

]]>
- Welkom bij umbraco, geef je gebruikersnaam en wachtwoord op in de onderstaande velden: - - - Dashboard - Secties - Inhoud - - - Selecteer pagina boven... - %0% is gekopieerd naar %1% - Kopieer naar - %0% is verplaatst naar %1% - Verplaats naar - is geselecteerd als root van je nieuwe pagina, klik hieronder op 'ok'. - Nog geen node geselecteerd, selecteer eerst een node in bovenstaade lijst voordat je op 'volgende' klikt - De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type - De huidige node kan niet naar een van zijn subpagina’s worden verplaatst. - Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer kinderen. - - - Bewerk de notificatie voor %0% - - Hi %0%

- -

Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%' - is uitgevoerd op pagina '%2%' - door gebruiker '%3%' -

- -

-

Update samenvatting:

- - %6% -
-

- - - -

Een prettige dag!

- Dit is een bericht van uw Content Management Systeem. -

- ]]>
- [%0%] Notificatie over %1% uitgevoerd op %2% - Notificaties - - - Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie. - Auteur - Demonstratie - Documentatie - Package meta data - Package naam - Package bevat geen items -
- Je kunt dit veilig verwijderen door 'verwijder paackage' te klikken. - ]]>
- Geen upgrades beschikbaar - Package opties - Package leesmij - Package repository - Bevestig verwijderen - Package is verwijderd - De package is succesvol verwijderd - Verwijder package - - Waarschuwing: alle documenten, media etc, die afhankelijk zijn van de items die je verwijderd, zullen niet meer werken en kan leiden tot een instabiele installatie, - wees dus voorzichtig met verwijderen. Als je niet zeker bent, neem dan contact op met de auteur van de package. - ]]> - Download update uit de repository - Upgrade package - Upgrade instructies - Er is een upgrade beschikbaar voor deze package. Je kunt het direct downloaden uit de umbraco package repository. - Package versie - Bekijk de package website - - - Plakken met alle opmaak (Niet aanbevolen) - De tekst die je probeert te plakken bevat speciale karakters en/of opmaak. Dit kan veroorzaakt worden doordat de tekst vanuit Microsoft Word is gekopieerd. Umbraco kan deze speciale karakters en formattering automatisch verwijderen zodat de geplakte tekst geschikt is voor het web. - Plakken als ruwe tekst en alle opmaak verwijderen - Plakken, en verwijder de opmaak (aanbevolen) - - - Geavanceerd: Beveilig door de Member Groups te seecteren die toegang hebben op de pagina - gebruik makend van umbraco's member groups.]]> - role-based authentication.]]> - Error Pagina - Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken - Hoe wil je de pagina beveiligen? - %0% is nu beveiligd - Beveiliging verwijderd van %0% - Login Pagina - Kies de pagina met het login-formulier - Verwijder beveiliging - Kies de pagina's die het login-formulier en de error-berichten bevatten - Kies de roles wie toegang hebben tot deze pagina - Geef de gebruikersnaam en wachtwoord voor deze pagina - Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord - Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord - - - - Inclusief ongepubliceerde kinderen - Publicatie in uitvoering - even geduld... - %0% van %1% pagina’s zijn gepubliceerd... - %0% is gepubliceerd - %0% en onderliggende pagina’s zijn gepubliceerd - Publiceer %0% en alle kinderen - ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.

- Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle kinderen aan te vinken hieronder. - ]]>
- - - Externe link toevoegen - Interne link toevoegen - Toevoegen - Bijschrift - Interne pagina - URL - Verplaats omlaag - Verplaats omhoog - Open in nieuw venster - Verwijder link - - - Huidige versie - Rode tekst wordt niet getoond in de geselecteerde versie , groen betekent toegevoegd]]> - Document is teruggezet - Hiermee wordt de geselecteerde versie als html getoond, als u de verschillen tussen de 2 versies tegelijk wilt zien, gebruik dan de diff view - Terugzetten naar - Selecteer versie - Bekijk - - - Bewerk script-bestand - - - Concierge - Content - Courier - Ontwikkelaars - Umbraco Configuratie Wizard - Media - Leden - Nieuwsbrieven - Instellingen - Statistieken - Vertaling - Gebruikers - - - Standaard template - Woordenboek sleutel - Om een bestaand documenttype te importeren, zoek het betreffende “.udt” bestand door op browse en import te klikken. (Je ziet een bevestigingspagina voordat de import start. Als het documenttype al bestaat dan wordt het bijgewerkt.) - Nieuwe tabtitel - Node type - Type - Stylesheet - Stylesheet eigenschap - Tab - Tab titel - Tabs - - - Sorteren gereed. - Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren. -
Sluit dit venster niet tijdens het sorteren]]>
- - - Publicatie werd geannuleerd door een 3rd party plug-in - Eigenschappen type bestaat al - Eigenschappen type aangemaakt - Data type: %1%]]> - Eigenschappen type verwijderd - Content type opgeslagen - Tab aangemaakt - Tab verwijderd - Tab met id: %0% verwijderd - Stylesheet niet opgeslagen - Stylesheet opgeslagen - Stylesheet opgeslagen zonder fouten - Datatype opgeslagen - Woordenboek item opgeslagen - Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is - Content gepubliceerd - en zichtbaar op de website - Content opgeslagen - Vergeet niet te publiceren om de wijzigingen zichtbaar te maken - Verzend voor goedkeuring - Verandering zijn verstuurd voor goedkeuring - Lid opgeslagen - Stijlsheet eigenschap opgeslagen - Stijlsheet opgeslagen - Template opgeslagen - Fout bij opslaan gebruiker (zie logboek) - Gebruiker opgeslagen - Bestand niet opgeslagen - bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging - Bestand opgeslagen - Bestand opgeslagen zonder fouten - Taal opgeslagen - Python script niet opgeslagen - Python script kon niet worden opgeslagen door een fout - Python script opeslagen! - Geen fouten in python script! - Template niet opgeslagen - Controleer dat je geen 2 tamplates met dezelfde naam hebt - Template opgeslagen - Template opgeslagen zonder fouten! - Xslt niet opgeslagen - Xslt bevat een fout - Xslt kon niet worden opgeslagen, controleer de bestandsbeveiliging - Xslt opgeslagen - Geen fouten in de xslt! - - - Gebruik CSS syntax bijv: h1, .redHeader, .blueTex - Stijlsheet aanpassen - Bewerk stylesheet eigenschap - Naam waarmee de stijl in de editor te kiezen is - Voorbeeld - Stijlen - - - Template aanpassen - Invoegen content area - Invoegen content area placeholder - Invoegen dictionary item - Invoegen Macro - Invoegen umbraco page field - Master template - Quick Guide voor umbraco template tags - Template - - - Alternatief veld - Alternatieve tekst - Kapitalisatie - Selecteer veld - Converteer regelafbreking - ]]> - Ja, alleen datum - Opmaken als datum - HTML-encoderen - Speciale karakters worden geëncodeerd naar HTML. - Zal worden ingevoegd na de veld waarde - Zal worden ingevoegd voor de veld waarde - Kleine letters - Geen - Invoegen na veld - Invoegen voor veld - Recursief - Verwijder paragraaf tags - tags aan het begin en einde van de tekst worden verwijderd]]> - Hoofdletters - URL-encoderen - Speciale karakters in URL's worden geëncodeerd - Zal alleen worden gebruikt waneer de bovenstaande veld waardes leeg zijn - Dit veld zal alleen worden gebruikt als het primaire veld leeg is - Ja, met tijd. Scheidingsteken: - - - Taken aan jou toegewezen - - Sluit taak - Details van vertaling - Download alle vertalingstaken als xml - Download xml - Download xml DTD - Velden - Inclusief onderliggende pagina's - - [%0%] Vertaalopdracht voor %1% - Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd - Taken aangemaakt door jou - die je aanmaakte. Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]> - De pagina '%0%' is verstuurd voor vertaling - Stuur voor vertaling - Toegewezen door - Taak geopend - Totaal aantal woorden - Vertaal naar - Vertaling voltooid. - Je kan een voorbeeld van vertaalde pagina's bekijken door hieronder te klikken. Als de originele pagina gevonden werd, wordt een vergelijking van beide pagina's getoond. - Vertalen niet gelukt, het XML-bestand is mogelijk beschadigd. - Vertalingsopties - Vertaler - Vertaald XML-document uploaden - - - Cachebrowser - Prullenbak - Gemaakte packages - Datatypes - Woordenboek - Geïnstalleerde packages - Installeer skin - Installeer starter kit - Talen - Installeer een lokale package - Macro's - Mediatypes - Leden - Ledengroepen - Rollen - Ledentypes - Documenttypes - Packages - Packages - Python-bestanden - Installeer uit repository - Installeer Runway - Runway modules - Script bestanden - Scripts - Stylesheets - Sjablonen - XSLT Bestanden - - - Nieuwe update beschikbaar - %0% is gereed, klik hier om te downloaden - Er is geen verbinding met de server - Er is een fout opgetreden bij het zoeken naar een update. Bekijk de trace-stack voor verdere informatie. - - - Beheerders - Categorieveld - Verander je wachtwoord - Je kunt je wachtwoord veranderen door onderstaan formulier in te vullen en op de knop 'Verander wachtwoord' te klikken - Content Channel - Doorlinken naar Canvas bij inloggen - Omschrijving - Geblokkeerde gebruiker - Documenttype - Redacteur - Samenvattingsveld - Taal - Loginnaam - Startnode in Mediabibliotheek - Secties - Blokkeer Umbraco toegang - Wachtwoord - Je wachtwoord is veranderd! - Herhaal nieuwe wachtwoord - Voer nieuwe wachtwoord in - Je nieuwe wachtwoord mag niet leeg zijn! - Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw! - Beide wachtwoorden zijn niet hetzelfde! - Vervang rechten op de subnodes - U bent momenteel rechten aan het aanpassen voor volgende pagina's: - Selecteer pagina's om hun rechten aan te passen - Doorzoek alle subnodes - Startnode in Content - Gebruikersnaam - Gebruikersrechten - Gebruikerstype - Gebruikerstypes - Auteur - + + + + The umbraco community + http://umbraco.org/documentation/language-files + + + Beheer domeinnamen + Documentgeschiedenis + Node bekijken + Kopiëren + Nieuw + Nieuwe package + Verwijderen + Uitschakelen + Prullenbak leegmaken + Documenttype exporteren + Exporteer naar .NET + Exporteer naar .NET + Documenttype importeren + Package importeren + Aanpassen in Canvas + Afsluiten + Verplaatsen + Meldingen + Publieke toegang + Publiceren + Nodes opnieuw inladen + Herpubliceer de volledige site + Rechten + Vorige versies + Klaar voor publicatie + Klaar voor vertalen + Sorteren + Klaar voor publicatie + Vertalen + Bijwerken + + + Nieuw domein toevoegen + Domein + Nieuw domein '%0%' is aangemaakt + Domein '%0%' is verwijderd + Het domein '%0' is reeds toegekend + vb.: uwdomein.com, www.uwdomein.com + Domein '%0%' is aangepast + Bewerk huidige domeinen + + + Tonen voor + + + Vet + Paragraaf uitspringen + Voeg formulierveld in + Voeg grafische titel in + Wijzig Html + Paragraaf inspringen + Cursief + Centreren + Links Uitlijnen + Rechts Uitlijnen + Link Invoegen + Lokale link invoegen (anker) + Opsomming + Nummering + Macro invoegen + Afbeelding invoegen + Relaties wijzigen + Opslaan + Opslaan en publiceren + Opslaan en verzenden voor goedkeuring + voorbeeld bekijken + Stijl kiezen + Stijlen tonen + Tabel invoegen + + + Over deze pagina + Alternatieve link + (hoe zou jij de foto beschrijven via de telefoon) + Alternatieve links + Klik om dit item te wijzigen + Aangemaakt door + Aangemaakt op + Documenttype + Aanpassen + Verwijder op + Dit item is gewijzigd na publicatie + Dit item is niet gepubliceerd + laatst gepubliceerd op + Media Type + Ledengroep + Rol + Ledentype + Geen datum gekozen + Pagina Titel + Eigenschappen + Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is + Publiceer + Publicatie Status + Publiceer op + Datum Wissen + De sorteervolgorde is gewijzigd + Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren. + Statistieken + Titel (optioneel) + Type + Depubliceren + Laatst gewijzigd + Bestand verwijderen + Link naar het document + + + Waar wil je de nieuwe %0% aanmaken? + Aanmaken op + Kies een type en een titel + + + Open je website + - Verberg + Als Umbraco niet geopend wordt dan moet je misschien popups toelaten voor deze site. + is geopend in een nieuw venster + Herstarten + Bezoek + Welkom + + + Naam + Beheer domeinnamen + Sluit dit venster + Weet je zeker dat je dit wilt verwijderen + Weet je zeker dat je dit wilt uitschakelen + Vink aub dit keuzevak aan om het verwijderen van %0% item(s) te bevestigen + Weet je het zeker? + Weet je het zeker? + Knippen + Pas woordenboekitem aan + Taal aanpassen + Lokale link invoegen + Karakter invoegen + Voeg grafische titel in + Afbeelding invoegen + Link invoegen + Klik om een Macro toe te voegen + Tabel invoegen + Laatst aangepast op + Link + Interne link: + Plaats een hekje (“#”) voor voor interne links. + In nieuw venster openen? + Macro Settings + Deze macro heeft geen eigenschappen die u kunt bewerken + Plakken + Bewerk rechten voor + De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is. + De prullenbak is nu leeg. + Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd. + regexlib.com ondervindt momenteel prolemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]> + Zoek naar een regular expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email, 'post-code' 'url' + Verwijder Macro + Verplicht veld + Site is opnieuw geïndexeerd + De site is opnieuw gepubliceerd + De cache zal worden vernieuwd. Alle gepubliseerde content zal worden ge-update, terwijl ongepubliseerde content ongepubliseerd zal blijven. + Aantal kolommen + Aantal regels + Plaats een placeholder id door een ID op uw placeholder te zetten kunt u content plaatsen in deze template vanuit onderliggende templates, + door te referreren naar deze ID door gebruik te maken van een <asp:content /> element.]]> + Selecteer een placeholder id uit onderstaande lijst. U kunt alleen + Id's kiezen van de master van de huidige template..]]> + Klik op de afbeelding voor volledige grootte + Kies een item + Toon cache item + + + Wijzig de verschillende taalversies voor het woordenboek item '%0%'. Je kunt extra talen toevoegen bij 'talen' in het menu links. + Cultuurnaam + + + Toegelaten subnodetypes + Nieuw + Tab verwijderen + Omschrijving + Nieuwe tab + Tab + Miniatuur + + + Prevalue toevoegen + Datebase datatype + Data Editor GUID + Render control + Buttons + Geavanceerde instellingen inschakelen voor + Context menu inschakelen + Maximum standaard grootte van afbeeldingen + Gerelateerde stylesheets + Toon label + Breedte en hoogte + + + Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen herstellen: + Het wachtwoord veranderen wordt door de huidige Membership Provider niet ondersteund (EnablePasswordRetrieval moet op true staan) + %0% bestaat al + Er zijn fouten geconstateerd: + Er zijn fouten geconstateerd: + Het wachtwoord moet minstens %0% tekens lang zijn en moet minstens %1% cijfers bevatten + %0% moet een geheel getal zijn + %0% op tab %1% is een verplicht veld + %0% is een verplicht veld + %0% op tab %1% is niet in het correcte formaat + %0% is niet in het correcte formaat + + + OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is. + Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld! + Er is een probleem met de lees/schrijf rechten op een bestand of map + Vul een titel in + Selecteer een type + U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan? + Fout in python script + Het python script is niet opgeslagen omdat het fouten bevat + Start node is verwijderd, neem contact op met uw systeembeheerder + Markeer de content voordat u de stijl aanpast + Geen actieve stijlen beschikbaar + Plaats de cursor links van de twee cellen die je wilt samenvoegen + Je kunt een cel die is samengevoegd niet delen + Fout in de xslt bron + De xslt is niet opgeslagen omdat deze fout(en) bevat + + + Over + Actie + Toevoegen + Alias + Weet je het zeker? + Rand + of + Annuleren + Cel marge + Kiezen + Sluiten + Venster sluiten + Opmerking + Bevestigen + Verhouding behouden + Doorgaan + Kopiëren + Aanmaken + Databank + Datum + Standaard + Verwijderen + Verwijderd + Verwijderen... + Ontwerp + Afmetingen + Beneden + Download + Aanpassen + Aangepast + Elementen + Email + Fout + Zoeken + Hoogte + Help + Icoon + Importeer + Binnen marge + Invoegen + Installeren + Uitvullen + Taal + Layout + Bezig met laden + Geblokkeerd + Inloggen + Afmelden + Afmelden + Macro + Verplaats + Naam + Nieuw + Volgende + Nee + of + Ok + Open + of + Wachtwoord + Pad + Placeholder ID + Een ogenblik geduld a.u.b. + Vorige + Eigenschappen + Email om formulier te ontvangen + Prullenbak + Overgebleven + Hernoemen + Vernieuw + Opnieuw proberen + Rechten + Zoek + Server + Tonen + Toon pagina bij versturen + Formaat + Sorteren + Type + Type om te zoeken... + Omhoog + Bijwerken + Upgrade + Upload + Url + Gebruiker + Gebruikersnaam + Waarde + Toon + Welkom... + Breedte + Ja + + + Achtergrondkleur + Vet + Tekstkleur + Font + Tekst + + + Pagina + + + De installer kan geen connectie met de database maken. + De web.config kon niet worden opgeslagen. Gelieve de connectiestring handmatig aan te passen. + Je database is gevonden en is geïdentificeerd als + Database configuratie + installeer om de Umbraco %0% database te installeren]]> + Volgende om door te gaan.]]> + De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is.

Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.

Klik op de knop opnieuw proberen als je hiermee klaar bent.
Meer informatie over het aanpassen van de web.config vind je hier.

]]>
+ Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]> + Klik de upgrade knop om je database te upgraden naar Umbraco %0%

Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!

]]>
+ Klik Volgende om verder te gaan.]]> + volgende om door te gaan]]> + Het wachtwoord van de default gebruiker dient veranderd te worden!]]> + De default gebruiker is geblokkeerd of heeft geen toegang tot Umbraco!

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> + Het wachtwoord van de default gebruiker is sinds installatie met succes veranderd.

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> + Het wachtwoord is veranderd! + umbraco maakt een default gebruiker aan met login ('admin') and wachtwoord ('default'). Het is belangrijk dat dit wachtwoord wordt veranderd in iets unieks.

Deze stap controleert het password van de default gebruiker en adviseert of het veranderd dient te worden.

]]>
+ Neem een jumpstart en bekijk onze introductie videos + + Nog niet geïnstalleerd. + Betreffende bestanden en mappen + Meer informatie over het instellen van machtigingen voor umbraco vind je hier + Je dient ASP.NET 'modify' machtiging te geven voor de volgende bestanden/mappen + Je machtigingen zijn bijna perfect!

Je kunt umbraco zonder problemen starten, maar je kunt nog geen packages installeren om volledig van umbraco te profiteren.]]>
+ Hoe op te lossen + Klik hier om de tekst versie te lezen + video tutorial over het instellen van machtigingen voor umbraco, of lees de tekst versie.]]> + Je machtigingen zijn misschien incorrect!

Je kunt umbraco probleemloos starten, maar je kunt nog geen mappen aanmaken of packages installeren om zo volledig van umbraco te profiteren.]]>
+ Je machtigingen zijn nog niet gereed gemaakt voor umbraco!

Om umbraco te starten zul je je machtigingen moeten aanpassen.]]>
+ Je machtigingen zijn perfect!

Je bent nu klaar om umbraco te starten en om packages te installeren!]]>
+ Map probleem wordt opgelost + Volg deze link voor meer informatie over problemen met ASP.NET en het aanmaken van mappen + Machtigingen worden aangepast + umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren. + Ik wil met een lege website beginnen + leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]> + Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen? + Runway is geinstalleerd + Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules]]> + Alleen aanbevolen voor gevorderde gebruikers + Ik wil met een eenvoudige website beginnen + "Runway" is een eenvoudige website die je van enkele elementaire documenttypes en templates voorziet. De installer kan Runway automatisch voor je opzetten, maar je kunt het gemakkelijk aanpassen, uitbreiden of verwijderen. Het is niet vereist en je kunt Umbraco prima zonder Runway gebruiken. + +Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je er voor kiest om Runway te installeren, dan kun je optioneel de bouwstenen (genaamd Runway Modules) kiezen om je Runway pagina's te verbeteren.

Runway omvat: Home pagina, Getting Started pagina, Module installatie pagina.
Optionele Modules: Top Navigatie, Sitemap, Contact, Gallery.
+ ]]>
+ Wat is Runway + Stap 1/5: Licentie aanvaarden + Stap 2/5: Database configureren + Stap 3/5: Controleren van rechten op bestanden + Stap 4/5: Umbraco beveiliging controleren + Stap 5/5: Umbraco is klaar + Bedankt dat je voor Umbraco hebt gekozen + Browse je nieuwe site Je hebt Runway geinstalleerd, dus kijk eens hoe je nieuwe site eruit ziet.]]> + Meer hulp en informatie Vind hulp in onze bekroonde community, blader door de documentatie of bekijk enkele gratis videos over het bouwen van een eenvoudige site, het gebruiken van packages en een overzicht van umbraco terminologie]]> + Umbraco %0% is geïnstalleerd en klaar voor gebruik. + /web.config bestand aanpassen, en de Appsetting key umbracoConfigurationStatus onder in het bestand veranderen naar '%0%'.]]> + meteen beginnen door de "Launch Umbraco" knop hieronder te klikken.
Als je een beginnende umbraco gebruiker bent, dan kun je you can find veel informatie op onze "getting started" pagina's vinden.]]>
+ Launch Umbraco Om je website te beheren open je simpelweg de umbraco back office en begin je content toe te voegen, templates en stylesheets aan te passen of nieuwe functionaliteit toe te voegen]]> + Verbinding met de database mislukt. + Umbraco versie 3 + Umbraco versie 4 + Bekijken + umbraco %0% voor een nieuwe installatie of een upgrade van versie 3.0.

Druk op "volgende" om de wizard te starten.]]>
+ + + Culture Code + Culture Naam + + + Je bent inactief en zult automatisch worden uitgelogd over + Vernieuw sessie om wijzigingen te behouden + + + © 2001 - %0%
umbraco.org

]]>
+ Welkom bij umbraco, geef je gebruikersnaam en wachtwoord op in de onderstaande velden: + + + Dashboard + Secties + Inhoud + + + Selecteer pagina boven... + %0% is gekopieerd naar %1% + Kopieer naar + %0% is verplaatst naar %1% + Verplaats naar + is geselecteerd als root van je nieuwe pagina, klik hieronder op 'ok'. + Nog geen node geselecteerd, selecteer eerst een node in bovenstaade lijst voordat je op 'volgende' klikt + De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type + De huidige node kan niet naar een van zijn subpagina’s worden verplaatst. + Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer kinderen. + + + Bewerk de notificatie voor %0% + + Hi %0%

+ +

Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%' + is uitgevoerd op pagina '%2%' + door gebruiker '%3%' +

+ +

+

Update samenvatting:

+ + %6% +
+

+ + + +

Een prettige dag!

+ Dit is een bericht van uw Content Management Systeem. +

+ ]]>
+ [%0%] Notificatie over %1% uitgevoerd op %2% + Notificaties + + + Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie. + Auteur + Demonstratie + Documentatie + Package meta data + Package naam + Package bevat geen items +
+ Je kunt dit veilig verwijderen door 'verwijder paackage' te klikken. + ]]>
+ Geen upgrades beschikbaar + Package opties + Package leesmij + Package repository + Bevestig verwijderen + Package is verwijderd + De package is succesvol verwijderd + Verwijder package + + Waarschuwing: alle documenten, media etc, die afhankelijk zijn van de items die je verwijderd, zullen niet meer werken en kan leiden tot een instabiele installatie, + wees dus voorzichtig met verwijderen. Als je niet zeker bent, neem dan contact op met de auteur van de package. + ]]> + Download update uit de repository + Upgrade package + Upgrade instructies + Er is een upgrade beschikbaar voor deze package. Je kunt het direct downloaden uit de umbraco package repository. + Package versie + Bekijk de package website + + + Plakken met alle opmaak (Niet aanbevolen) + De tekst die je probeert te plakken bevat speciale karakters en/of opmaak. Dit kan veroorzaakt worden doordat de tekst vanuit Microsoft Word is gekopieerd. Umbraco kan deze speciale karakters en formattering automatisch verwijderen zodat de geplakte tekst geschikt is voor het web. + Plakken als ruwe tekst en alle opmaak verwijderen + Plakken, en verwijder de opmaak (aanbevolen) + + + Geavanceerd: Beveilig door de Member Groups te seecteren die toegang hebben op de pagina + gebruik makend van umbraco's member groups.]]> + role-based authentication.]]> + Error Pagina + Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken + Hoe wil je de pagina beveiligen? + %0% is nu beveiligd + Beveiliging verwijderd van %0% + Login Pagina + Kies de pagina met het login-formulier + Verwijder beveiliging + Kies de pagina's die het login-formulier en de error-berichten bevatten + Kies de roles wie toegang hebben tot deze pagina + Geef de gebruikersnaam en wachtwoord voor deze pagina + Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord + Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord + + + + Inclusief ongepubliceerde kinderen + Publicatie in uitvoering - even geduld... + %0% van %1% pagina’s zijn gepubliceerd... + %0% is gepubliceerd + %0% en onderliggende pagina’s zijn gepubliceerd + Publiceer %0% en alle kinderen + ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.

+ Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle kinderen aan te vinken hieronder. + ]]>
+ + + Externe link toevoegen + Interne link toevoegen + Toevoegen + Bijschrift + Interne pagina + URL + Verplaats omlaag + Verplaats omhoog + Open in nieuw venster + Verwijder link + + + Huidige versie + Rode tekst wordt niet getoond in de geselecteerde versie , groen betekent toegevoegd]]> + Document is teruggezet + Hiermee wordt de geselecteerde versie als html getoond, als u de verschillen tussen de 2 versies tegelijk wilt zien, gebruik dan de diff view + Terugzetten naar + Selecteer versie + Bekijk + + + Bewerk script-bestand + + + Concierge + Content + Courier + Ontwikkelaars + Umbraco Configuratie Wizard + Media + Leden + Nieuwsbrieven + Instellingen + Statistieken + Vertaling + Gebruikers + + + Standaard template + Woordenboek sleutel + Om een bestaand documenttype te importeren, zoek het betreffende “.udt” bestand door op browse en import te klikken. (Je ziet een bevestigingspagina voordat de import start. Als het documenttype al bestaat dan wordt het bijgewerkt.) + Nieuwe tabtitel + Node type + Type + Stylesheet + Stylesheet eigenschap + Tab + Tab titel + Tabs + + + Sorteren gereed. + Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren. +
Sluit dit venster niet tijdens het sorteren]]>
+ + + Publicatie werd geannuleerd door een 3rd party plug-in + Eigenschappen type bestaat al + Eigenschappen type aangemaakt + Data type: %1%]]> + Eigenschappen type verwijderd + Content type opgeslagen + Tab aangemaakt + Tab verwijderd + Tab met id: %0% verwijderd + Stylesheet niet opgeslagen + Stylesheet opgeslagen + Stylesheet opgeslagen zonder fouten + Datatype opgeslagen + Woordenboek item opgeslagen + Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is + Content gepubliceerd + en zichtbaar op de website + Content opgeslagen + Vergeet niet te publiceren om de wijzigingen zichtbaar te maken + Verzend voor goedkeuring + Verandering zijn verstuurd voor goedkeuring + Lid opgeslagen + Stijlsheet eigenschap opgeslagen + Stijlsheet opgeslagen + Template opgeslagen + Fout bij opslaan gebruiker (zie logboek) + Gebruiker opgeslagen + Bestand niet opgeslagen + bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging + Bestand opgeslagen + Bestand opgeslagen zonder fouten + Taal opgeslagen + Python script niet opgeslagen + Python script kon niet worden opgeslagen door een fout + Python script opeslagen! + Geen fouten in python script! + Template niet opgeslagen + Controleer dat je geen 2 tamplates met dezelfde naam hebt + Template opgeslagen + Template opgeslagen zonder fouten! + Xslt niet opgeslagen + Xslt bevat een fout + Xslt kon niet worden opgeslagen, controleer de bestandsbeveiliging + Xslt opgeslagen + Geen fouten in de xslt! + + + Gebruik CSS syntax bijv: h1, .redHeader, .blueTex + Stijlsheet aanpassen + Bewerk stylesheet eigenschap + Naam waarmee de stijl in de editor te kiezen is + Voorbeeld + Stijlen + + + Template aanpassen + Invoegen content area + Invoegen content area placeholder + Invoegen dictionary item + Invoegen Macro + Invoegen umbraco page field + Master template + Quick Guide voor umbraco template tags + Template + + + Alternatief veld + Alternatieve tekst + Kapitalisatie + Selecteer veld + Converteer regelafbreking + ]]> + Ja, alleen datum + Opmaken als datum + HTML-encoderen + Speciale karakters worden geëncodeerd naar HTML. + Zal worden ingevoegd na de veld waarde + Zal worden ingevoegd voor de veld waarde + Kleine letters + Geen + Invoegen na veld + Invoegen voor veld + Recursief + Verwijder paragraaf tags + tags aan het begin en einde van de tekst worden verwijderd]]> + Hoofdletters + URL-encoderen + Speciale karakters in URL's worden geëncodeerd + Zal alleen worden gebruikt waneer de bovenstaande veld waardes leeg zijn + Dit veld zal alleen worden gebruikt als het primaire veld leeg is + Ja, met tijd. Scheidingsteken: + + + Taken aan jou toegewezen + + Sluit taak + Details van vertaling + Download alle vertalingstaken als xml + Download xml + Download xml DTD + Velden + Inclusief onderliggende pagina's + + [%0%] Vertaalopdracht voor %1% + Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd + Taken aangemaakt door jou + die je aanmaakte. Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]> + De pagina '%0%' is verstuurd voor vertaling + Stuur voor vertaling + Toegewezen door + Taak geopend + Totaal aantal woorden + Vertaal naar + Vertaling voltooid. + Je kan een voorbeeld van vertaalde pagina's bekijken door hieronder te klikken. Als de originele pagina gevonden werd, wordt een vergelijking van beide pagina's getoond. + Vertalen niet gelukt, het XML-bestand is mogelijk beschadigd. + Vertalingsopties + Vertaler + Vertaald XML-document uploaden + + + Cachebrowser + Prullenbak + Gemaakte packages + Datatypes + Woordenboek + Geïnstalleerde packages + Installeer skin + Installeer starter kit + Talen + Installeer een lokale package + Macro's + Mediatypes + Leden + Ledengroepen + Rollen + Ledentypes + Documenttypes + Packages + Packages + Python-bestanden + Installeer uit repository + Installeer Runway + Runway modules + Script bestanden + Scripts + Stylesheets + Sjablonen + XSLT Bestanden + + + Nieuwe update beschikbaar + %0% is gereed, klik hier om te downloaden + Er is geen verbinding met de server + Er is een fout opgetreden bij het zoeken naar een update. Bekijk de trace-stack voor verdere informatie. + + + Beheerders + Categorieveld + Verander je wachtwoord + Je kunt je wachtwoord veranderen door onderstaan formulier in te vullen en op de knop 'Verander wachtwoord' te klikken + Content Channel + Doorlinken naar Canvas bij inloggen + Omschrijving + Geblokkeerde gebruiker + Documenttype + Redacteur + Samenvattingsveld + Taal + Loginnaam + Startnode in Mediabibliotheek + Secties + Blokkeer Umbraco toegang + Wachtwoord + Je wachtwoord is veranderd! + Herhaal nieuwe wachtwoord + Voer nieuwe wachtwoord in + Je nieuwe wachtwoord mag niet leeg zijn! + Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw! + Beide wachtwoorden zijn niet hetzelfde! + Vervang rechten op de subnodes + U bent momenteel rechten aan het aanpassen voor volgende pagina's: + Selecteer pagina's om hun rechten aan te passen + Doorzoek alle subnodes + Startnode in Content + Gebruikersnaam + Gebruikersrechten + Gebruikerstype + Gebruikerstypes + Auteur +
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml index ce5d23a286..4b2285cbea 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml @@ -442,7 +442,7 @@ Vennlig hilsen umbraco roboten Hei %0%

Dette er en automatisk mail for å informere om at handlingen '%1%' - er blitt utført på siden '%2%' + er blitt utført på siden '%2%' av brukeren '%3%'

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml index fa6a29de67..292f15c52a 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml @@ -429,7 +429,7 @@ Możesz dalej edytować pod adresem: http://%4%/actions/editContent.aspx?id=%5% Miłego dnia!]]> - Witaj %0%

To jest automatyczny e-mail, wysłany aby poinformować Cię, że polecenie '%1%' zostało wykonane na stronie '%2%' przez użytkownika '%3%'

Podsumowanie zmian:

%6%

Miłego dnia!

Pozdrowienia od robota Umbraco

]]>
+ Witaj %0%

To jest automatyczny e-mail, wysłany aby poinformować Cię, że polecenie '%1%' zostało wykonane na stronie '%2%' przez użytkownika '%3%'

Podsumowanie zmian:

%6%

Miłego dnia!

Pozdrowienia od robota Umbraco

]]>
[%0%] Powiadomienie o %1% wykonane na %2% Powiadomienie diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml index ad9e01c7f0..6bdfd38a9a 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml @@ -1,835 +1,835 @@ - - - - Carlos Casalicchio - http://www.zueuz.net - - - Gerenciar hostnames - Caminho de Auditoria - Navegar o Nó - Copiar - Criar - Criar Pacote - Remover - Desabilitar - Esvaziar Lixeira - Exportar Tipo de Documento - Exportar para .NET - Exportar para .NET - Importar Tipo de Documento - Importar Pacote - Editar na Tela - Sair - Mover - Notificações - Acesso público - Publicar - Recarregar nós - Republicar site inteiro - Permissões - Reversão - Enviar para Publicação - Enviar para Tradução - Classificar - Enviar para publicação - Traduzir - Atualizar - - - Adicionar novo Domínio - Domínio - Novo domínio '%0%' foi criado - Domínio '%0%' foi removido - Domínio '%0%' já foi designado - ou seja: seudominio.com, www.seudominio.com - Domínio '%0%' foi atualizado - Editar Domínios Atuais - - - Visão para - - - Negrito - Remover Travessão de Parágrafo - Inserir campo de formulário - Inserir manchete de gráfico - Editar Html - Travessão de Parágrafo - Itálico - Centro - Justificar à Esquerda - Justificar à Direita - Inserir Link - Inserir link local (âncora) - Lista de tópicos - Lista numérica - Inserir macro - Inserir figura - Editar relacionamentos - Salvar - Salvar e publicar - Salvar e mandar para aprovação - Prévia - Escolha estilo - Mostrar estilos - Inserir tabela - - - Sobre esta página - Link alternativo - (como você descreveria a imagem pelo telefone) - Links Alternativos - Clique para editar este item - Criado por - Criado - Tipo de Documento - Editando - Remover em - Este item foi alterado após a publicação - Este item não está publicado - Última publicação - Tipo de Mídia - Grupo do Membro - Função - Tipo de Membro - Nenhuma data escolhida - Título da Página - Propriedades - Este documento está publicado mas não está visível porque o pai '%0%' não está publicado - Publicar - Status da Publicação - Publicado em - Remover Data - Ordem de classificação está atualizada - Para classificar os nós simplesmente arraste os nós ou clique em um dos títulos de colunas. Você pode selecionar múltiplos nós ao pressionar e segurar 'shift' ou 'control' durante a seleção - Estatísticas - Título (opcional) - Tipo - Des-Publicar - Última edição - Remover arquivo - Link ao documento - - - Onde você quer criar seu novo(a) %0% - Criado em - Escolha um tipo e um título - - - Navegue seu site - - Esconder - Se umbraco não estiver abrindo talvez você precise hablitar pop-ups para este site - foi aberto em uma nova janela - Reiniciar - Visitar - Bem Vindo(a) - - - Nome - Gerenciar hostnames - Fechar esta janela - Certeza em remover - Certeza em desabilitar - Favor selecionar esta caixa para confirmar a remoção de %0% item(s) - Tem certeza - Tem certeza? - Cortar - Editar Item de Dicionário - Editar Linguagem - Inserir link local - Inserir charactere - Inserir manchete de gráfico - Inserir figura - Inserir Link - Inserir Macro - Inserir tabela - Última Edição - Link - Link interno: - Ao usar links locais insira "#" na frente do link - Abrir em nova janela? - Configurações de Macro - Este macro não contém nenhuma propriedade que possa ser editada - Colar - Editar Permissões para - Os itens na lixeira agora estão sendo removidos. Favor não fechar esta janela enquanto este processo é concluído - A lixeira agora está vazia - Quando itens são removidos da lixeira estes somem para sempre - regexlib.com está no momento sofrendo dificuldades dos quais não temos controle. Pedimos desculpas pela inconveniência.]]> - Busque por uma expressão regular para adicionar validação à um campo de formulário. Exemplo: 'email', 'zip-code' (código postal), 'url' - Remover Macro - Campo obrigatório - Site foi re-indexado - O cache do website foi atualizado. Todo conteúdo publicado está atualizado agora. No entanto, todo conteúdo não publicado ainda permanecerá invisível - O cache do website será atualizado. Todo conteúdo publicado será atualizado, enquanto o conteúdo que não foi publicado permanecerá invisível - Número de colunas - Número de linhas - Defina uma id de espaço reservado definindo uma ID em seu espaço reservado você pode injetar conteúdo dentro deste modelo desde modelos filhos usando esta ID como referência dentro de um elemento <asp:content />]]> - Selecione uma id de espaço reservado da lista abaixo. Você pode escolher somente as IDs em seu modelo mestre atual.]]> - Clique para ver a imagem em seu tamanho original - Escolha item - Ver Item em Cache - - - %0%' abaixo
Você pode adicionar mais linguagens sob 'linguagens' no menu à esquerda]]>
- Nome da Cultura - - - Tipos de nós filhos permitidos - Criar - Remover guia - Descrição - Nova guia - Guia - Miniatura - - - Adicionar valor prévio - Tipo de Dados do Banco de Dados - GUID do Editor de Propriedades - Editor de Propriedades - Botões - Habilitar configurações avançadas para - Habilitar menu de contexto - Tamanho padrão máximo para imagens inseridas - Stylesheets relacionadas - Mostrar Rótulo - Largura e altura - - - Seus dados foram salvos mas antes que possa publicar esta página existem alguns erros que precisam ser concertados: - O provedor de membros (Membership provider) atual não suporta alterações de senha (EnablePasswordRetrieval tem que estar definica como true) - %0% já existe - Houve erros: - Houve erros: - A senha deve ter no mínimo %0% caracteres e conter pelo menos %1% caractere(s) não alfa-númérico - %0% tem que ser um inteiro - O campo %0% na guia %1% é mandatório - %0% é um campo mandatório - %0% em %1% não está no formato correto - %0% não está em um formato correto - - - NOTA! Mesmo que CodeMirror esteja habilitado pela configuração o mesmo foi desabilitado em Internet Explorer pois não é estável o suficiente. - Favor preencher ambos apelidos e nome na sua nova propriedade de tipo! - Houve um erro com o acesso de ler/escrever em um arquivo ou pasta específica - Favor digitar um título - Favor escolher um tipo - Você está prestes a tornar esta figura maior que o tamanho original. Tem certeza que deseja proceguir? - Erro no script python - O script pyton não foi salvo por que contém erro(s) - Nó inicial removido, favor entrar em contato com seu administrador - Favor marcar conteúdo antes de alterar o estilo - Nenhum estilo ativo disponível - Favor colocar o cursos à esquerda das duas células que deseja mesclar - Você não pode dividir uma célula que não foi mesclada. - Erro na fonta xslt - O XSLT não foi salvo porque contém erro(s) - - - Sobre - Ação - Adicionar - Apelido - Tem certeza? - Borda - por - Cancelar - Margem da célula - Escolher - Fechar - Fechar Janela - Comentário - Confirmar - Restrições de proporções - Continuar - Copiar - Criar - Banco de Dados - Data - Padrão - Remover - Removido - Removendo... - Desenho - Dimensões - Abaixo - Download - Editar - Editado - Elementos - Email - Erro - Buscar - Altura - Ajuda - Ícone - Importar - Margem interna - Inserir - Instalar - Justificar - Idioma - Esboço - Carregando - Travado - Login - Sair - Logout - Macro - Mover - Nome - Novo - Próximo - Não - de - OK - Abrir - ou - Senha - Caminho - ID do Espaço Reservado - Um momento por favor... - Prévio - Propriedades - Email para receber dados do formulário - Lixeira - Remanescentes - Renomear - Renovar - Tentar novamente - Permissões - Busca - Servidor - Mostrar - Mostrar página durante envio - Tamanho - Classificar - Tipo - Digite para buscar... - Acima - Atualizar - Atualizar - Subir (Upload) - Url - Usuário - Usuário - Valor - Ver - Bem Vindo(a)... - Largura - Sim - - - Cor de fundo - Negrito - Cor do Texto - Fonte - Texto - - - Página - - - O instalador não pôde conectar-se ao banco de dados. - Não foi possível salvar o arquivo web.config. Favor modificar a linha de conexão manualmente. - Seu banco de dados foi encontrado e identificado como - Configuração do Banco de Dados - instalar para instalar o banco de dados do Umbraco %0%]]> - Próximo para prosseguir.]]> - Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.

-

Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "umbracoDbDSN" e salve o arquivo

-

Clique o botão tentar novamente quando terminar.
- Mais informações em como editar o web.config aqui.

]]>
- Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]> - - Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%

-

- Não se preocupe - nenhum conteúdo será removido e tudo estará funcionando depois disto!

- - ]]>
- Pressione Próximo para prosseguir.]]> - próximo para continuar com o assistente de configuração]]> - A senha do usuário padrão precisa ser alterada!]]> - O usuário padrão foi desabilitado ou não tem acesso à umbraco!

Nenhuma ação posterior precisa ser tomada. Clique Próximo para prosseguir.]]> - A senha do usuário padrão foi alterada com sucesso desde a instalação!

Nenhuma ação posterior é necessária. Clique Próximo para prosseguir.]]> - Senha foi alterada! - - umbraco cria um usuário padrão com o login ('admin') e senha ('default'). É importante que a senha seja alterada para algo único. -

-

- Este passo irá checar a senha do usuário padrão e sugerir uma alteração se necessário. -

- - ]]>
- Comece com o pé direito, assista nossos vídeos introdutórios - Ao clicar no próximo botão (ou modificando o umbracoConfigurationStatus no web.config), você aceita a licença deste software cmo especificado na caixa abaixo. Note que esta distribuição de umbraco consiste em duas licenças diferentes, a licença aberta MIT para a framework e a licença de software livre (freeware) umbraco que cobre o UI. - Nenhum instalado ainda. - Pastas e arquivos afetados - Mais informações em como configurar permissões para umbraco aqui - Você precisa conceder permissão de modificação ASP.NET aos seguintes arquivos/pastas - Suas permissões estão quase perfeitas!

-Você pode correr umbraco sem problemas, mas não vai ser capaz de instalar pacotes que são recomendados para tirar total vantagem de umbraco.]]>
- Como Resolver - Clique aqui para ler a versão texto - vídeo tutorial sobre configuração de permissões de pastas para umbraco ou leia a versão texto.]]> - Suas permissões podem ser um problema! -

-Você pode correr umbraco sem problemas mas não será capaz de criar pastas ou instalar pacotes que são recomendados para tirar total vantagem de umbraco.]]>
- Suas permissões não estão prontas para umbraco! -

-Para correr umbraco você vai precisar atualizar as configurações de permissões.]]>
- Suas configurações de permissões estão perfeitas!

Você está pronto para correr o umbraco e instalar pacotes!]]>
- Resolvendo problemas de pastas - Siga este link para mais informações sobre problemas com ASP.NET e criação de pastas - Configurando permissões de pastas - - Eu quero começar do zero - learn how) - Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]> - Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir? - Runway está instalado - -Esta é nossa lista de módulos recomendados, selecione os que gostaria de instalar, ou veja a lista completa de módulos]]> - Somente recomendado para usuários experientes - Eu quero começar com um site simples - - "Runway" é um website simples que provê alguns documentos básicos e modelos. O instalador pode configurar Runway automaticamente mas você pode editar facilmente, extender ou removê-lo. Não é necessário e você pode perfeitamente usar Umbraco sem ele. -No entanto, Runway oferece uma fundação básica sobre melhores práticas em como começar o mais rápido possível. -Se escolher instalar Runway você pode opcionalmente selecionar blocos de construção básicos chamados módulos Runway para melhorar suas páginas Runway.

- - Incluso com Runway: Página Inicial, Começando, Instalando Módulos.
- Módulos Opcionais: Navegação de Topo, Mapa de Site, Contato, Galeria. -
- - ]]>
- O que é Runway - Passo 1/5 Aceitar Licença - Passo 2/5: Configuração do Banco de Dados - Passo 3/5: Validando Permissões de Arquivos - Passo 4/5: Checar segurança umbraco - Passo 5/5: Umbraco está pronto para ser usado - Obrigado por escolher umbraco - Navegue seu site -Você instalou Runway, então por que não ver como é seu novo website.]]> - Ajuda adicional e informações -Consiga ajuda de nossa comunidade ganhadora de prêmios, navegue a documentação e assista alguns vídeos grátis sobre como construir um site simples, como usar pacotes e um guia prático sobre a terminologia umbraco]]> - Umbraco %0% está instalado e pronto para uso - web.config e atualizar a chave AppSettings umbracoConfigurationStatus no final para '%0%'.]]> - iniciar instantâneamente clicando em "Lançar Umbraco" abaixo.
Se você é novo com umbraco você pode encontrar vários recursos em nossa página para iniciantes.]]>
- Lançar Umbraco -Para gerenciar seu website, simplesmente abra a área administrativa do umbraco para começar adicionando conteúdo, atualizando modelos e stylesheets e adicionando nova funcionalidade]]> - Conexão ao banco falhou. - Umbraco Versão 3 - Umbraco Versão 4 - Assistir - umbraco %0% para uma nova instalação ou atualizando desde verão 3.0. -

-Pressione "próximo" para iniciar o assistente.]]>
- - - Código da Cultura - Nome da Cultura - - - Você está inativo e logout irá ocorrer automaticamente em - Renovar agora para salvar seu trabalho - - - © 2001 - %0%
umbraco.org

]]>
- Bem vindo(a) à Umbraco, digite seu nome de usuário e senha nas caixas abaixo: - - - Painel - Seções - Conteúdo - - - Escolha página acima... - %0% foi copiado para %1% - Selecione onde o documento %0% deve ser copiado abaixo - %0% foi movido para %1% - Selecione onde o documento %0% dever ser movido abaixo - foi selecionado como raíz do seu novo conteúdo, clique 'ok' abaixo. - Nenhum nó selecionado, favor selecionar um nó na lista acima antes de clicar em 'ok' - O nó atual não é permitido embaixo do nó escolhido por causa de seu tipo - O nó atual não pode ser movido para uma de suas sub-páginas - TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' - - - Editar sua notificação para %0% - - Olá %0%

- -

Esta é uma mensagem automatizada para informar que a tarefa '%1%' - foi completada na página '%2%' - pelo usuário '%3%' -

- -

-

Resumo da Atualização:

- - %6% -
-

- - - -

Tenha um bom dia!

- Saudações do robô umbraco -

- ]]>
- [%0%] Notificação sobre %1% realizada em %2% - Notificações - - - e localizando o pacote. Pacotes umbraco tem extensão ".umb" ou ".zip".]]> - Autor - Demonstração - Documentação - Dado meta do pacote - Nome do pacote - Pacote não contém nenhum item -
-Você pode remover com segurança do seu sistema clicando em "desinstalar pacote" abaixo.]]>
- Nenhuma atualização disponível - Oções do pacote - Leia-me do pacote - Repositório do pacote - Confirmar desinstalação - Pacote foi desinstalado - O pacote foi desinstalado com sucesso - Desinstalar pacote - -Aviso: quaisquer documentos, mídia, etc dependentes dos itens que forem removidos vão parar de funcionar e podem levar à instabilidade do sistema. Então desinstale com cuidado. Se tiver dúvidas, contate o autor do pacote]]> - Baixar atualização pelo repositório - Atualizar pacote - Instruções de atualização - Há uma atualizaçào disponível para este pacote. Você pode baixá-lo diretamente do repositório de pacotes do umbraco. - Versão do pacote - Ver website do pacote - - - Colar com formatação completa (Não recomendado) - O texto que você está tentando colar contém caracteres ou formatação especial. Isto pode ser causado ao copiar textos diretamente do Microsoft Word. Umbraco pode remover os caracteres ou formatação especial automaticamente para que o conteúdo colado seja mais adequado para a internet. - Colar como texto crú sem nenhuma formatação - Colar, mas remover formatação (Recomendado) - - - Proteção baseada em função - usando grupos de membros do umbraco.]]> - autenticação baseada em função.]]> - Página de Erro - Usado quando as pessoas estão logadas, mas não para ter acesso - Escolha como restringir o acesso à esta página - %0% agora está protegido - Proteção removida de %0% - Página de Login - Escolha a página que tem o formulário de login - Remover Proteção - Selecione as páginas que contém o formulário de login e mensagens de erro - Escolha as funções que terão acesso à esta página - Defina o login e senha para esta página - Proteção à um usuário específico - Se você deseja configurar proteção simples usando somente um usuário e senha - - - %0% não pode ser publicado devido à uma extensão de terceiros que cancelou a ação. - Incluir páginas filhas ainda não publicadas - Publicação em progresso - favor aguardar... - %0% de %1% páginas foram publicadas... - %0% foi publicada - %0% e sub-páginas foram publicadas - Publicar %0% e todoas suas sub-páginas - ok para publicar %0% e assim fazer com que seu conteúdo se torne disponível.

-Você pode publicar esta página e todas suas sub-páginas ao selecionar publicar todos filhos abaixo.]]>
- - - Adicionar link externo - Adicionar link interno - Adicionar - Legenda - Página interna - URL - Mover Abaixo - Mover Acima - Abrir em nova janela - Remover Link - - - Versão atual - Texto vermelho não será mostrado na versão selecionada; verde significa adicionado]]> - Documento foi revertido - Isto mostra a versão selecionada como html se você deseja ver as diferenças entre as 2 versões ao mesmo tempo use a visão em diff - Reverter à - Selecione versão - Ver - - - Editar arquivo de script - - - Porteiro - Conteúdo - Mensageiro - Desenvolvedor - Assistente de Configuração Umbraco - Mídia - Membros - Boletins Informativos - Configurações - Estatísticas - Tradução - Usuários - - - Modelo padrão - Chave do Dicionário - Para importar um tipo de documento encontre o arquivo ".udt" em seu computador clicando em "Navegar" e depois clicando em "Importar"(você pode confirmar na próxima tela) - Novo Título da Guia - Tipo de Nó - Tipo - Stylesheet - Propriedade de Stylesheet - Guia - Título da Guia - Guias - - - Classificação concluída. - Arraste os diferentes itens para cima ou para baixo para definir como os mesmos serão arranjados. Ou clique no título da coluna para classificar a coleção completa de itens -
Não feche esta janela durante a classificação]]>
- - - Publicação foi cancelada por add-in de terceiros - Tipo de propriedade já existe - Tipo de propriedade criada - Tipo de Dado: %1%]]> - Tipo de propriedade removido - Tipo de Documento salvo - Guia criada - Guia removida - Guia com ID: %0% removida - Stylesheet não salva - Stylesheet salva - Stylesheet salva sem nenhum erro - Typo de Dado salvo - Item de Dicionário salvo - Publicação falhou porque a página pai não está publicada - Conteúdo publicado - e visível no website - Conteúdo salvo - Lembre-se de publicar para tornar as mudanças visíveis - Enviado para Aprovação - Alterações foram enviadas para aprovação - Membro salvo - Propriedade de Stylesheet salva - Stylesheet salva - Modelo salvo - Erro ao salvar usuário (verificar log) - Usuário Salvo - Arquivo não salvo - Arquivo não pode ser salvo. Favor checar as permissões do arquivo - Arquivo salvo - Arquivo salvo sem nenhum erro - Linguagem salva - Script Python não salvo - Script python não pode ser salvo devido à erro - Script Python salvo - Nenhum erro no script python - Modelo não salvo - Favor confirmar que não existem 2 modelos com o mesmo apelido - Modelo salvo - Modelo salvo sem nenhum erro! - Xslt não salvo - Xslt continha um erro - Xslt não pode ser salvo, cheque as permissões do arquivo - Xslt salvo - Nenhum erro no xslt - - - Use sintaxe CSS ex: h1, .redHeader, .blueTex - Editar stylesheet - Editar propriedade do stylesheet - Nome para identificar a propriedade de estilo no editor de texto rico (richtext) - Prévia - Estilos - - - Editar modelo - Inserir área de conteúdo - Inserir área de conteúdo em espaço reservado - Inserir item de dicionário - Inserir Macro - Inserir campo de página umbraco - Modelo mestre - Guia rápido para etiquetas de modelos umbraco - Modelo - - - Campo alternativo - Texto alternativo - Letra Maíscula ou minúscula - Escolha campo - Converter Quebra de Linhas - Substitui quebra de linhas com a etiqueta html &lt;br&gt; - Sim, Data somente - Formatar como data - Codificar HTML - Vai substituir caracteres especiais por seus equivalentes em HTML. - Será inserida após o valor do campo - Será inserida antes do valor do campo - Minúscula - Nenhum - Inserir após campo - Inserir antes do campo - Recursivo - Remover etiquetas de parágrafo - Removerá quaisquer &lt;P&gt; do começo ao fim do texto - Maiúscula - Codificar URL - Vai formatar caracteres especiais em URLs - Será usado somente quando os valores nos campos acima estiverem vazios - Este campo somente será usado se o campo primário estiver em vazio - Sim, com hora. Separador: - - - Tarefas designadas à você - designadas à você. Para ver os detalhes, incluinddo comentários, clique em "Detalhes" ou no nome da página. -Você também pode baixar a página como XML ao clicar no link "Download XML".
-Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
- fechar tarefa - Detalhes da Tradução - Download todas as tarefas de tradução como xml - Download Xml - Download Xml DTD - Campos - Incluir sub-páginas - - Tarefa de tradução [%0%] para %1% - Nenhum usuário tradutor encontrado. Favor criar um usuário tradutor antes que possa começar a enviar conteúdo para tradução - Tarefas criadas por você - criadas por você. Para ver os detalhes, incluindo comentários, clique em "Detalhes" ou no nome da página. Você também pode baixar a página em XML ao clicar no link "Download XML". -Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]> - A página '%0%' foi enviada para tradução - Enviar página '%0%' para tradução - Designada por - Tarefa aberta - Total de palavras - Traduzir para - Tradução concluída. - Você pode visualizar as páginas que acaba de traduzir ao clicar abaixo. Se a página original for encontrada você poderá fazer a comparação entre as 2 páginas. - Tradução falhou, o arquivo xml pode estar corrupto - Opções de Tradução - Tradutor - Upload Xml de Tradução - - - Navegador de Cache - Lixeira - Pacotes criados - Tipo de Dado - Dicionário - Pacotes instalados - Instalar tema - Instalar kit de iniciante - Linguagens - Instalar pacote local - Macros - Tipos de Mídia - Membros - Grupos de Membros - Funções - Tipo de Membro - Tipos de Documentos - Pacotes - Pacotes - Arquivos Python - Instalar desde o repositório - Instalar Runway - Módulos Runway - Arquivos de Script - Scripts - Stylesheets - Modelos - Arquivos XSLT - - - Nova atualização pronta - %0% está pronto, clique aqui para download - Nenhuma conexão ao servidor - Erro ao procurar por atualização. Favor revisar os detalhes (stack-trace) para mais informações - - - Administrador - Campo de Categoria - Alterar Sua Senha - você pode alterar sua senha para acessar a área administrativa do Umbraco preenchendo o formulário abaixo e clicando no botão 'Alterar Senha' - Canal de Conteúdo - Redirecionar à Tela de Edição após login - Campo de descrição - Desabilitar Usuário - Tipo de Documento - Editor - Campo de excerto - Linguagem - Login - Nó Inicial na Biblioteca de Mídia - Seções - Desabilitar Acesso Umbraco - Senha - Sua senha foi alterada! - Favor confirmar sua nova senha - Digite sua nova senha - Sua nova senha não pode estar em branco! - Há uma diferença entre a nova senha e a confirmação da senha. Favor tentar novamente! - A confirmação da senha não é igual à nova senha! - Substituir permissões do nó filho - Vocês está modificando permissões para as páginas no momento: - Selecione páginas para modificar suas permissões - Buscar todos filhos - Nó Inicial do Conteúdo - Nome de Usuário - Permissões de usuário - Tipo de usuário - Tipos de usuários - Escrevente - -
+ + + + Carlos Casalicchio + http://www.zueuz.net + + + Gerenciar hostnames + Caminho de Auditoria + Navegar o Nó + Copiar + Criar + Criar Pacote + Remover + Desabilitar + Esvaziar Lixeira + Exportar Tipo de Documento + Exportar para .NET + Exportar para .NET + Importar Tipo de Documento + Importar Pacote + Editar na Tela + Sair + Mover + Notificações + Acesso público + Publicar + Recarregar nós + Republicar site inteiro + Permissões + Reversão + Enviar para Publicação + Enviar para Tradução + Classificar + Enviar para publicação + Traduzir + Atualizar + + + Adicionar novo Domínio + Domínio + Novo domínio '%0%' foi criado + Domínio '%0%' foi removido + Domínio '%0%' já foi designado + ou seja: seudominio.com, www.seudominio.com + Domínio '%0%' foi atualizado + Editar Domínios Atuais + + + Visão para + + + Negrito + Remover Travessão de Parágrafo + Inserir campo de formulário + Inserir manchete de gráfico + Editar Html + Travessão de Parágrafo + Itálico + Centro + Justificar à Esquerda + Justificar à Direita + Inserir Link + Inserir link local (âncora) + Lista de tópicos + Lista numérica + Inserir macro + Inserir figura + Editar relacionamentos + Salvar + Salvar e publicar + Salvar e mandar para aprovação + Prévia + Escolha estilo + Mostrar estilos + Inserir tabela + + + Sobre esta página + Link alternativo + (como você descreveria a imagem pelo telefone) + Links Alternativos + Clique para editar este item + Criado por + Criado + Tipo de Documento + Editando + Remover em + Este item foi alterado após a publicação + Este item não está publicado + Última publicação + Tipo de Mídia + Grupo do Membro + Função + Tipo de Membro + Nenhuma data escolhida + Título da Página + Propriedades + Este documento está publicado mas não está visível porque o pai '%0%' não está publicado + Publicar + Status da Publicação + Publicado em + Remover Data + Ordem de classificação está atualizada + Para classificar os nós simplesmente arraste os nós ou clique em um dos títulos de colunas. Você pode selecionar múltiplos nós ao pressionar e segurar 'shift' ou 'control' durante a seleção + Estatísticas + Título (opcional) + Tipo + Des-Publicar + Última edição + Remover arquivo + Link ao documento + + + Onde você quer criar seu novo(a) %0% + Criado em + Escolha um tipo e um título + + + Navegue seu site + - Esconder + Se umbraco não estiver abrindo talvez você precise hablitar pop-ups para este site + foi aberto em uma nova janela + Reiniciar + Visitar + Bem Vindo(a) + + + Nome + Gerenciar hostnames + Fechar esta janela + Certeza em remover + Certeza em desabilitar + Favor selecionar esta caixa para confirmar a remoção de %0% item(s) + Tem certeza + Tem certeza? + Cortar + Editar Item de Dicionário + Editar Linguagem + Inserir link local + Inserir charactere + Inserir manchete de gráfico + Inserir figura + Inserir Link + Inserir Macro + Inserir tabela + Última Edição + Link + Link interno: + Ao usar links locais insira "#" na frente do link + Abrir em nova janela? + Configurações de Macro + Este macro não contém nenhuma propriedade que possa ser editada + Colar + Editar Permissões para + Os itens na lixeira agora estão sendo removidos. Favor não fechar esta janela enquanto este processo é concluído + A lixeira agora está vazia + Quando itens são removidos da lixeira estes somem para sempre + regexlib.com está no momento sofrendo dificuldades dos quais não temos controle. Pedimos desculpas pela inconveniência.]]> + Busque por uma expressão regular para adicionar validação à um campo de formulário. Exemplo: 'email', 'zip-code' (código postal), 'url' + Remover Macro + Campo obrigatório + Site foi re-indexado + O cache do website foi atualizado. Todo conteúdo publicado está atualizado agora. No entanto, todo conteúdo não publicado ainda permanecerá invisível + O cache do website será atualizado. Todo conteúdo publicado será atualizado, enquanto o conteúdo que não foi publicado permanecerá invisível + Número de colunas + Número de linhas + Defina uma id de espaço reservado definindo uma ID em seu espaço reservado você pode injetar conteúdo dentro deste modelo desde modelos filhos usando esta ID como referência dentro de um elemento <asp:content />]]> + Selecione uma id de espaço reservado da lista abaixo. Você pode escolher somente as IDs em seu modelo mestre atual.]]> + Clique para ver a imagem em seu tamanho original + Escolha item + Ver Item em Cache + + + %0%' abaixo
Você pode adicionar mais linguagens sob 'linguagens' no menu à esquerda]]>
+ Nome da Cultura + + + Tipos de nós filhos permitidos + Criar + Remover guia + Descrição + Nova guia + Guia + Miniatura + + + Adicionar valor prévio + Tipo de Dados do Banco de Dados + GUID do Editor de Propriedades + Editor de Propriedades + Botões + Habilitar configurações avançadas para + Habilitar menu de contexto + Tamanho padrão máximo para imagens inseridas + Stylesheets relacionadas + Mostrar Rótulo + Largura e altura + + + Seus dados foram salvos mas antes que possa publicar esta página existem alguns erros que precisam ser concertados: + O provedor de membros (Membership provider) atual não suporta alterações de senha (EnablePasswordRetrieval tem que estar definica como true) + %0% já existe + Houve erros: + Houve erros: + A senha deve ter no mínimo %0% caracteres e conter pelo menos %1% caractere(s) não alfa-númérico + %0% tem que ser um inteiro + O campo %0% na guia %1% é mandatório + %0% é um campo mandatório + %0% em %1% não está no formato correto + %0% não está em um formato correto + + + NOTA! Mesmo que CodeMirror esteja habilitado pela configuração o mesmo foi desabilitado em Internet Explorer pois não é estável o suficiente. + Favor preencher ambos apelidos e nome na sua nova propriedade de tipo! + Houve um erro com o acesso de ler/escrever em um arquivo ou pasta específica + Favor digitar um título + Favor escolher um tipo + Você está prestes a tornar esta figura maior que o tamanho original. Tem certeza que deseja proceguir? + Erro no script python + O script pyton não foi salvo por que contém erro(s) + Nó inicial removido, favor entrar em contato com seu administrador + Favor marcar conteúdo antes de alterar o estilo + Nenhum estilo ativo disponível + Favor colocar o cursos à esquerda das duas células que deseja mesclar + Você não pode dividir uma célula que não foi mesclada. + Erro na fonta xslt + O XSLT não foi salvo porque contém erro(s) + + + Sobre + Ação + Adicionar + Apelido + Tem certeza? + Borda + por + Cancelar + Margem da célula + Escolher + Fechar + Fechar Janela + Comentário + Confirmar + Restrições de proporções + Continuar + Copiar + Criar + Banco de Dados + Data + Padrão + Remover + Removido + Removendo... + Desenho + Dimensões + Abaixo + Download + Editar + Editado + Elementos + Email + Erro + Buscar + Altura + Ajuda + Ícone + Importar + Margem interna + Inserir + Instalar + Justificar + Idioma + Esboço + Carregando + Travado + Login + Sair + Logout + Macro + Mover + Nome + Novo + Próximo + Não + de + OK + Abrir + ou + Senha + Caminho + ID do Espaço Reservado + Um momento por favor... + Prévio + Propriedades + Email para receber dados do formulário + Lixeira + Remanescentes + Renomear + Renovar + Tentar novamente + Permissões + Busca + Servidor + Mostrar + Mostrar página durante envio + Tamanho + Classificar + Tipo + Digite para buscar... + Acima + Atualizar + Atualizar + Subir (Upload) + Url + Usuário + Usuário + Valor + Ver + Bem Vindo(a)... + Largura + Sim + + + Cor de fundo + Negrito + Cor do Texto + Fonte + Texto + + + Página + + + O instalador não pôde conectar-se ao banco de dados. + Não foi possível salvar o arquivo web.config. Favor modificar a linha de conexão manualmente. + Seu banco de dados foi encontrado e identificado como + Configuração do Banco de Dados + instalar para instalar o banco de dados do Umbraco %0%]]> + Próximo para prosseguir.]]> + Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.

+

Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "umbracoDbDSN" e salve o arquivo

+

Clique o botão tentar novamente quando terminar.
+ Mais informações em como editar o web.config aqui.

]]>
+ Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]> + + Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%

+

+ Não se preocupe - nenhum conteúdo será removido e tudo estará funcionando depois disto!

+ + ]]>
+ Pressione Próximo para prosseguir.]]> + próximo para continuar com o assistente de configuração]]> + A senha do usuário padrão precisa ser alterada!]]> + O usuário padrão foi desabilitado ou não tem acesso à umbraco!

Nenhuma ação posterior precisa ser tomada. Clique Próximo para prosseguir.]]> + A senha do usuário padrão foi alterada com sucesso desde a instalação!

Nenhuma ação posterior é necessária. Clique Próximo para prosseguir.]]> + Senha foi alterada! + + umbraco cria um usuário padrão com o login ('admin') e senha ('default'). É importante que a senha seja alterada para algo único. +

+

+ Este passo irá checar a senha do usuário padrão e sugerir uma alteração se necessário. +

+ + ]]>
+ Comece com o pé direito, assista nossos vídeos introdutórios + Ao clicar no próximo botão (ou modificando o umbracoConfigurationStatus no web.config), você aceita a licença deste software cmo especificado na caixa abaixo. Note que esta distribuição de umbraco consiste em duas licenças diferentes, a licença aberta MIT para a framework e a licença de software livre (freeware) umbraco que cobre o UI. + Nenhum instalado ainda. + Pastas e arquivos afetados + Mais informações em como configurar permissões para umbraco aqui + Você precisa conceder permissão de modificação ASP.NET aos seguintes arquivos/pastas + Suas permissões estão quase perfeitas!

+Você pode correr umbraco sem problemas, mas não vai ser capaz de instalar pacotes que são recomendados para tirar total vantagem de umbraco.]]>
+ Como Resolver + Clique aqui para ler a versão texto + vídeo tutorial sobre configuração de permissões de pastas para umbraco ou leia a versão texto.]]> + Suas permissões podem ser um problema! +

+Você pode correr umbraco sem problemas mas não será capaz de criar pastas ou instalar pacotes que são recomendados para tirar total vantagem de umbraco.]]>
+ Suas permissões não estão prontas para umbraco! +

+Para correr umbraco você vai precisar atualizar as configurações de permissões.]]>
+ Suas configurações de permissões estão perfeitas!

Você está pronto para correr o umbraco e instalar pacotes!]]>
+ Resolvendo problemas de pastas + Siga este link para mais informações sobre problemas com ASP.NET e criação de pastas + Configurando permissões de pastas + + Eu quero começar do zero + learn how) + Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]> + Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir? + Runway está instalado + +Esta é nossa lista de módulos recomendados, selecione os que gostaria de instalar, ou veja a lista completa de módulos]]> + Somente recomendado para usuários experientes + Eu quero começar com um site simples + + "Runway" é um website simples que provê alguns documentos básicos e modelos. O instalador pode configurar Runway automaticamente mas você pode editar facilmente, extender ou removê-lo. Não é necessário e você pode perfeitamente usar Umbraco sem ele. +No entanto, Runway oferece uma fundação básica sobre melhores práticas em como começar o mais rápido possível. +Se escolher instalar Runway você pode opcionalmente selecionar blocos de construção básicos chamados módulos Runway para melhorar suas páginas Runway.

+ + Incluso com Runway: Página Inicial, Começando, Instalando Módulos.
+ Módulos Opcionais: Navegação de Topo, Mapa de Site, Contato, Galeria. +
+ + ]]>
+ O que é Runway + Passo 1/5 Aceitar Licença + Passo 2/5: Configuração do Banco de Dados + Passo 3/5: Validando Permissões de Arquivos + Passo 4/5: Checar segurança umbraco + Passo 5/5: Umbraco está pronto para ser usado + Obrigado por escolher umbraco + Navegue seu site +Você instalou Runway, então por que não ver como é seu novo website.]]> + Ajuda adicional e informações +Consiga ajuda de nossa comunidade ganhadora de prêmios, navegue a documentação e assista alguns vídeos grátis sobre como construir um site simples, como usar pacotes e um guia prático sobre a terminologia umbraco]]> + Umbraco %0% está instalado e pronto para uso + web.config e atualizar a chave AppSettings umbracoConfigurationStatus no final para '%0%'.]]> + iniciar instantâneamente clicando em "Lançar Umbraco" abaixo.
Se você é novo com umbraco você pode encontrar vários recursos em nossa página para iniciantes.]]>
+ Lançar Umbraco +Para gerenciar seu website, simplesmente abra a área administrativa do umbraco para começar adicionando conteúdo, atualizando modelos e stylesheets e adicionando nova funcionalidade]]> + Conexão ao banco falhou. + Umbraco Versão 3 + Umbraco Versão 4 + Assistir + umbraco %0% para uma nova instalação ou atualizando desde verão 3.0. +

+Pressione "próximo" para iniciar o assistente.]]>
+ + + Código da Cultura + Nome da Cultura + + + Você está inativo e logout irá ocorrer automaticamente em + Renovar agora para salvar seu trabalho + + + © 2001 - %0%
umbraco.org

]]>
+ Bem vindo(a) à Umbraco, digite seu nome de usuário e senha nas caixas abaixo: + + + Painel + Seções + Conteúdo + + + Escolha página acima... + %0% foi copiado para %1% + Selecione onde o documento %0% deve ser copiado abaixo + %0% foi movido para %1% + Selecione onde o documento %0% dever ser movido abaixo + foi selecionado como raíz do seu novo conteúdo, clique 'ok' abaixo. + Nenhum nó selecionado, favor selecionar um nó na lista acima antes de clicar em 'ok' + O nó atual não é permitido embaixo do nó escolhido por causa de seu tipo + O nó atual não pode ser movido para uma de suas sub-páginas + TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + + + Editar sua notificação para %0% + + Olá %0%

+ +

Esta é uma mensagem automatizada para informar que a tarefa '%1%' + foi completada na página '%2%' + pelo usuário '%3%' +

+ +

+

Resumo da Atualização:

+ + %6% +
+

+ + + +

Tenha um bom dia!

+ Saudações do robô umbraco +

+ ]]>
+ [%0%] Notificação sobre %1% realizada em %2% + Notificações + + + e localizando o pacote. Pacotes umbraco tem extensão ".umb" ou ".zip".]]> + Autor + Demonstração + Documentação + Dado meta do pacote + Nome do pacote + Pacote não contém nenhum item +
+Você pode remover com segurança do seu sistema clicando em "desinstalar pacote" abaixo.]]>
+ Nenhuma atualização disponível + Oções do pacote + Leia-me do pacote + Repositório do pacote + Confirmar desinstalação + Pacote foi desinstalado + O pacote foi desinstalado com sucesso + Desinstalar pacote + +Aviso: quaisquer documentos, mídia, etc dependentes dos itens que forem removidos vão parar de funcionar e podem levar à instabilidade do sistema. Então desinstale com cuidado. Se tiver dúvidas, contate o autor do pacote]]> + Baixar atualização pelo repositório + Atualizar pacote + Instruções de atualização + Há uma atualizaçào disponível para este pacote. Você pode baixá-lo diretamente do repositório de pacotes do umbraco. + Versão do pacote + Ver website do pacote + + + Colar com formatação completa (Não recomendado) + O texto que você está tentando colar contém caracteres ou formatação especial. Isto pode ser causado ao copiar textos diretamente do Microsoft Word. Umbraco pode remover os caracteres ou formatação especial automaticamente para que o conteúdo colado seja mais adequado para a internet. + Colar como texto crú sem nenhuma formatação + Colar, mas remover formatação (Recomendado) + + + Proteção baseada em função + usando grupos de membros do umbraco.]]> + autenticação baseada em função.]]> + Página de Erro + Usado quando as pessoas estão logadas, mas não para ter acesso + Escolha como restringir o acesso à esta página + %0% agora está protegido + Proteção removida de %0% + Página de Login + Escolha a página que tem o formulário de login + Remover Proteção + Selecione as páginas que contém o formulário de login e mensagens de erro + Escolha as funções que terão acesso à esta página + Defina o login e senha para esta página + Proteção à um usuário específico + Se você deseja configurar proteção simples usando somente um usuário e senha + + + %0% não pode ser publicado devido à uma extensão de terceiros que cancelou a ação. + Incluir páginas filhas ainda não publicadas + Publicação em progresso - favor aguardar... + %0% de %1% páginas foram publicadas... + %0% foi publicada + %0% e sub-páginas foram publicadas + Publicar %0% e todoas suas sub-páginas + ok para publicar %0% e assim fazer com que seu conteúdo se torne disponível.

+Você pode publicar esta página e todas suas sub-páginas ao selecionar publicar todos filhos abaixo.]]>
+ + + Adicionar link externo + Adicionar link interno + Adicionar + Legenda + Página interna + URL + Mover Abaixo + Mover Acima + Abrir em nova janela + Remover Link + + + Versão atual + Texto vermelho não será mostrado na versão selecionada; verde significa adicionado]]> + Documento foi revertido + Isto mostra a versão selecionada como html se você deseja ver as diferenças entre as 2 versões ao mesmo tempo use a visão em diff + Reverter à + Selecione versão + Ver + + + Editar arquivo de script + + + Porteiro + Conteúdo + Mensageiro + Desenvolvedor + Assistente de Configuração Umbraco + Mídia + Membros + Boletins Informativos + Configurações + Estatísticas + Tradução + Usuários + + + Modelo padrão + Chave do Dicionário + Para importar um tipo de documento encontre o arquivo ".udt" em seu computador clicando em "Navegar" e depois clicando em "Importar"(você pode confirmar na próxima tela) + Novo Título da Guia + Tipo de Nó + Tipo + Stylesheet + Propriedade de Stylesheet + Guia + Título da Guia + Guias + + + Classificação concluída. + Arraste os diferentes itens para cima ou para baixo para definir como os mesmos serão arranjados. Ou clique no título da coluna para classificar a coleção completa de itens +
Não feche esta janela durante a classificação]]>
+ + + Publicação foi cancelada por add-in de terceiros + Tipo de propriedade já existe + Tipo de propriedade criada + Tipo de Dado: %1%]]> + Tipo de propriedade removido + Tipo de Documento salvo + Guia criada + Guia removida + Guia com ID: %0% removida + Stylesheet não salva + Stylesheet salva + Stylesheet salva sem nenhum erro + Typo de Dado salvo + Item de Dicionário salvo + Publicação falhou porque a página pai não está publicada + Conteúdo publicado + e visível no website + Conteúdo salvo + Lembre-se de publicar para tornar as mudanças visíveis + Enviado para Aprovação + Alterações foram enviadas para aprovação + Membro salvo + Propriedade de Stylesheet salva + Stylesheet salva + Modelo salvo + Erro ao salvar usuário (verificar log) + Usuário Salvo + Arquivo não salvo + Arquivo não pode ser salvo. Favor checar as permissões do arquivo + Arquivo salvo + Arquivo salvo sem nenhum erro + Linguagem salva + Script Python não salvo + Script python não pode ser salvo devido à erro + Script Python salvo + Nenhum erro no script python + Modelo não salvo + Favor confirmar que não existem 2 modelos com o mesmo apelido + Modelo salvo + Modelo salvo sem nenhum erro! + Xslt não salvo + Xslt continha um erro + Xslt não pode ser salvo, cheque as permissões do arquivo + Xslt salvo + Nenhum erro no xslt + + + Use sintaxe CSS ex: h1, .redHeader, .blueTex + Editar stylesheet + Editar propriedade do stylesheet + Nome para identificar a propriedade de estilo no editor de texto rico (richtext) + Prévia + Estilos + + + Editar modelo + Inserir área de conteúdo + Inserir área de conteúdo em espaço reservado + Inserir item de dicionário + Inserir Macro + Inserir campo de página umbraco + Modelo mestre + Guia rápido para etiquetas de modelos umbraco + Modelo + + + Campo alternativo + Texto alternativo + Letra Maíscula ou minúscula + Escolha campo + Converter Quebra de Linhas + Substitui quebra de linhas com a etiqueta html &lt;br&gt; + Sim, Data somente + Formatar como data + Codificar HTML + Vai substituir caracteres especiais por seus equivalentes em HTML. + Será inserida após o valor do campo + Será inserida antes do valor do campo + Minúscula + Nenhum + Inserir após campo + Inserir antes do campo + Recursivo + Remover etiquetas de parágrafo + Removerá quaisquer &lt;P&gt; do começo ao fim do texto + Maiúscula + Codificar URL + Vai formatar caracteres especiais em URLs + Será usado somente quando os valores nos campos acima estiverem vazios + Este campo somente será usado se o campo primário estiver em vazio + Sim, com hora. Separador: + + + Tarefas designadas à você + designadas à você. Para ver os detalhes, incluinddo comentários, clique em "Detalhes" ou no nome da página. +Você também pode baixar a página como XML ao clicar no link "Download XML".
+Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
+ fechar tarefa + Detalhes da Tradução + Download todas as tarefas de tradução como xml + Download Xml + Download Xml DTD + Campos + Incluir sub-páginas + + Tarefa de tradução [%0%] para %1% + Nenhum usuário tradutor encontrado. Favor criar um usuário tradutor antes que possa começar a enviar conteúdo para tradução + Tarefas criadas por você + criadas por você. Para ver os detalhes, incluindo comentários, clique em "Detalhes" ou no nome da página. Você também pode baixar a página em XML ao clicar no link "Download XML". +Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]> + A página '%0%' foi enviada para tradução + Enviar página '%0%' para tradução + Designada por + Tarefa aberta + Total de palavras + Traduzir para + Tradução concluída. + Você pode visualizar as páginas que acaba de traduzir ao clicar abaixo. Se a página original for encontrada você poderá fazer a comparação entre as 2 páginas. + Tradução falhou, o arquivo xml pode estar corrupto + Opções de Tradução + Tradutor + Upload Xml de Tradução + + + Navegador de Cache + Lixeira + Pacotes criados + Tipo de Dado + Dicionário + Pacotes instalados + Instalar tema + Instalar kit de iniciante + Linguagens + Instalar pacote local + Macros + Tipos de Mídia + Membros + Grupos de Membros + Funções + Tipo de Membro + Tipos de Documentos + Pacotes + Pacotes + Arquivos Python + Instalar desde o repositório + Instalar Runway + Módulos Runway + Arquivos de Script + Scripts + Stylesheets + Modelos + Arquivos XSLT + + + Nova atualização pronta + %0% está pronto, clique aqui para download + Nenhuma conexão ao servidor + Erro ao procurar por atualização. Favor revisar os detalhes (stack-trace) para mais informações + + + Administrador + Campo de Categoria + Alterar Sua Senha + você pode alterar sua senha para acessar a área administrativa do Umbraco preenchendo o formulário abaixo e clicando no botão 'Alterar Senha' + Canal de Conteúdo + Redirecionar à Tela de Edição após login + Campo de descrição + Desabilitar Usuário + Tipo de Documento + Editor + Campo de excerto + Linguagem + Login + Nó Inicial na Biblioteca de Mídia + Seções + Desabilitar Acesso Umbraco + Senha + Sua senha foi alterada! + Favor confirmar sua nova senha + Digite sua nova senha + Sua nova senha não pode estar em branco! + Há uma diferença entre a nova senha e a confirmação da senha. Favor tentar novamente! + A confirmação da senha não é igual à nova senha! + Substituir permissões do nó filho + Vocês está modificando permissões para as páginas no momento: + Selecione páginas para modificar suas permissões + Buscar todos filhos + Nó Inicial do Conteúdo + Nome de Usuário + Permissões de usuário + Tipo de usuário + Tipos de usuários + Escrevente + +
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index 7b5daa8c96..6895704efb 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -509,7 +509,7 @@ Здравствуйте, %0%

Это автоматически сгенерированное уведомление. Операция '%1%' - была произведена на странице '%2%' + была произведена на странице '%2%' пользователем '%3%'.

diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml index 711bc9f6bd..0846e9cc5a 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml @@ -1,760 +1,760 @@ - - - - Kalle Ekstrand, Toxic Interactive Solutions AB - http://www.toxic.se - - - Hantera domännamn - Hantera versioner - Surfa på sidan - Kopiera - Skapa - Skapa paket - Ta bort - Avaktivera - Töm papperskorgen - Exportera dokumenttyp - Importera dokumenttyp - Importera paket - Redigera i Canvas - Logga ut - Flytta - Meddelanden - Lösenordsskydd - Publicera - Ladda om noder - Publicera hela webbplatsen - Rättigheter - Ångra ändringar - Skicka för publicering - Skicka för översättning - Sortera - Skicka för publicering - Översätt - Avpublicera - Uppdatera - - - Lägg till nytt domännamn - Domännamn - Har skapat domännamnet '{0}' - Har tagit bort domännamnet '{0}' - Domänen {0} är redan tillagd - t.ex.: dittdomannamn.se, www.dittdomannamn.se - Domännamnet '{0}' har uppdaterats - Ogiltigt domännamn - Redigera domännamn - - - Visar för - - - Fetstil - Minska indrag - Infoga formulärfält - Infoga grafisk rubrik - Ändra html - Öka indrag - Kursiv - Centrera - Vänsterjustera - Högerjustera - Infoga länk - Infoga intern länk (ankare) - Punktlista - Numerad lista - Infoga macro - Infoga bild - Ändra relation - Spara - Spara och publicera - Spara och skicka för godkännande - Förhandsgranska - Förhandsgranskning är avstängt på grund av att det inte finns någon mall tilldelad - Välj stil - Visa stil - Infoga tabell - - - Om denna sida - Alternativ länk - (hur skulle du beskriva denna bild för någon över telefon) - Alternativa länkar - Klicka för att redigera detta objekt - Skapad av - Skapad - Dokumenttyp - Redigering - Ta bort - Detta objekt har ändrats efter publicering - Detta objekt är inte publicerat - Senast publicerat - Länk till medieobjekt - Mediatyp - Medlemsgrupp - Roll - Medlemstyp - Inget datum valt - Sidnamn - Egenskaper - Detta dokument är publicerat men syns inte eftersom den överordnade sidan '{0}' inte är publicerad - Oops: detta dokument är publicerat men finns inte i cacheminnet (internt fel) - Publicera - Publiceringsstatus - Publiceringsdatum - Rensa datum - Sorteringsordningen har uppdaterats - För att sortera noderna, dra i dem eller klicka på någon av kolumnrubrikerna. Du kan markera flera noder samtidigt genom att hålla nere SHIFT eller CONTROL medan du klickar - Statistik - Titel (valfritt) - Typ - Avpublicera - Senast redigerad - Ta bort fil - Länk till dokument - - - Var vill du skapa den nya {0} - Skapa här - Välj typ och rubrik - - - Surfa på din webbplats - - Dölj - Om Umbraco inte öppnas kan det bero på att du måste tillåta poppuppfönster att öppnas från denna webbplats - har öppnats i ett nytt fönster - Starta om - Välkommen - Besök - - - Namn - Hantera domännamn - Stäng fönstret - Är du säker på att du vill ta bort - Är du säker på att du vill avaktivera - Kryssa i denna ruta för att bekräfta att {0} objekt tas bort - Är du säker? - Är du säker? - Klipp ut - Redigera ord i ordboken - Redigera språk - Infoga ankarlänk - Infoga tecken - Infoga grafisk rubrik - Infoga bild - Lägg in länk - Infoga makro - Infoga tabell - Senast redigerad - Länk - Intern länk: - När du använder lokala länkar, lägg till "#" framför länken - Öppna i nytt fönster? - Makroinställningar - Detta makro innehåller inga egenskaper som du kan redigera - Klistra in - Redigera rättigheter för - Allt som ligger i papperskorgen tas nu bort. Stäng inte detta fönster förrän detta är klart - Papperskorgen är nu tom - Om du tömmer papperskorgen kommer allt som ligger i den att tas bort permanent - regexlib.com's webbtjänst har för närvarande driftsstörningar. Tyvärr kan vi inte göra något åt detta.]]> - Sök efter en regular expression som kan validera ett formulärsfält. t.ex. 'email' eller 'url' - Ta bort makro - Obligatoriskt formulärsfält - Webbplatsen har indexerats - Cache för webbplatsen har uppdaterats. Allt publicerat innehåll är nu uppdaterat. Innehåll som inte har publicerats är fortfarande opublicerat. - Webbplatsens cache kommer att uppdateras. Allt innehåll som är publicerat kommer att uppdateras. Innehåll som inte är publicerat kommer att förbli opublicerat. - Antal kolumner - Antal rader - Ge din platshållare ett id du kan skjuta in innehåll från underordnade sidmallar i platshållaren genom att ge den ett ID. Du refererar sedan till detta ID med hjälp av en <asp:content /> tagg.]]> - Välj ett platshållar-ID från listan nedan. Du kan bara välja de ID som finns i denna malls huvudmall.]]> - Klicka på förhandsgranskningsbilden för att se bilden i full storlek - Välj ett objekt - Se cachat objekt - - - Redigera de olika översättningarna för ordboksinlägget '{0}' nedan. Du kan lägga till ytterligare språk under 'språk' i menyn till vänster. - Språknamn - - - Tillåtna typer för underliggande noder - Skapa - Ta bort flik - Beskrivning - Ny flik - Flik - Miniatyrbild - - - Lägg till värde - Datatyp i databasen - Datatyp GUID - Rendera som - Knappar - Slå på avancerade inställningar för - Slå på kontextmeny - Maximal förinställd storlek för bilder som läggs in - Relaterade stilmallar - Visa etikett - Bredd och höjd - - - Informationen har sparats, men innan du kan publicera denna sida måste du åtgärda följande fel: - Det går inte att byta lösenord i den medlemshanterare du har valt (EnablePasswordRetrieval måste vara satt till 'true'). - {0} redan finns - Följande fel inträffade: - Följande fel inträffade: - Lösenordet måste bestå av minst {0} tecken varav minst {1} är icke-alfanumeriska tecken (t.ex. %, #, !, @). - {0} måste vara ett heltal - {0} under {1} är ett obligatoriskt fält - {0} är ett obligatoriskt fält - {0} under {1} har ett felaktigt format - {0} har ett felaktigt format - - - Även om CodeMirror är aktiverad i konfigurationen, så är den avaktiverad i Internet Explorer på grund av att den inte är tillräckligt stabil - Du måste ange både alias och namn för den nya egenskapstypen! - Ett fel upptäcktes i läsningen/skrivningen till den aktuella filen eller mappen - Du måste skriva en rubrik - Du måste välja en typ - Du kommer att göra bilden större än originalstorleken. Är du säker på att du vill fortsätta? - Ett fel inträffade i pythonscriptet - Pythonscriptet har inte sparats eftersom det innehåller ett eller flera fel. - Startsidan har tagits bort, var vänlig kontakta administratören - Du måste markera något innan du kan göra stiländringar - Det finns inga tillgängliga stilar - Placera markören i den vänstra av de två celler du vill slå ihop - Du kan inte dela en cell som inte är ihopslagen. - Fel i XSLT-scriptet - XSLT-scriptet har inte sparats eftersom det innehåller ett eller flera fel - - - Om - Åtgärd - Lägg till - Alias - Är du säker? - Kant - eller - Avbryt - Cellmarginal - Välj - Stäng - Stäng fönstret - Kommentar - Bekräfta - Begränsa proportioner - Fortsätt - Kopiera - Skapa - Databas - Datum - Standard - Ta bort - Borttagen - Tar bort... - Design - Dimensioner - Ner - Ladda ned - Redigera - Redigerad - Element - E-post - Fel - Hitta - Mapp - Höjd - Hjälp - Ikon - Importera - Innermarginal - Lägg in - Installera - Justera - Språk - Layout - Laddar - Låst - Logga in - Logga ut - Logga ut - Makro - Flytta - Namn - Nytt - Nästa - Nej - av - OK - Öppna - eller - Lösenord - Sökväg - Platshållar-ID - Ett ögonblick... - Föregående - Egenskaper - E-postadress för formulärsdata - Papperskorg - Återstående - Döp om - Förnya - Försök igen - Rättigheter - Sök - Server - Visa - Vilken sida skall visas när formuläret är skickat - Storlek - Sortera - Skriv - Skriv för att söka... - Upp - Uppdatera - Uppgradera - Ladda upp - URL - Användare - Användarnamn - Värde - Välkommen... - Bredd - Titta på - Ja - - - Bakgrundsfärg - Fetstil - Textfärg - Typsnitt - Text - - - Sida - - - Installationsprogrammet kan inte ansluta till databasen. - Kunde inte spara filen web.config. Vänligen ändra databasanslutnings-inställningarna manuellt. - Din databas har lokaliserats och är identifierad som - Databaskonfiguration - installera]]> - Nästa för att fortsätta.]]> - Databasen kunde inte hittas! Kontrollera att informationen i databasanslutnings-inställningarna i filen "web.config" är rätt.

För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.

Klicka på Försök igen knappen när du är klar.
> Mer information om att redigera web.config hittar du här.

]]>
- Eventuellt kan du behöva kontakta ditt webb-hotell. Om du installerar på en lokal maskin eller server kan du få informationen från din systemadministratör.]]> - Tryck Uppgradera knappen för att uppgradera din databas till Umbraco {0}

Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!

]]>
- Tryck Nästa för att fortsätta.]]> - Nästa för att fortsätta med konfigurationsguiden]]> - Lösenordet på standardanvändaren måste bytas!]]> - Standardanvändaren har avaktiverats eller har inte åtkomst till umbraco!

Du behöver inte göra något ytterligare här. Klicka Next för att fortsätta.]]> - Standardanvändarens lösenord har ändrats sedan installationen!

Du behöver inte göra något ytterligare här. Klicka Nästa för att fortsätta.]]> - Lösenordet är ändrat! - umbraco skapar en standardanvändare med login ('admin') och lösenordet ('default'). Det är viktigt att lösenordet ändras till något unikt.

Det här steget kommer kontrollera standardanvändarens lösenord och låta dig vet om det behöver ändras.

]]>
- Få en flygande start, kolla på våra introduktionsvideor - Genom att klicka på Nästa knappen (eller redigera umbracoConfigurationStatus i web.config), accepterar du licensavtalet för den här mjukvaran som det är skrivet i rutan nedan. Observera att den här umbracodistributionen består av två olika licensavtal, "the open source MIT license" för ramverket och "the umbraco freeware license" som täcker användargränssnittet. - Inte installerad än. - Berörda filer och mappar - Här hittar du mer information om att sätta rättigheter för umbraco - Du måste ge ASP.NET ändra rättigheter till följande filer/mappar - Dina rättighetsinställningar är nästa perfekta! -

Du kan köra umbraco utan problem, men du kommer inte att kunna installera paket vilket är rekommenderat för att kunna utnyttja umbraco fullt ut.]]>
- Hur skall man lösa - Klicka här för att läsa text-versionen - video-självstudiekurs om hur du konfigurerar mapp-rättigheter för umbraco eller läs text-versionen.]]> - Dina rättighetsinställningar kan vara ett problem!

Du kan köra umbraco utan problem, men du kommer inte att kunna skapa mappar eller installera paket vilket är rekommenderat för att kunna utnyttja umbraco fullt ut.]]>
- Dina rättighetsinställningar är inte reda för umbraco!

För att kunna köra umbraco måste du ändra dina rättighetsinställningar.]]>
- Dina rättighetsinställningar är perfekta!

Du är redo att köra umbraco och installera paket!]]>
- Lösa mapp problem - Följ den här länken för mer information om problem med ASP.NET och att skapa mappar - Konfigurerar mapprättigheter - umbraco behöver skriv/ändra rättigheter till vissa mappar för att spara filer som bilder och PDFer. Umbraco sparar också temporär data (så kallad cache) för att öka prestandan på din webbplats. - Jag vill börja från början - lär dig hur) Du kan fortfarande välja att installera Runway senare. Gå in i Utvecklarsektionen och välj Paket.]]> - Du har just installerat en ren Umbraco platform. Vad vill du göra härnäst? - Runway är installerat - Det här är vår lista över rekommenderade moduler, markera de moduler du vill installera, eller visa den fullständiga listan]]> - Endast rekommenderad för erfarna användare - Jag vill börja med en enkel webbplats - "Runway" är en enkel webbplats med några enkla dokumentyper och mallar. Installationsguiden kan automatiskt installera Runway åt dig, men du kan lätt ändra, utöka eller ta bort den. Det är inte nödvändigt och du kan använda Umbraco utan den, men Runway erbjuder en enkel grund baserad på bästa praxis för att hjälpa dig igång snabbare än någonsin tidigare. Om du väljer att installera Runway, kan du välja till grundläggande byggstenar så kallade Runway-moduler för att utöka dina Runway-sidor.

Inkluderat i Runway: Startsida, "komma igång"-sida och en sidan om att installera moduler.
Tilläggs moduler: Toppnavigation, Sitemap, Kontakt och galleri.
]]>
- Vad är Runway - Steg 1/5 Acceptera licensavtalet - Steg 2/5: Databaskonfiguration - Steg 3/5: Bekräftar filrättigheter - Steg 4/5: Umbraco säkerhetskontroll - Steg 5/5: Umbraco är redo att ge dig en flygande start - Tack för att du valde umbraco - Besök din nya webbplats Du installerade Runway, så varför inte se hur din nya webbplats ser ut.]]> - Ytterligare hjälp och information Få hjälp från våra prisbelönta community, bläddra i dokumentationen eller titta på några gratis videor om hur man bygger en enkel webbplats, hur du använder paket eller en snabbguide till umbracos terminologi]]> - Umbraco {0} är installerat och klart för användning - /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till '{0}']]> - börja omedelbart genom att klicka på "Starta Umbraco"-knappen nedan.
Om du är en ny umbraco användarekan du hitta massor av resurser på våra kom igång sidor.]]>
- Starta Umbraco För att administrera din webbplats öppnar du bara umbraco back office och börjar lägga till innehåll, uppdatera mallar och stilmallar eller lägga till nya funktioner.]]> - Anslutningen till databasen misslyckades. - Se - umbraco {0} antingen för en ny installation eller en uppgradering från version 3.0.

Tryck på "next" för att börja.]]>
- Umbraco Version 3 - Umbraco Version 4 - - - Språkkod - Språknamn - - - Du har varit inaktiv och kommer automatiskt att loggas ut - Förnya nu för att spara ditt arbete - - - © 2001 - {0}
umbraco.org

]]>
- Välkommen till umbraco, skriv ditt användarnamn och lösenord i textfälten nedan: - - - Redigeringsyta - Sektioner - Innehåll - - - Välj sida ovan... - {0} har kopierats till {1} - Ange mål att kopiera sidan {0} till nedan - {0} har flyttats till {1} - Ange vart sidan {0} skall flyttas till nedan - är nu roten för ditt nya innehåll. Klicka 'ok' nedan. - Du har inte valt någon sida än. Välj en sida i listan ovan och klicka sedan 'fortsätt'. - Den aktuella sidan får inte vara undersida till den valda sidan eftersom den har fel dokumenttyp. - Den aktuella sidan kan inte flyttas till en av sina egna undersidor. - Händelsen är inte tillåten på grund av att du inte har tillräckliga rättigheter till 1 eller flera underliggande sidor - Relatera kopierat objekt till orginalet - - - Inställningar för notifieringar gällande {0} - Hej {0} Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '{2}' av användaren '{3}' Gå till http://{4}/actions/editContent.aspx?id={5} för att redigera. - Hej {0}

Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '{2}' av användaren '{3}'

Sammanfattning av uppdateringen:

{6}

]]>
- [{0}] Meddelande för att informera om att {1} har utförts på {2} - Notifieringar - - - och leta upp paketet. Umbracos installationspaket har oftast filändelsen ".umb" eller ".zip".]]> - Utvecklare - Demonstration - Dokumentation - Paket metadata - Paketnamn - Paketet innehåller inga poster -
Det är säkert att ta bort den ur systemet genom att klicka på "avinstallera paket" nedan.]]>
- Inga uppdateringar tillgängliga - Paketalternativ - Paket läsmig - Paketvalv - Bekräfta avinstallation - Paketet har avinstallerats - Paketet har avinstallerats utan problem - Avinstallera paket - OBS! dokument, media osv som använder de borttagna posterna kommer sluta fungera vilket kan leda till att systemet blir instabilt. Avinstallera därför med försiktighet. Om du är osäker, kontakta personen som skapat paketet.]]> - Hämta uppdatering från paketvalvet - Uppdatera paket - Uppdateringsinstruktioner - Det finns an uppdaterad version av paketet. Du kan hämta den direkt från umbracos paketvalv. - Paketversion - Besök paketets webbplats - - - Klistra in med helt bibehållen formatering (rekommenderas ej) - Texten du försöker klistra in innehåller specialtecken och/eller formateringstaggar. Detta kan bero på att texten kommer från t.ex. Microsoft Word. Umbraco kan ta bort specialtecken och formateringstaggar automatiskt så att innehållet lämpar sig bättre för webbpublicering. - Klistra in texten helt utan formatering - Klistra in texen och ta bort specialformatering (rekommenderas) - - - Rollbaserat lösenordsskydd - Då används umbracos medlemsgrupper.]]> - rollbaserat lösenordsskydd.]]> - Sida med felmeddelande - Används när en användare är inloggad, men saknar rättigheter att se sidan - Välj hur du vill lösenordsskydda sidan - {0} är nu lösenordsskyddad - Lösenordsskyddet är nu borttaget på {0} - Inloggningssida - Välj sidan med inloggningsformuläret - Ta bort lösenordsskydd - Välj sidorna med inloggningsformulär och felmeddelande - Välj de roller som ska ha tillgång till denna sida - Ange användarnamn och lösenord för denna sida - Samma lösenord för alla användare - Välj detta alternativ om du vill skydda sidan med ett enkelt användarnamn och lösenord. Alla loggar då in med samma inloggningsuppgifter. - - - {0} kunde inte publiceras på grund av att ett tredjepartstillägg avbröt publiceringen. - - Inkludera opublicerade undersidor - Publicering pågår - vänligen vänta... - {0} av {1} sidor har publicerats... - {0} har publicerats - {0} och underliggande sidor har publicerats - Publicera {0} och alla dess underordnade sidor - ok för att publicera {0}. Därmed blir innehållet publikt.

Du kan publicera denna sida och alla dess undersidor genom att kryssa i publicera alla undersidor. ]]>
- - - Lägg till extern länk - Lägg till intern länk - Lägg till - Rubrik - Intern sida - URL - Flytta ner - Flytta upp - Öppna i nytt fönster - Ta bort länk - - - Nuvarande version - Röd text kommer inte att synas i den valda versionen. , Grön betyder att den har tillkommit]]> - Dokumentet har återgått till en tidigare version - Här visas den valda sidversionen i HTML. Om du vill se skillnaden mellan två versioner samtidigt, välj istället "Diff". - Återgå till - Vald version - Visningsläge - - - Redigera script - - - Concierge - Innehåll - Courier - Utvecklare - Umbraco Configuration Wizard - Media - Medlemmar - Nyhetsbrev - Inställningar - Statistik - Översättning - Användare - - - som huvudinnehållstyp. Tabbar från huvudinnehållstyper visas inte och kan endast redigeras på själva huvudinnehållstypen. - Huvudinnehållstyp påslagen - Denna huvudinnehållstyp använder - Defaultmall - Ordboksnyckel - För att importera en dokumenttyp, leta upp ".udt"-filen på din hårddisk genom att klicka på "Browse"-knappen och sedan på "Importera" (du får bekräfta ditt val i nästa steg). - Namn på ny flik - Nodtyp - Typ - Stilmall - Egenskap för stilmall - Flik - Fliknamn - Flikar - - - Sortering klar - Välj i vilken ordning du vill ha sidorna genom att dra dem upp eller ner i listan. Du kan också klicka på kolumnrubrikerna för att sortera grupper av sidor -
Stäng inte fönstret under tiden sidorna sorteras.]]>
- - - Publiceringen avbröts av ett tredjepartstillägg - Egenskapstyp finns redan - Egenskapstyp skapad - Datatyp: {1}]]> - Egenskapstypen har tagits bort - Innehållstypen har sparats - Ny flik skapad - Fliken har tagits bort - Fliken med id: {0} har tagits bort - Innehållet är avpublicerat - Stilmallen kunde inte sparas - Stilmallen sparades - Stilmallen sparades utan fel - Datatypen har sparats - Ordet sparades i ordboken - Det gick inte att publicera sidan eftersom dess överordnade sida inte är publicerad - Innehållet är publicerat - och syns på webbplatsen - Innehållet har sparats - Kom ihåg att publicera för att ändringarna ska synas på webbplatsen - Skickat för godkännande - Ändringarna har skickats för godkännande - Medlemmen har sparats - Egenskap för stilmall har sparats - Stilmallen har sparats - Sidmallen har sparats - Ett fel inträffade när användaren sparades (läs logg-filen) - Användaren har sparats - Användartypen har sparats - Filen sparades inte - filen kunde inte sparas. Kontrollera filrättigheterna - Filen har sparats - Filen sparades utan fel - Språket har sparats - TRANSLATE ME: 'Partial view not saved' - Ett fel uppstod när filen sparades - TRANSLATE ME: 'Partial view saved' - TRANSLATE ME: 'Partial view saved without any errors!' - Pythonscriptet har inte sparats - Pythonscriptet kunde inte sparas på grund av ett fel - Pythonscriptet har sparats - Inga fel i pythonscriptet - Sidmallen har inte sparats - Kontrollera att du inte har två sidmallar med samma alias - Sidmallen har sparats - Sidmallen sparades utan fel - XSLT-scriptet sparades inte - XSLT-scriptet innehöll ett fel - XSLT-scripet kunde inte sparas, kontrollera filrättigheterna - XSLT-scriptet har sparats - Inga fel i XSLT-scriptet - - - Använder CSS-syntax, t ex: h1, .redHeader, .blueTex - Redigera stilmall - Redigera egenskaper för stilmall - Namnet som används för att identifiera stilen i HTML-editorn - Förhandsgranska - Stilar - - - Redigera sidmall - Lägg in innehållsyta - Lägg in platshållare för innehållsyta - Lägg in ord från ordboken - Lägg in makro - Lägg in sidfält - Huvudmall - Snabbguide för taggar i umbracos sidmallar - Sidmall - - - Alternativt fält - Alternativ text - Casing - Välj fält - Konvertera radbrytningar - Byter radbrytningar mot html-taggen &lt;br&gt; - Anpassade fält - Ja, endast datum - Formatera som datum - HTML-omkodning - Ersätter specialtecken med deras HTML-motsvarigheter. - Kommer läggas till efter fältets värde - Kommer läggas till före fältets värde - Gemener - Ingen - Infoga efter fält - Infoga före fält - Rekursiv - Avlägsna stycke-taggar - Kommer att avlägsna alla &lt;P&gt; i början och slutet av texten - Standardfält - Versaler - URL-koda - Om fältets innehåll skall sändas till en url, skall detta slås på så att specialtecken kodas - Texten kommer användas om ovanstående fält är tomma - Fältet kommer användas om det primära fältet ovan är tomt - Ja, med tid. Separator: - - - Arbetsuppgifter som tilldelats dig - som har tilldelats dig. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
- Stäng arbetsuppgift - Översättningsdetaljer - Ladda ned alla översättningsjobb i XML-format - Ladda ned i XML-format - Ladda hem DTD för XML - Fält - Inkludera undersidor - Hej {0}. Detta är ett automatisk mail skickat for att informera dig om att det finns en översättningsförfrågan på dokument '%1' till '{5}' skickad av {2}. För att redigere, besök http://{3}/translation/details.aspx?id={4}. För att få en översikt över dina översättningsuppgigter loggar du in i umbraco på: http://{3}/umbraco.aspx - [{0}] Översättningsuppgit för {1} - Hittade inga användare som är översättare. Vänligen skapa en användare som är översättare innan du börjar skicka innehåll för översättning - Arbetsuppgifter som du har skapat - som du har skapat. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
- Sidan '{0}' har skickats för översättning - Skicka sidan '{0}' för översättning - Tilldelat av - Arbetsuppgift öppnad - Totalt antal ord - Översätt till - Översättning klar. - Du kan förhandsgranska sidorna du nyss har översatt genom att klicka nedan. Om originalsidan finns kommer du att se en jämförelse mellan din sida och originalsidan. - Översättningen misslyckades. XML-filen kan vara korrupt - Valmöjligheter översättning - Översättare - Ladda upp översättning i XML-format - - - Cacha webbläsare - Papperskorg - Skapade paket - Datatyper - Ordbok - Installerade paket - Installera skin - Installera Startkit - Språk - Installera lokalt paket - Makron - Mediatyper - Medlem - Medlemsgrupper - Roller - Medlemstyper - Dokumenttyper - Paket - Paket - Python-filer - Installera från gemensamt bibliotek - Installera Runway - Runway-moduler - Skript-filer - Skript - Stilmallar - Sidmallar - XSLT-filer - - - Ny uppdatering tillgänglig - {0} är klart, klicka här för att ladda ner - Ingen kontakt med server - Fel vid kontroll av uppdatering. Se trace-stack för mer information. - - - Administratör - Kategorifält - Ändra lösenord - Du kan byta ditt lösenord för Umbraco Back Office genom att fylla i nedanstående formulär och klicka på knappen "Ändra lösenord". - Bekräfta det nya lösenordet - Innehållskanal - Gå direkt till Canvas efter inloggning - Fält för beskrivning - Avaktivera användare - Dokumenttyp - Redaktör - Fält för utdrag - Språk - Login - Startnod i mediabiblioteket - Sektioner - Byt ditt lösenord - Inaktivera tillgång till Umbraco - Lösenord - Ditt lösenord är nu ändrat! - Vänligen bekräfta ditt nya lösenord - Nuvarande lösenord - Vänligen fyll i ditt nya lösenord - Nuvarande lösenord är ogiltigt - Ditt nya lösenord kan inte vara tomt! - Lösenorden matchar inte. Vänligen försök igen! - Det bekräftade lösenordet matchar inte det nya lösenordet! - Ersätt rättigheterna på underliggande noder - Du redigerar nu rättigheterna för sidorna: - Välj de sidor vars rättigheter du vill redigera - Sök igenom alla undernoder - Startnod i innehåll - Användarens namn - Användarrättigheter - Användartyp - Användartyper - Skribent - + + + + Kalle Ekstrand, Toxic Interactive Solutions AB + http://www.toxic.se + + + Hantera domännamn + Hantera versioner + Surfa på sidan + Kopiera + Skapa + Skapa paket + Ta bort + Avaktivera + Töm papperskorgen + Exportera dokumenttyp + Importera dokumenttyp + Importera paket + Redigera i Canvas + Logga ut + Flytta + Meddelanden + Lösenordsskydd + Publicera + Ladda om noder + Publicera hela webbplatsen + Rättigheter + Ångra ändringar + Skicka för publicering + Skicka för översättning + Sortera + Skicka för publicering + Översätt + Avpublicera + Uppdatera + + + Lägg till nytt domännamn + Domännamn + Har skapat domännamnet '{0}' + Har tagit bort domännamnet '{0}' + Domänen {0} är redan tillagd + t.ex.: dittdomannamn.se, www.dittdomannamn.se + Domännamnet '{0}' har uppdaterats + Ogiltigt domännamn + Redigera domännamn + + + Visar för + + + Fetstil + Minska indrag + Infoga formulärfält + Infoga grafisk rubrik + Ändra html + Öka indrag + Kursiv + Centrera + Vänsterjustera + Högerjustera + Infoga länk + Infoga intern länk (ankare) + Punktlista + Numerad lista + Infoga macro + Infoga bild + Ändra relation + Spara + Spara och publicera + Spara och skicka för godkännande + Förhandsgranska + Förhandsgranskning är avstängt på grund av att det inte finns någon mall tilldelad + Välj stil + Visa stil + Infoga tabell + + + Om denna sida + Alternativ länk + (hur skulle du beskriva denna bild för någon över telefon) + Alternativa länkar + Klicka för att redigera detta objekt + Skapad av + Skapad + Dokumenttyp + Redigering + Ta bort + Detta objekt har ändrats efter publicering + Detta objekt är inte publicerat + Senast publicerat + Länk till medieobjekt + Mediatyp + Medlemsgrupp + Roll + Medlemstyp + Inget datum valt + Sidnamn + Egenskaper + Detta dokument är publicerat men syns inte eftersom den överordnade sidan '{0}' inte är publicerad + Oops: detta dokument är publicerat men finns inte i cacheminnet (internt fel) + Publicera + Publiceringsstatus + Publiceringsdatum + Rensa datum + Sorteringsordningen har uppdaterats + För att sortera noderna, dra i dem eller klicka på någon av kolumnrubrikerna. Du kan markera flera noder samtidigt genom att hålla nere SHIFT eller CONTROL medan du klickar + Statistik + Titel (valfritt) + Typ + Avpublicera + Senast redigerad + Ta bort fil + Länk till dokument + + + Var vill du skapa den nya {0} + Skapa här + Välj typ och rubrik + + + Surfa på din webbplats + - Dölj + Om Umbraco inte öppnas kan det bero på att du måste tillåta poppuppfönster att öppnas från denna webbplats + har öppnats i ett nytt fönster + Starta om + Välkommen + Besök + + + Namn + Hantera domännamn + Stäng fönstret + Är du säker på att du vill ta bort + Är du säker på att du vill avaktivera + Kryssa i denna ruta för att bekräfta att {0} objekt tas bort + Är du säker? + Är du säker? + Klipp ut + Redigera ord i ordboken + Redigera språk + Infoga ankarlänk + Infoga tecken + Infoga grafisk rubrik + Infoga bild + Lägg in länk + Infoga makro + Infoga tabell + Senast redigerad + Länk + Intern länk: + När du använder lokala länkar, lägg till "#" framför länken + Öppna i nytt fönster? + Makroinställningar + Detta makro innehåller inga egenskaper som du kan redigera + Klistra in + Redigera rättigheter för + Allt som ligger i papperskorgen tas nu bort. Stäng inte detta fönster förrän detta är klart + Papperskorgen är nu tom + Om du tömmer papperskorgen kommer allt som ligger i den att tas bort permanent + regexlib.com's webbtjänst har för närvarande driftsstörningar. Tyvärr kan vi inte göra något åt detta.]]> + Sök efter en regular expression som kan validera ett formulärsfält. t.ex. 'email' eller 'url' + Ta bort makro + Obligatoriskt formulärsfält + Webbplatsen har indexerats + Cache för webbplatsen har uppdaterats. Allt publicerat innehåll är nu uppdaterat. Innehåll som inte har publicerats är fortfarande opublicerat. + Webbplatsens cache kommer att uppdateras. Allt innehåll som är publicerat kommer att uppdateras. Innehåll som inte är publicerat kommer att förbli opublicerat. + Antal kolumner + Antal rader + Ge din platshållare ett id du kan skjuta in innehåll från underordnade sidmallar i platshållaren genom att ge den ett ID. Du refererar sedan till detta ID med hjälp av en <asp:content /> tagg.]]> + Välj ett platshållar-ID från listan nedan. Du kan bara välja de ID som finns i denna malls huvudmall.]]> + Klicka på förhandsgranskningsbilden för att se bilden i full storlek + Välj ett objekt + Se cachat objekt + + + Redigera de olika översättningarna för ordboksinlägget '{0}' nedan. Du kan lägga till ytterligare språk under 'språk' i menyn till vänster. + Språknamn + + + Tillåtna typer för underliggande noder + Skapa + Ta bort flik + Beskrivning + Ny flik + Flik + Miniatyrbild + + + Lägg till värde + Datatyp i databasen + Datatyp GUID + Rendera som + Knappar + Slå på avancerade inställningar för + Slå på kontextmeny + Maximal förinställd storlek för bilder som läggs in + Relaterade stilmallar + Visa etikett + Bredd och höjd + + + Informationen har sparats, men innan du kan publicera denna sida måste du åtgärda följande fel: + Det går inte att byta lösenord i den medlemshanterare du har valt (EnablePasswordRetrieval måste vara satt till 'true'). + {0} redan finns + Följande fel inträffade: + Följande fel inträffade: + Lösenordet måste bestå av minst {0} tecken varav minst {1} är icke-alfanumeriska tecken (t.ex. %, #, !, @). + {0} måste vara ett heltal + {0} under {1} är ett obligatoriskt fält + {0} är ett obligatoriskt fält + {0} under {1} har ett felaktigt format + {0} har ett felaktigt format + + + Även om CodeMirror är aktiverad i konfigurationen, så är den avaktiverad i Internet Explorer på grund av att den inte är tillräckligt stabil + Du måste ange både alias och namn för den nya egenskapstypen! + Ett fel upptäcktes i läsningen/skrivningen till den aktuella filen eller mappen + Du måste skriva en rubrik + Du måste välja en typ + Du kommer att göra bilden större än originalstorleken. Är du säker på att du vill fortsätta? + Ett fel inträffade i pythonscriptet + Pythonscriptet har inte sparats eftersom det innehåller ett eller flera fel. + Startsidan har tagits bort, var vänlig kontakta administratören + Du måste markera något innan du kan göra stiländringar + Det finns inga tillgängliga stilar + Placera markören i den vänstra av de två celler du vill slå ihop + Du kan inte dela en cell som inte är ihopslagen. + Fel i XSLT-scriptet + XSLT-scriptet har inte sparats eftersom det innehåller ett eller flera fel + + + Om + Åtgärd + Lägg till + Alias + Är du säker? + Kant + eller + Avbryt + Cellmarginal + Välj + Stäng + Stäng fönstret + Kommentar + Bekräfta + Begränsa proportioner + Fortsätt + Kopiera + Skapa + Databas + Datum + Standard + Ta bort + Borttagen + Tar bort... + Design + Dimensioner + Ner + Ladda ned + Redigera + Redigerad + Element + E-post + Fel + Hitta + Mapp + Höjd + Hjälp + Ikon + Importera + Innermarginal + Lägg in + Installera + Justera + Språk + Layout + Laddar + Låst + Logga in + Logga ut + Logga ut + Makro + Flytta + Namn + Nytt + Nästa + Nej + av + OK + Öppna + eller + Lösenord + Sökväg + Platshållar-ID + Ett ögonblick... + Föregående + Egenskaper + E-postadress för formulärsdata + Papperskorg + Återstående + Döp om + Förnya + Försök igen + Rättigheter + Sök + Server + Visa + Vilken sida skall visas när formuläret är skickat + Storlek + Sortera + Skriv + Skriv för att söka... + Upp + Uppdatera + Uppgradera + Ladda upp + URL + Användare + Användarnamn + Värde + Välkommen... + Bredd + Titta på + Ja + + + Bakgrundsfärg + Fetstil + Textfärg + Typsnitt + Text + + + Sida + + + Installationsprogrammet kan inte ansluta till databasen. + Kunde inte spara filen web.config. Vänligen ändra databasanslutnings-inställningarna manuellt. + Din databas har lokaliserats och är identifierad som + Databaskonfiguration + installera]]> + Nästa för att fortsätta.]]> + Databasen kunde inte hittas! Kontrollera att informationen i databasanslutnings-inställningarna i filen "web.config" är rätt.

För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.

Klicka på Försök igen knappen när du är klar.
> Mer information om att redigera web.config hittar du här.

]]>
+ Eventuellt kan du behöva kontakta ditt webb-hotell. Om du installerar på en lokal maskin eller server kan du få informationen från din systemadministratör.]]> + Tryck Uppgradera knappen för att uppgradera din databas till Umbraco {0}

Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!

]]>
+ Tryck Nästa för att fortsätta.]]> + Nästa för att fortsätta med konfigurationsguiden]]> + Lösenordet på standardanvändaren måste bytas!]]> + Standardanvändaren har avaktiverats eller har inte åtkomst till umbraco!

Du behöver inte göra något ytterligare här. Klicka Next för att fortsätta.]]> + Standardanvändarens lösenord har ändrats sedan installationen!

Du behöver inte göra något ytterligare här. Klicka Nästa för att fortsätta.]]> + Lösenordet är ändrat! + umbraco skapar en standardanvändare med login ('admin') och lösenordet ('default'). Det är viktigt att lösenordet ändras till något unikt.

Det här steget kommer kontrollera standardanvändarens lösenord och låta dig vet om det behöver ändras.

]]>
+ Få en flygande start, kolla på våra introduktionsvideor + Genom att klicka på Nästa knappen (eller redigera umbracoConfigurationStatus i web.config), accepterar du licensavtalet för den här mjukvaran som det är skrivet i rutan nedan. Observera att den här umbracodistributionen består av två olika licensavtal, "the open source MIT license" för ramverket och "the umbraco freeware license" som täcker användargränssnittet. + Inte installerad än. + Berörda filer och mappar + Här hittar du mer information om att sätta rättigheter för umbraco + Du måste ge ASP.NET ändra rättigheter till följande filer/mappar + Dina rättighetsinställningar är nästa perfekta! +

Du kan köra umbraco utan problem, men du kommer inte att kunna installera paket vilket är rekommenderat för att kunna utnyttja umbraco fullt ut.]]>
+ Hur skall man lösa + Klicka här för att läsa text-versionen + video-självstudiekurs om hur du konfigurerar mapp-rättigheter för umbraco eller läs text-versionen.]]> + Dina rättighetsinställningar kan vara ett problem!

Du kan köra umbraco utan problem, men du kommer inte att kunna skapa mappar eller installera paket vilket är rekommenderat för att kunna utnyttja umbraco fullt ut.]]>
+ Dina rättighetsinställningar är inte reda för umbraco!

För att kunna köra umbraco måste du ändra dina rättighetsinställningar.]]>
+ Dina rättighetsinställningar är perfekta!

Du är redo att köra umbraco och installera paket!]]>
+ Lösa mapp problem + Följ den här länken för mer information om problem med ASP.NET och att skapa mappar + Konfigurerar mapprättigheter + umbraco behöver skriv/ändra rättigheter till vissa mappar för att spara filer som bilder och PDFer. Umbraco sparar också temporär data (så kallad cache) för att öka prestandan på din webbplats. + Jag vill börja från början + lär dig hur) Du kan fortfarande välja att installera Runway senare. Gå in i Utvecklarsektionen och välj Paket.]]> + Du har just installerat en ren Umbraco platform. Vad vill du göra härnäst? + Runway är installerat + Det här är vår lista över rekommenderade moduler, markera de moduler du vill installera, eller visa den fullständiga listan]]> + Endast rekommenderad för erfarna användare + Jag vill börja med en enkel webbplats + "Runway" är en enkel webbplats med några enkla dokumentyper och mallar. Installationsguiden kan automatiskt installera Runway åt dig, men du kan lätt ändra, utöka eller ta bort den. Det är inte nödvändigt och du kan använda Umbraco utan den, men Runway erbjuder en enkel grund baserad på bästa praxis för att hjälpa dig igång snabbare än någonsin tidigare. Om du väljer att installera Runway, kan du välja till grundläggande byggstenar så kallade Runway-moduler för att utöka dina Runway-sidor.

Inkluderat i Runway: Startsida, "komma igång"-sida och en sidan om att installera moduler.
Tilläggs moduler: Toppnavigation, Sitemap, Kontakt och galleri.
]]>
+ Vad är Runway + Steg 1/5 Acceptera licensavtalet + Steg 2/5: Databaskonfiguration + Steg 3/5: Bekräftar filrättigheter + Steg 4/5: Umbraco säkerhetskontroll + Steg 5/5: Umbraco är redo att ge dig en flygande start + Tack för att du valde umbraco + Besök din nya webbplats Du installerade Runway, så varför inte se hur din nya webbplats ser ut.]]> + Ytterligare hjälp och information Få hjälp från våra prisbelönta community, bläddra i dokumentationen eller titta på några gratis videor om hur man bygger en enkel webbplats, hur du använder paket eller en snabbguide till umbracos terminologi]]> + Umbraco {0} är installerat och klart för användning + /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till '{0}']]> + börja omedelbart genom att klicka på "Starta Umbraco"-knappen nedan.
Om du är en ny umbraco användarekan du hitta massor av resurser på våra kom igång sidor.]]>
+ Starta Umbraco För att administrera din webbplats öppnar du bara umbraco back office och börjar lägga till innehåll, uppdatera mallar och stilmallar eller lägga till nya funktioner.]]> + Anslutningen till databasen misslyckades. + Se + umbraco {0} antingen för en ny installation eller en uppgradering från version 3.0.

Tryck på "next" för att börja.]]>
+ Umbraco Version 3 + Umbraco Version 4 + + + Språkkod + Språknamn + + + Du har varit inaktiv och kommer automatiskt att loggas ut + Förnya nu för att spara ditt arbete + + + © 2001 - {0}
umbraco.org

]]>
+ Välkommen till umbraco, skriv ditt användarnamn och lösenord i textfälten nedan: + + + Redigeringsyta + Sektioner + Innehåll + + + Välj sida ovan... + {0} har kopierats till {1} + Ange mål att kopiera sidan {0} till nedan + {0} har flyttats till {1} + Ange vart sidan {0} skall flyttas till nedan + är nu roten för ditt nya innehåll. Klicka 'ok' nedan. + Du har inte valt någon sida än. Välj en sida i listan ovan och klicka sedan 'fortsätt'. + Den aktuella sidan får inte vara undersida till den valda sidan eftersom den har fel dokumenttyp. + Den aktuella sidan kan inte flyttas till en av sina egna undersidor. + Händelsen är inte tillåten på grund av att du inte har tillräckliga rättigheter till 1 eller flera underliggande sidor + Relatera kopierat objekt till orginalet + + + Inställningar för notifieringar gällande {0} + Hej {0} Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '{2}' av användaren '{3}' Gå till http://{4}/actions/editContent.aspx?id={5} för att redigera. + Hej {0}

Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '%2%' av användaren '{3}'

Sammanfattning av uppdateringen:

{6}

]]>
+ [{0}] Meddelande för att informera om att {1} har utförts på {2} + Notifieringar + + + och leta upp paketet. Umbracos installationspaket har oftast filändelsen ".umb" eller ".zip".]]> + Utvecklare + Demonstration + Dokumentation + Paket metadata + Paketnamn + Paketet innehåller inga poster +
Det är säkert att ta bort den ur systemet genom att klicka på "avinstallera paket" nedan.]]>
+ Inga uppdateringar tillgängliga + Paketalternativ + Paket läsmig + Paketvalv + Bekräfta avinstallation + Paketet har avinstallerats + Paketet har avinstallerats utan problem + Avinstallera paket + OBS! dokument, media osv som använder de borttagna posterna kommer sluta fungera vilket kan leda till att systemet blir instabilt. Avinstallera därför med försiktighet. Om du är osäker, kontakta personen som skapat paketet.]]> + Hämta uppdatering från paketvalvet + Uppdatera paket + Uppdateringsinstruktioner + Det finns an uppdaterad version av paketet. Du kan hämta den direkt från umbracos paketvalv. + Paketversion + Besök paketets webbplats + + + Klistra in med helt bibehållen formatering (rekommenderas ej) + Texten du försöker klistra in innehåller specialtecken och/eller formateringstaggar. Detta kan bero på att texten kommer från t.ex. Microsoft Word. Umbraco kan ta bort specialtecken och formateringstaggar automatiskt så att innehållet lämpar sig bättre för webbpublicering. + Klistra in texten helt utan formatering + Klistra in texen och ta bort specialformatering (rekommenderas) + + + Rollbaserat lösenordsskydd + Då används umbracos medlemsgrupper.]]> + rollbaserat lösenordsskydd.]]> + Sida med felmeddelande + Används när en användare är inloggad, men saknar rättigheter att se sidan + Välj hur du vill lösenordsskydda sidan + {0} är nu lösenordsskyddad + Lösenordsskyddet är nu borttaget på {0} + Inloggningssida + Välj sidan med inloggningsformuläret + Ta bort lösenordsskydd + Välj sidorna med inloggningsformulär och felmeddelande + Välj de roller som ska ha tillgång till denna sida + Ange användarnamn och lösenord för denna sida + Samma lösenord för alla användare + Välj detta alternativ om du vill skydda sidan med ett enkelt användarnamn och lösenord. Alla loggar då in med samma inloggningsuppgifter. + + + {0} kunde inte publiceras på grund av att ett tredjepartstillägg avbröt publiceringen. + + Inkludera opublicerade undersidor + Publicering pågår - vänligen vänta... + {0} av {1} sidor har publicerats... + {0} har publicerats + {0} och underliggande sidor har publicerats + Publicera {0} och alla dess underordnade sidor + ok för att publicera {0}. Därmed blir innehållet publikt.

Du kan publicera denna sida och alla dess undersidor genom att kryssa i publicera alla undersidor. ]]>
+ + + Lägg till extern länk + Lägg till intern länk + Lägg till + Rubrik + Intern sida + URL + Flytta ner + Flytta upp + Öppna i nytt fönster + Ta bort länk + + + Nuvarande version + Röd text kommer inte att synas i den valda versionen. , Grön betyder att den har tillkommit]]> + Dokumentet har återgått till en tidigare version + Här visas den valda sidversionen i HTML. Om du vill se skillnaden mellan två versioner samtidigt, välj istället "Diff". + Återgå till + Vald version + Visningsläge + + + Redigera script + + + Concierge + Innehåll + Courier + Utvecklare + Umbraco Configuration Wizard + Media + Medlemmar + Nyhetsbrev + Inställningar + Statistik + Översättning + Användare + + + som huvudinnehållstyp. Tabbar från huvudinnehållstyper visas inte och kan endast redigeras på själva huvudinnehållstypen. + Huvudinnehållstyp påslagen + Denna huvudinnehållstyp använder + Defaultmall + Ordboksnyckel + För att importera en dokumenttyp, leta upp ".udt"-filen på din hårddisk genom att klicka på "Browse"-knappen och sedan på "Importera" (du får bekräfta ditt val i nästa steg). + Namn på ny flik + Nodtyp + Typ + Stilmall + Egenskap för stilmall + Flik + Fliknamn + Flikar + + + Sortering klar + Välj i vilken ordning du vill ha sidorna genom att dra dem upp eller ner i listan. Du kan också klicka på kolumnrubrikerna för att sortera grupper av sidor +
Stäng inte fönstret under tiden sidorna sorteras.]]>
+ + + Publiceringen avbröts av ett tredjepartstillägg + Egenskapstyp finns redan + Egenskapstyp skapad + Datatyp: {1}]]> + Egenskapstypen har tagits bort + Innehållstypen har sparats + Ny flik skapad + Fliken har tagits bort + Fliken med id: {0} har tagits bort + Innehållet är avpublicerat + Stilmallen kunde inte sparas + Stilmallen sparades + Stilmallen sparades utan fel + Datatypen har sparats + Ordet sparades i ordboken + Det gick inte att publicera sidan eftersom dess överordnade sida inte är publicerad + Innehållet är publicerat + och syns på webbplatsen + Innehållet har sparats + Kom ihåg att publicera för att ändringarna ska synas på webbplatsen + Skickat för godkännande + Ändringarna har skickats för godkännande + Medlemmen har sparats + Egenskap för stilmall har sparats + Stilmallen har sparats + Sidmallen har sparats + Ett fel inträffade när användaren sparades (läs logg-filen) + Användaren har sparats + Användartypen har sparats + Filen sparades inte + filen kunde inte sparas. Kontrollera filrättigheterna + Filen har sparats + Filen sparades utan fel + Språket har sparats + TRANSLATE ME: 'Partial view not saved' + Ett fel uppstod när filen sparades + TRANSLATE ME: 'Partial view saved' + TRANSLATE ME: 'Partial view saved without any errors!' + Pythonscriptet har inte sparats + Pythonscriptet kunde inte sparas på grund av ett fel + Pythonscriptet har sparats + Inga fel i pythonscriptet + Sidmallen har inte sparats + Kontrollera att du inte har två sidmallar med samma alias + Sidmallen har sparats + Sidmallen sparades utan fel + XSLT-scriptet sparades inte + XSLT-scriptet innehöll ett fel + XSLT-scripet kunde inte sparas, kontrollera filrättigheterna + XSLT-scriptet har sparats + Inga fel i XSLT-scriptet + + + Använder CSS-syntax, t ex: h1, .redHeader, .blueTex + Redigera stilmall + Redigera egenskaper för stilmall + Namnet som används för att identifiera stilen i HTML-editorn + Förhandsgranska + Stilar + + + Redigera sidmall + Lägg in innehållsyta + Lägg in platshållare för innehållsyta + Lägg in ord från ordboken + Lägg in makro + Lägg in sidfält + Huvudmall + Snabbguide för taggar i umbracos sidmallar + Sidmall + + + Alternativt fält + Alternativ text + Casing + Välj fält + Konvertera radbrytningar + Byter radbrytningar mot html-taggen &lt;br&gt; + Anpassade fält + Ja, endast datum + Formatera som datum + HTML-omkodning + Ersätter specialtecken med deras HTML-motsvarigheter. + Kommer läggas till efter fältets värde + Kommer läggas till före fältets värde + Gemener + Ingen + Infoga efter fält + Infoga före fält + Rekursiv + Avlägsna stycke-taggar + Kommer att avlägsna alla &lt;P&gt; i början och slutet av texten + Standardfält + Versaler + URL-koda + Om fältets innehåll skall sändas till en url, skall detta slås på så att specialtecken kodas + Texten kommer användas om ovanstående fält är tomma + Fältet kommer användas om det primära fältet ovan är tomt + Ja, med tid. Separator: + + + Arbetsuppgifter som tilldelats dig + som har tilldelats dig. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
+ Stäng arbetsuppgift + Översättningsdetaljer + Ladda ned alla översättningsjobb i XML-format + Ladda ned i XML-format + Ladda hem DTD för XML + Fält + Inkludera undersidor + Hej {0}. Detta är ett automatisk mail skickat for att informera dig om att det finns en översättningsförfrågan på dokument '%1' till '{5}' skickad av {2}. För att redigere, besök http://{3}/translation/details.aspx?id={4}. För att få en översikt över dina översättningsuppgigter loggar du in i umbraco på: http://{3}/umbraco.aspx + [{0}] Översättningsuppgit för {1} + Hittade inga användare som är översättare. Vänligen skapa en användare som är översättare innan du börjar skicka innehåll för översättning + Arbetsuppgifter som du har skapat + som du har skapat. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
+ Sidan '{0}' har skickats för översättning + Skicka sidan '{0}' för översättning + Tilldelat av + Arbetsuppgift öppnad + Totalt antal ord + Översätt till + Översättning klar. + Du kan förhandsgranska sidorna du nyss har översatt genom att klicka nedan. Om originalsidan finns kommer du att se en jämförelse mellan din sida och originalsidan. + Översättningen misslyckades. XML-filen kan vara korrupt + Valmöjligheter översättning + Översättare + Ladda upp översättning i XML-format + + + Cacha webbläsare + Papperskorg + Skapade paket + Datatyper + Ordbok + Installerade paket + Installera skin + Installera Startkit + Språk + Installera lokalt paket + Makron + Mediatyper + Medlem + Medlemsgrupper + Roller + Medlemstyper + Dokumenttyper + Paket + Paket + Python-filer + Installera från gemensamt bibliotek + Installera Runway + Runway-moduler + Skript-filer + Skript + Stilmallar + Sidmallar + XSLT-filer + + + Ny uppdatering tillgänglig + {0} är klart, klicka här för att ladda ner + Ingen kontakt med server + Fel vid kontroll av uppdatering. Se trace-stack för mer information. + + + Administratör + Kategorifält + Ändra lösenord + Du kan byta ditt lösenord för Umbraco Back Office genom att fylla i nedanstående formulär och klicka på knappen "Ändra lösenord". + Bekräfta det nya lösenordet + Innehållskanal + Gå direkt till Canvas efter inloggning + Fält för beskrivning + Avaktivera användare + Dokumenttyp + Redaktör + Fält för utdrag + Språk + Login + Startnod i mediabiblioteket + Sektioner + Byt ditt lösenord + Inaktivera tillgång till Umbraco + Lösenord + Ditt lösenord är nu ändrat! + Vänligen bekräfta ditt nya lösenord + Nuvarande lösenord + Vänligen fyll i ditt nya lösenord + Nuvarande lösenord är ogiltigt + Ditt nya lösenord kan inte vara tomt! + Lösenorden matchar inte. Vänligen försök igen! + Det bekräftade lösenordet matchar inte det nya lösenordet! + Ersätt rättigheterna på underliggande noder + Du redigerar nu rättigheterna för sidorna: + Välj de sidor vars rättigheter du vill redigera + Sök igenom alla undernoder + Startnod i innehåll + Användarens namn + Användarrättigheter + Användartyp + Användartyper + Skribent +
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml index f46a3f340c..cca332e63e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml @@ -498,7 +498,7 @@ ]]> %0%:

-

您好!这是一封自动发送的邮件,告诉您任务'%1%'已在'%2%'被用户'%3%'执行

+

您好!这是一封自动发送的邮件,告诉您任务'%1%'已在'%2%'被用户'%3%'执行


  发布     From dcbe6726b04d77fc9377d0192c41df77ec4ae37f Mon Sep 17 00:00:00 2001 From: esn303 Date: Tue, 9 Jul 2013 10:30:20 +0200 Subject: [PATCH 03/85] Updated DE to 6.1.2 Markup encoded instead of CDATA blocks --- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 237 ++++++++++-------- 1 file changed, 136 insertions(+), 101 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index c721c7e227..8ca55653f5 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -1,4 +1,4 @@ - + The German Umbraco Community @@ -35,9 +35,10 @@ Zur Veröffentlichung einreichen Übersetzen Aktualisieren + Veröffentlichung zurücknehmen - Domain hinzufügen + Neue Domain hinzufügen Domain Domain '%0%' hinzugefügt Domain '%0%' entfernt @@ -45,6 +46,16 @@ Beispiel: example.com, www.example.com Domain '%0%' aktualisiert Domains bearbeiten + Erlaubnis verweigert. + entfernen + Ungültiges Element. + Format der Domain ungültig. + Domain wurde bereits zugewiesen. + Sprache + Vererben + Kultur + Domains + Definiert die Kultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element. Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist. Ansicht für @@ -74,6 +85,7 @@ Stil auswählen Stil anzeigen Tabelle einfügen + Die Vorschaufunktion ist deaktiviert, da keine Vorlage zugewiesen ist Über dieses Dokument @@ -110,6 +122,8 @@ Zuletzt bearbeitet am Datei entfernen Link zum Dokument + Verweis auf Medienobjekt(e) + Ups! Dieses Dokument ist veröffentlicht aber nicht im internen Cache aufzufinden: Systemfehler. An welcher Stellen wollen Sie das Element erstellen @@ -156,7 +170,7 @@ Der Papierkorb wird geleert. Bitte warten Sie und schließen Sie das Fenster erst, wenn der Vorgang abgeschlossen ist. Der Papierkorb ist leer Wenn Sie den Papierkorb leeren, werden die enthaltenen Elemente endgültig gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden. - regexlib.com ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut.]]> + Der Webservice von <a target='_blank' href='http://regexlib.com'>regexlib.com</a> ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut. Finden Sie einen vorbereiteten regulären Ausdruck zur Validierung der Werte, die in dieses Feld eingegeben werden - zum Beispiel 'email, 'plz', 'url' oder ähnlich. Macro entfernen Pflichtfeld @@ -165,14 +179,14 @@ Der Zwischenspeicher der Website wird aktualisiert und der veröffentlichte Inhalt auf den neuesten Stand gebracht. Unveröffentlichte Inhalte bleiben dabei weiterhin unveröffentlicht. Anzahl der Spalten Anzahl der Zeilen - Legen Sie eine Platzhalter-ID fest. Anhand der festgelegten Platzhalter-ID können Sie Inhalte von untergeordneten Vorlagen in diese Vorlage integrieren, indem Sie das <asp:content />-Element und die zugehörige Platzhalter-ID verwenden.]]> - Wählen Sie eine Platzhalter-ID aus. Sie können nur unter den Platzhaltern der übergeordneten Vorlage wählen.]]> + <strong>Legen Sie eine Platzhalter-ID fest.</strong> Anhand der festgelegten Platzhalter-ID können Sie Inhalte von untergeordneten Vorlagen in diese Vorlage integrieren, indem Sie das <code>&lt;asp:content /&gt;</code>-Element und die zugehörige Platzhalter-ID verwenden. + <strong>Wählen Sie eine Platzhalter-ID aus.</strong> Sie können nur unter den Platzhaltern der übergeordneten Vorlage wählen. Für Originalgröße auf die Abbildung klicken Element auswählen Zwischenspeicher-Element anzeigen - %0%'.
Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen.]]>
+ Bearbeiten Sie nachfolgend die verschiedenen Sprachversionen für den Wörterbucheintrag '<em>%0%</em>'. <br/>Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen. Name der Kultur @@ -226,6 +240,7 @@ Sie können keine Zelle trennen, die nicht zuvor aus mehreren zusammengeführt wurde. Fehler im XSLT Das XSLT ist fehlerhaft und wurde daher nicht gespeichert. + Dieser Dateityp wird durch die Systemeinstellungen blockiert Info @@ -273,7 +288,7 @@ Sprache Layout Laden - Locked + Gesperrt Anmelden Abmelden Abmelden @@ -297,7 +312,7 @@ Papierkorb Verbleibend Umbenennen - Renew + Erneuern Wiederholen Berechtigungen Suchen @@ -320,6 +335,7 @@ Willkommen ... Breite Ja + Ordner Hintergrundfarbe @@ -336,78 +352,78 @@ Die "web.config"-Datei konnte nicht angepasst werden (Zugriffsrechte?). Bitte passen Sie die Verbindungszeichenfolge manuell an. Die Datenbank ist erreichbar und wurde identifiziert als Datenbank - Installieren, um die Datenbank für Umbraco %0% einzurichten.]]> - weiter, um fortzufahren.]]> - Die angegebene Datenbank ist leider nicht erreichbar. Bitte prüfen Sie die Verbindungszeichenfolge ("Connection String") in der "web.config"-Datei.

-

Um fortzufahren, passen Sie bitte die "web.config"-Datei mit einem beliebigen Text-Editor an. Scrollen Sie dazu nach unten, fügen Sie die Verbindungszeichenfolge für die zuverbindende Datenbank als Eintrag "umbracoDbDSN" hinzu und speichern Sie die Datei.

-

Klicken Sie nach erfolgter Anpassung auf Wiederholen.
Wenn Sie weitere technische Informationen benötigen, besuchen Sie The umbraco documentation wiki.

-]]>
- Bitte kontaktieren Sie Ihren Provider bzw. Server-Administrator für weitere Informationen.]]> - - Bitte bestätigen Sie mit einem Klick auf Update, dass die Datenbank auf Umbraco %0% aktualisiert werden soll.

-

+ Klicken Sie auf <strong>Installieren</strong>, um die Datenbank für Umbraco %0% einzurichten. + Die Datenbank wurde für Umbraco %0% konfiguriert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. + <p>Die angegebene Datenbank ist leider nicht erreichbar. Bitte prüfen Sie die Verbindungszeichenfolge ("Connection String") in der "web.config"-Datei.</p> +<p>Um fortzufahren, passen Sie bitte die "web.config"-Datei mit einem beliebigen Text-Editor an. Scrollen Sie dazu nach unten, fügen Sie die Verbindungszeichenfolge für die zuverbindende Datenbank als Eintrag "umbracoDbDSN" hinzu und speichern Sie die Datei.</p> +<p>Klicken Sie nach erfolgter Anpassung auf <strong>Wiederholen</strong>.<br />Wenn Sie weitere technische Informationen benötigen, besuchen Sie <a href="http://our.umbraco.org/wiki" target="_blank">The umbraco documentation wiki</a>.</p> + + Um diesen Schritt abzuschließen, müssen Sie die notwendigen Informationen zur Datenbankverbindung angeben.<br />Bitte kontaktieren Sie Ihren Provider bzw. Server-Administrator für weitere Informationen. + + <p> + Bitte bestätigen Sie mit einem Klick auf <strong>Update</strong>, dass die Datenbank auf Umbraco %0% aktualisiert werden soll.</p> + <p> Keine Sorge - Dabei werden keine Inhalte gelöscht und alles wird weiterhin funktionieren! -

-]]>
- weiter, um fortzufahren.]]> - "weiter", um mit der Einrichtung fortzufahren.]]> - Das Kennwort des Standard-Benutzers muss geändert werden!]]> - Der Standard-Benutzer wurde deaktiviert oder hat keinen Zugriff auf Umbraco.

Es sind keine weiteren Aktionen notwendig. Klicken Sie auf Weiter um fortzufahren.]]> - Das Kennwort des Standard-Benutzers wurde seit der Installation verändert.

Es sind keine weiteren Aktionen notwendig. Klicken Sie auf Weiter um fortzufahren.]]> + </p> + + Die Datenbank wurde auf die Version %0% aktualisiert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. + Die Datenbank ist fertig eingerichtet. Klicken Sie auf <strong>"weiter"</strong>, um mit der Einrichtung fortzufahren. + <strong>Das Kennwort des Standard-Benutzers muss geändert werden!</strong> + <strong>Der Standard-Benutzer wurde deaktiviert oder hat keinen Zugriff auf Umbraco.</strong></p><p>Es sind keine weiteren Aktionen notwendig. Klicken Sie auf <b>Weiter</b> um fortzufahren. + <strong>Das Kennwort des Standard-Benutzers wurde seit der Installation verändert.</strong></p><p>Es sind keine weiteren Aktionen notwendig. Klicken Sie auf <b>Weiter</b> um fortzufahren. Das Kennwort wurde geändert! - - Bei der Installation von Umbraco erzeugt einen Standard-Benutzer mit dem Login-Namen 'admin' und dem Kennwort 'default'. - WICHTIG: Das Standardkennwort sollte auf ein eigenes Kennwort geändert werden. -

-

+ + <p> + Bei der Installation von Umbraco erzeugt einen Standard-Benutzer mit dem Login-Namen <strong>'admin'</strong> und dem Kennwort <strong>'default'</strong>. + <strong>WICHTIG:</strong> Das Standardkennwort sollte auf ein eigenes Kennwort geändert werden. + </p> + <p> Das Kennwort des Standard-Benutzers wird jetzt geprüft und im Anschluss werden eventuell notwendige Änderungen vorschlagen. -

- ]]>
+ </p> + Schauen Sie sich für einen tollen Start unsere Einführungsvideos an. Mit der Installation stimmen Sie der angezeigten Lizenz für diese Software zu. Bitte beachten Sie, dass diese Umbraco-Distribution aus zwei Lizenzen besteht. Einer freien Open-Source MIT-Lizenz für das Framework und der Umbraco-Freeware-Lizenz für die Verwaltungsoberfläche. Noch nicht installiert. Betroffene Verzeichnisse und Dateien Weitere Informationen zum Thema "Dateiberechtigungen" für Umbraco Für die folgenden Dateien und Verzeichnisse müssen ASP.NET-Schreibberechtigungen gesetzt werden - Die Dateiberechtigungen sind fast perfekt eingestellt!

Damit können Sie Umbraco ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden.]]>
+ <strong>Die Dateiberechtigungen sind fast perfekt eingestellt!</strong><br /><br />Damit können Sie Umbraco ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden. Problemlösung Klicken Sie hier, um den technischen Artikel zu lesen - Video-Lehrgänge zum Thema Verzeichnisberechtigungen für umbraco an oder lesen Sie den technischen Artikel.]]> - Die Dateiberechtigungen sind möglicherweise fehlerhaft!Sie können Umbraco vermutlich ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden.]]> - Die Dateiberechtigungen sind nicht geeignet!

Die Dateiberechtigungen müssen angepasst werden.]]>
- Die Dateiberechtigungen sind perfekt eingestellt!

Damit ist Umbraco komplett eingerichtet und es können problemlos Erweiterungspakete installiert werden.]]>
+ Schauen Sie sich die <strong>Video-Lehrgänge</strong> zum Thema Verzeichnisberechtigungen für umbraco an oder lesen Sie den technischen Artikel. + <strong>Die Dateiberechtigungen sind möglicherweise fehlerhaft!</strong>Sie können Umbraco vermutlich ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden. + <strong>Die Dateiberechtigungen sind nicht geeignet!</strong><br /><br />Die Dateiberechtigungen müssen angepasst werden. + <strong>Die Dateiberechtigungen sind perfekt eingestellt!</strong><br /><br /> Damit ist Umbraco komplett eingerichtet und es können problemlos Erweiterungspakete installiert werden. Verzeichnisprobleme lösen Folgen Sie diesem Link für weitere Informationen zum Thema ASP.NET und der Erstellung von Verzeichnissen. Verzeichnisberechtigungen anpassen Umbraco benötigt Schreibrechte auf verschiedene Verzeichnisse, um Dateien wie Bilder oder PDF-Dokumente speichern zu können. Außerdem werden temporäre Daten zur Leistungssteigerung der Website angelegt. Ich möchte mit einem leeren System ohne Inhalte und Vorgaben starten - Die Website ist zur Zeit komplett leer und ohne Inhalte und Vorgaben zu Erstellung eigener Dokumenttypen und Vorlagen bereit. - (So geht's) + (<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">So geht's</a>) Sie können "Runway" auch jederzeit später installieren. Verwenden Sie hierzu den Punkt "Pakete" im Entwickler-Bereich. - ]]> + Die Einrichtung von Umbraco ist abgeschlossen und das Content-Management-System steht bereit. Wie soll es weitergehen? 'Runway' wurde installiert - -Dies sind unsere empfohlenen Module. Schauen Sie sich die an, die Sie installieren möchten oder Sie sich die komplette Liste der Module an. -]]> + +Die Basis ist eingerichtet. Wählen Sie die Module aus, die Sie nun installieren möchten.<br /> +Dies sind unsere empfohlenen Module. Schauen Sie sich die an, die Sie installieren möchten oder Sie sich die <a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">komplette Liste der Module an.</a> + Nur für erfahrene Benutzer empfohlen Ich möchte mit einer einfache Website starten - + +<p> "Runway" ist eine einfache Website mit einfachen Dokumententypen und Vorlagen. Der Installer kann Runway automatisch einrichten, aber es kann einfach verändert, erweitert oder entfernt werden. Es ist nicht zwingend notwendig und umbraco kann auch ohne Runway verwendet werden. Runway bietet eine einfache Basis zum schnellen Start mit umbraco. Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die "Runway Modules" und Ihre Runway-Seite erweitern. -

- -Runway umfasst: Home page, Getting Started page, Installing Modules page.
-Optionale Module: Top Navigation, Sitemap, Contact, Gallery. -
-]]>
+</p> +<small> +<em>Runway umfasst:</em> Home page, Getting Started page, Installing Modules page.<br /> +<em>Optionale Module:</em> Top Navigation, Sitemap, Contact, Gallery. +</small> +
Was ist 'Runway'? Schritt 1/5 Lizenz Schritt 2/5: Datenbank @@ -415,17 +431,17 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Schritt 4/5: Sicherheit Schritt 5/5: Umbraco ist startklar! Vielen Dank, dass Sie Umbraco installieren! - Zur neuen SeiteSie haben Runway installiert, schauen Sie sich doch mal auf Ihrer Website um.]]> - Weitere Hilfe und InformationenHilfe von unserer preisgekrönten Community, Dokumentation und kostenfreie Videos, wie Sie eine einfache Website erstellen, ein Packages nutzen und eine schnelle Einführung in alle Umbraco-Begriffe]]> + <h3>Zur neuen Seite</h3>Sie haben Runway installiert, schauen Sie sich doch mal auf Ihrer Website um. + <h3>Weitere Hilfe und Informationen</h3>Hilfe von unserer preisgekrönten Community, Dokumentation und kostenfreie Videos, wie Sie eine einfache Website erstellen, ein Packages nutzen und eine schnelle Einführung in alle Umbraco-Begriffe Umbraco %0% wurde installiert und kann verwendet werden - "web.config"-Datei von Hand anpassen und den AppSetting-Schlüssel umbracoConfigurationStatus auf den Wert '%0%' ändern.]]> - sofort starten, in dem Sie auf "Umbraco starten" klicken.]]> - Umbraco startenUm Ihre Website zu verwalten, öffnen Sie einfach den Administrationsbereich und beginnen Sie damit, Inhalte hinzuzufügen sowie Vorlagen und Stylesheets zu bearbeiten oder neue Funktionen einzurichten]]> + Um die Installation abzuschließen, müssen Sie die <strong>"web.config"-Datei</strong> von Hand anpassen und den AppSetting-Schlüssel <strong>umbracoConfigurationStatus</strong> auf den Wert <strong>'%0%'</strong> ändern. + Sie können <strong>sofort starten</strong>, in dem Sie auf "Umbraco starten" klicken. + <h3>Umbraco starten</h3>Um Ihre Website zu verwalten, öffnen Sie einfach den Administrationsbereich und beginnen Sie damit, Inhalte hinzuzufügen sowie Vorlagen und Stylesheets zu bearbeiten oder neue Funktionen einzurichten Verbindung zur Datenbank fehlgeschlagen. Umbraco Version 3 Umbraco Version 4 Anschauen - Umbraco %0% oder einem Upgrade von Version 3.0.

Klicken Sie auf weiter, um zu beginnen.]]>
+ Dieser Assistent führt Sie durch die Einrichtung einer neuen Installation von <strong>Umbraco %0%</strong> oder einem Upgrade von Version 3.0.<br /><br />Klicken Sie auf <strong>weiter</strong>, um zu beginnen. Code der Kultur @@ -436,7 +452,7 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Erneuern Sie um Ihre Arbeit zu speichern... - © 2001 - %0%
umbraco.org

]]>
+ <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.org" style="text-decoration: none" target="_blank">umbraco.org</a></p> Willkommen zu Umbraco, bitte geben Sie Ihren Benutzernamen und Ihr Kennwort ein: @@ -455,57 +471,58 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Das aktuelle Element kann aufgrund seines Dokumenttyps nicht an diese Stelle verschoben werden. Das ausgewählte Element kann nicht zu einem seiner eigenen Unterelemente verschoben werden. Diese Aktion ist nicht erlaubt, da Sie unzureichende Berechtigungen für mindestens ein untergeordnetes Element haben. + Kopierte Elemente mit dem Original verknüpfen Bearbeiten Sie Ihre Benachrichtigungseinstellungen für '%0%' - Hallo %0%, die Aufgabe '%1%' (von Benutzer '%3%') an der Seite '%2%' wurde ausgeführt. -Zum Bearbeiten verwenden Sie bitte diesen Link: http://%4%/actions/editContent.aspx?id=%5% +Zum Bearbeiten verwenden Sie bitte diesen Link: http://%4%/umbraco/actions/editContent.aspx?id=%5% Einen schönen Tag wünscht Ihr freundlicher Umbraco-Robot -]]> - Hallo %0%,

+
+ +<p>Hallo %0%,</p> -

die Aufgabe '%1%' (von Benutzer '%3%') an der Seite '%2%' wurde ausgeführt.

- -

-

Zusammenfassung der Aktualisierung:

- +<p>die Aufgabe <strong>'%1%'</strong> (von Benutzer '%3%') an der Seite <a href="%7%"><strong>'%2%'</strong></a> wurde ausgeführt.</p> +<div style="margin: 8px 0; padding: 8px; display: block;"> + <br /> + <a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/umbraco/actions/publish.aspx?id=%5%">&nbsp;&nbsp;VERÖFFENTLICHEN&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEARBEITEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/umbraco/actions/delete.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;LÖSCHEN&nbsp;&nbsp;&nbsp;&nbsp;</a> + <br /> +</div> +<p> + <h3>Zusammenfassung der Aktualisierung:</h3> + <table style="width: 100%;"> %6% -
-

- -

Einen schönen Tag wünscht
Ihr freundlicher Umbraco-Robot

-]]>
+ </table> + </p> +<div style="margin: 8px 0; padding: 8px; display: block;"> + <br /> + <a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/umbraco/actions/publish.aspx?id=%5%">&nbsp;&nbsp;VERÖFFENTLICHEN&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEARBEITEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/umbraco/actions/delete.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;LÖSCHEN&nbsp;&nbsp;&nbsp;&nbsp;</a> + <br /> +</div> +<p>Einen schönen Tag wünscht<br />Ihr freundlicher Umbraco-Robot</p> + [%0%] Benachrichtigung: %1% ausgeführt an Seite '%2%' Benachrichtigungen - Umbraco-Pakete besitzen üblicherweise die Dateiendungen ".umb" oder ".zip".]]> + Wählen Sie ein Paket auf Ihrem lokalen Computer über "Datei auswählen" aus. <br />Umbraco-Pakete besitzen üblicherweise die Dateiendungen ".umb" oder ".zip". Autor Demonstration Dokumentation Paket-Meta-Daten Name des Pakets Paket enthält keine Elemente -
Sie können das Paket ohne Gefahr deinstallieren indem Sie "Paket deinstallieren" anklicken.]]>
+ Die Paket-Datei enthält keine Elemente die deinstalliert werden können.<br/><br/>Sie können das Paket ohne Gefahr deinstallieren indem Sie "Paket deinstallieren" anklicken. Keine Updates für das Paket verfügbar Paket-Optionen Informationen zum Paket @@ -514,13 +531,14 @@ Ihr freundlicher Umbraco-Robot Paket wurde deinstalliert Das Paket wurde erfolgreich deinstalliert Paket deinstallieren - Achtung: alle Dokumente, Medien, etc, die von den zu entfernenden Elementen abhängen, werden nicht mehr funktionieren und im Zweifelsfall kann dass gesamte CMS instabil werden. Bitte deinstallieren Sie also mit Vorsicht. Falls Sie unsicher sind, kontaktieren Sie den Autor des Pakets.]]> + Sie können einzelne Elemente, die Sie nicht deinstallieren möchten, unten abwählen. Wenn Sie "Deinstallation bestätigen" klicken, werden alle markierten Elemente entfernt.<br /><span style="color: Red; font-weight: bold;">Achtung:</span> alle Dokumente, Medien, etc, die von den zu entfernenden Elementen abhängen, werden nicht mehr funktionieren und im Zweifelsfall kann dass gesamte CMS instabil werden. Bitte deinstallieren Sie also mit Vorsicht. Falls Sie unsicher sind, kontaktieren Sie den Autor des Pakets. Update vom Paket-Repository herunterladen Paket-Update Hinweise für die Durchführung des Updates Es ist ein Update für dieses Paket verfügbar. Sie können es direkt vom Umbraco-Paket-Repository herunterladen. Version des Pakets Paket-Webseite aufrufen + Versionsverlauf des Pakets Einfügen mit Formatierung (Nicht empfohlen) @@ -554,7 +572,9 @@ Ihr freundlicher Umbraco-Robot %0% wurde veröffentlicht %0% und die untergeordneten Elemente wurden veröffentlicht %0% und alle untergeordneten Elemente veröffentlichen - Ok wird %0% veröffentlicht und auf der Website sichtbar.

Sie können dieses Element mitsamt seinen untergeordneten Elementen veröffentlichen, indem Sie Unveröffentlichte Unterelemente einschließen aktivieren.]]>
+ Mit <em>Ok</em> wird <strong>%0%</strong> veröffentlicht und auf der Website sichtbar.<br/><br />Sie können dieses Element mitsamt seinen untergeordneten Elementen veröffentlichen, indem Sie <em>Unveröffentlichte Unterelemente einschließen</em> aktivieren. + %0% konnte nicht veröffentlicht werden, da einige Daten die Gültigkeitsprüfung nicht bestanden haben. + %0% kann nicht veröffentlicht werden, da das übergeordnete Dokument nicht veröffentlicht ist. Neuer exerner Link @@ -570,7 +590,7 @@ Ihr freundlicher Umbraco-Robot Aktuelle Version - Text in rot fehlen in der ausgewählten Version, grün markierter Text wurde hinzugefügt.]]> + Zeigt die Unterschiede zwischen der aktuellen und der ausgewählten Version an.<br />Text in <del>rot</del> fehlen in der ausgewählten Version, <ins>grün</ins> markierter Text wurde hinzugefügt. Dokument wurde zurückgesetzt Zeigt die ausgewählte Version als HTML an. Wenn Sie sich die Unterschiede zwischen zwei Versionen anzeigen lassen wollen, benutzen Sie bitte die Vergleichsansicht. Zurücksetzen auf @@ -606,6 +626,9 @@ Ihr freundlicher Umbraco-Robot Registerkarte Registerkartenbeschriftung Registerkarten + Dieser Dokumenttyp verwendet + Masterdokumenttyp aktiviert + als Masterdokumenttyp. Register vom Masterdokumenttyp werden nicht angezeigt und können nur im Masterdokumenttyp selbst bearbeitet werden Sortierung abgeschlossen. @@ -658,6 +681,13 @@ Ihr freundlicher Umbraco-Robot XSLT kann nicht gespeichert werden. Bitte überprüfen Sie die Schreibrechte auf Dateiebene. XSLT gespeichert Keine Fehler im XSLT + Medium gespeichert + Veröffentlichung des Inhalts aufgehoben + Partielle Ansicht gespeichert + Partielle Ansicht ohne Fehler gespeichert. + Partielle Ansicht nicht gespeichert + Fehler beim Speichern der Datei. + Benutzertyp gepsichert Gewünschter CSS-Selektor, zum Beispiel 'h1', '.bigHeader' oder 'p.infoText' @@ -684,7 +714,7 @@ Ihr freundlicher Umbraco-Robot Groß- und Kleinschreibung Feld auswählen Zeilenumbrüche ersetzen - ]]> + Ersetzt Zeilenumbrüche durch das HTML-Tag <br /> nur Datum Als Datum formatieren HTML kodieren @@ -697,17 +727,19 @@ Ihr freundlicher Umbraco-Robot Dem Feldinhalt voranstellen Rekursiv Textabsatz entfernen - am Anfang und am Ende des Feldinhalts werden entfernt]]> + Alle <p> am Anfang und am Ende des Feldinhalts werden entfernt Großbuchstaben URL kodieren Wandelt Sonderzeichen zur Verwendung in URLs um Wird nur verwendet, wenn beide vorgenannten Felder leer sind Dieses Feld wird nur verwendet, wenn das primäre Feld leer ist Datum und Zeit mit Trennzeichen: + Benutzerdefinierte Felder + Standardfelder Ihre Aufgaben - ihre Übersetzungsaufträge. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken.
Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen".]]>
+ Die Liste unten zeigt <strong>ihre</strong> Übersetzungsaufträge. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken. <br/>Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen". Aufgabe abschließen Details zur Übersetzung Alle Übersetzungsaufgaben als XML-Datei herunterladen @@ -715,7 +747,7 @@ Ihr freundlicher Umbraco-Robot Herunterladen der XML-Defintionen (XML-DTD) Felder Einschließlich der Unterseiten - Hallo %0%, das Dokument '%1%' wurde von '%2%' zur Übersetzung in '%5%' freigegeben. @@ -726,11 +758,11 @@ Sie können sich auch alle anstehenden Übersetzungen gesammelt im Umbraco-Verwa Einen schönen Tag wünscht Ihr freundlicher Umbraco-Robot - ]]> + [%0%] Aufgabe zur Übersetzung von '%1%' Bitte erstellen Sie zuerst mindestens einen Übersetzer. Von Ihnen erstellte Aufgaben - Ihnen erstellten Seiten. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken. Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen".]]> + Die Liste unten zeigt die von <strong>Ihnen</strong> erstellten Seiten. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken. Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen". Die Seite '%0%' wurde zur Übersetzung gesendet Sendet die Seite '%0%' zur Übersetzung Zugewiesen von @@ -799,7 +831,7 @@ Ihr freundlicher Umbraco-Robot Zugang sperren Kennwort Ihr Kennwort wurde geändert! - Aktuelle Kennwort + Aktuelle Kennwort Ungültig aktuelle Kennwort Geben Sie Ihr neues Kennwort ein Ihr neues Kennwort darf nicht leer sein! @@ -815,5 +847,8 @@ Ihr freundlicher Umbraco-Robot Rolle Rollen Autor + Neues Kennwort + Neues Kennwort (Bestätigung) + Bitte bestätigen Sie das neue Kennwort -
\ No newline at end of file + From 1272a7c74b6cbcb834dd8bff178edc21a2d5ffc5 Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Tue, 9 Jul 2013 12:56:13 +0200 Subject: [PATCH 04/85] Prettifying norwegian translation Removed obsolete, translated new, removed incorrect spacing and hyphenation, misc. improvements in term usage. Ref. http://i18n.skulelinux.no/nb/Fellesordl.eng-no.html. --- src/Umbraco.Web.UI/umbraco/config/lang/no.xml | 466 +++++++++--------- 1 file changed, 246 insertions(+), 220 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml index ce5d23a286..49f3b77031 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml @@ -1,4 +1,4 @@ - + The umbraco community @@ -6,7 +6,7 @@ Angi domene - Audit Trail + Revisjoner Bla gjennom Kopier Opprett @@ -15,8 +15,6 @@ Deaktiver Tøm papirkurv Eksporter dokumenttype - TRANSLATE ME: 'Export to .NET' - TRANSLATE ME: 'Export to .NET' Importer documenttype Importer pakke Rediger i Canvas @@ -35,59 +33,71 @@ Send til publisering Oversett Oppdater + Avpubliser Legg til domene Domene Domene '%0%' er nå opprettet og tilknyttet siden Domenet '%0%' er nå slettet - Domenet '%0%' eksisterer allerede - f.eks.: dittdomene.com, www.dittdomene.com + Domenet '%0%' er allerede tilknyttet + Gyldige domenenavn er: "eksempel.no", "www.eksempel.no", "eksempel.no:8080" eller "https://www.eksempel.no/".<br/><br/>Stier med ett nivå støttes, f.eks. "eksempel.com/no". Imidlertid bør det unngås. Bruk heller språkinnstillingen over. Domenet '%0%' er nå oppdatert eller rediger eksisterende domener + Ingen tilgang. + Fjern + Ugyldig node. + Ugyldig domeneformat. + Domene er allerede tilknyttet. + Språk + Arv + Språk + Sett språk for underordnede noder eller arv språk fra overordnet.<br/>Vil også gjelde denne noden, med mindre et underordnet domene også gjelder. + Domener Viser for Fet - Tilbakerykk avsnitt + Reduser innrykk Sett inn skjemafelt Sett inn grafisk overskrift Rediger HTML - Innrykk avsnitt + Øk innrykk Kursiv - Sentrer - Venstrestill avsnitt - Høyrestil avsnitt + Midtstill + Juster tekst venstre + Juster tekst høyre Sett inn lenke - Sett inn lokal lenke - Punktliste - Numerert liste + Sett inn lokal lenke (anker) + Punktmerking + Nummerering Sett inn makro Sett inn bilde Rediger relasjoner Lagre Lagre og publiser Lagre og send til publisering - Se siden + Forhåndsvis Velg formattering - Vis koder + Vis stiler Sett inn tabell + Forhåndsvisning er deaktivert siden det ikke er angitt noen mal Om siden Alternativ lenke (hvordan du ville beskrevet bildet over telefon) Alternative lenker - Klikk på musen for å redigere denne noden + Klikk for å redigere denne noden Opprettet av Opprettet den Dokumenttype Redigerer Utløpsdato Denne noden er endret siden siste publisering - Denne noden er ennå ikke publisert + Denne noden er enda ikke publisert Sist publisert Mediatype Medlemsgruppe @@ -96,46 +106,48 @@ Ingen dato valgt Sidetittel Egenskaper - Dette dokumentet er publisert, men ikke synlig da den overliggende siden '%0%' ikke er publisert! + Dette dokumentet er publisert, men ikke synlig ettersom den overliggende siden '%0%' ikke er publisert Publisert Publiseringsstatus - Utgivelsesdato + Publiseringsdato Fjern dato Sorteringsrekkefølgen er oppdatert - For å sortere elementene, simpelthen dra elementene eller klikk på en av pverskriftene. Du kan velge flere elementer ved å holde "shift" eller "control" tasten mens du velger + Trekk og slipp nodene eller klikk på kolonneoverskriftene for å sortere. Du kan velge flere noder ved å holde shift eller control tastene mens du velger. Statistikk Tittel (valgfri) Type Avpubliser - Sist redigeret + Sist endret Fjern fil Lenke til dokument + Link til media + Intern feil: dokumentet er publisert men finnes ikke i hurtigbuffer Hvor ønsker du å oprette den nye %0% - Oppret under + Opprett under Velg en type og skriv en tittel - Til din webside - TRANSLATE ME: '- Hide' - Hvis umbraco ikke starter, kan det skyldes at pop-up vinduer ikke er tillatt + Til ditt nettsted + - Skjul + Hvis Umbraco ikke starter, kan det skyldes at pop-up vinduer ikke er tillatt er åpnet i nytt vindu Omstart Besøk Velkommen - Navn på lokalt link + Navn på lokal link Rediger domener Lukk dette vinduet Er du sikker på at du vil slette Er du sikker på at du vil deaktivere Vennligst kryss av i denne boksen for å bekrefte sletting av %0% element(er) - Er du sikker på at du vil forlate umbraco? + Er du sikker på at du vil forlate Umbraco? Er du sikker? - TRANSLATE ME: 'Cut' - Rediger ordbok nøkkel + Klipp ut + Rediger ordboksnøkkel Rediger språk Sett inn lokal link Sett inn spesialtegn @@ -144,42 +156,39 @@ Sett inn lenke Sett inn makro Sett inn tabell - Sist redigeret + Sist redigert Lenke Intern link: Ved lokal link, sett inn "#" foran link Åpne i nytt vindu? - TRANSLATE ME: 'Macro Settings' + Makroinnstillinger Denne makroen har ingen egenskaper du kan endre Lim inn Endre rettigheter for Innholdet i papirkurven blir nå slettet. Vennligst ikke lukk dette vinduet mens denne operasjonen foregår Papirkurven er nå tom - Når elementer blir slettet fra papirkurven, vil de være slettet for godt - regexlib.com webtjeneste opplever for tiden problemer, som vi ikke har kontroll over. Vi beklager denne uleiligheten.]]> + Når elementer blir slettet fra papirkurven vil de være slettet for alltid + <a target='_blank' href='http://regexlib.com'>regexlib.com</a> tjenesten opplever for tiden problemer som vi ikke har kontroll over. Vi beklager denne ubeleiligheten. Søk etter et regulært uttrykk for å legge inn validering til et felt. Eksempel: 'email, 'zip-code' 'url' - TRANSLATE ME: 'Remove Macro' + Fjern makro Obligatorisk Nettstedet er indeksert - Siten er nu republisert + Hurtigbufferen er blitt oppdatert. Alt publisert innhold er nå à jour. Alt upublisert innhold er fortsatt ikke publisert. Hurtigbufferen for siden vil bli oppdatert. Alt publisert innhold vil bli oppdatert, mens upublisert innhold vil forbli upublisert. Antall kolonner Antall rader - Sett en plassholder-ID
Ved å sette en ID på plassholderen kan du legge inn innhold i denne malen fra underliggende maler, - ved å referere denne ID'en ved hjelp av et <asp:content /> element.]]>
- Velg en plassholder ID fra listen under. Du kan bare - velge ID'er fra den gjeldende malens overmal.]]> - Klikk på bildet for å se det i naturlig størrelse + <strong>Sett en plassholder-ID</strong><br/>Ved å sette en ID på plassholderen kan du legge inn innhold i denne malen fra underliggende maler, ved å referere denne ID'en ved hjelp av et <code>&lt;asp:content /&gt;</code> element. + <strong>Velg en plassholder ID</strong> fra listen under. Du kan bare velge ID'er fra den gjeldende malens overordnede mal. + Klikk på bildet for å se det i full størrelse Velg punkt - Se Cache Item + Se buffret node - - Kulturnavn + Rediger de forskjellige språkversjonene for ordbokelementet '<em>%0%</em>' under.<br/>Du kan legge til flere språk under 'språk' i menyen til venstre. + Språk - Tillatte typer + Tillatte underordnede noder Opprett Slett arkfane Beskrivelse @@ -190,8 +199,8 @@ Legg til forhåndsverdi Database datatype - Datatype GUID - Renderkontroll + Kontrollelement GUID + Kontrollelement Knapper Aktiver avanserte instillinger for Aktiver kontektsmeny @@ -201,34 +210,35 @@ Bredde og høyde - Dine data har blitt lagret, men før du kan publisere denne siden må du fikse noen feil: + Dine data har blitt lagret, men før du kan publisere denne siden må du rette noen feil: Den gjeldende Membership Provider støtter ikke endring av passord. (EnablePasswordRetrieval må være satt til sann) - %0% allerede eksisterer + %0% finnes allerede Det var feil i dokumentet: Det var feil i skjemaet: - Passordet bør være minst %0% tegn langt og inneholde minst %1% numeriske tegn - %0% må være en integer - %0% under %1% er et obligatorisk felt og skal fylles ut - %0% er et obligatorisk felt og skal fylles ut + Passordet bør være minst %0% tegn og inneholde minst %1% numeriske tegn + %0% må være et heltall + %0% under %1% er obligatorisk + %0% er obligatorisk %0% under %1% er ikke i et korrekt format %0% er ikke i et korrekt format - TRANSLATE ME: 'NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.' - Du må fylle ut både Alias & Navn på den nye egenskapstypen! + NB! Selv om CodeMirror er aktivert i konfigurasjon er det deaktivert i Internet Explorer pga. ustabilitet. + Fyll ut både alias og navn på den nye egenskapstypen! Det er et problem med lese/skrive rettighetene til en fil eller mappe Tittel mangler Type mangler Du er i ferd med å gjøre bildet større enn originalen. Det vil forringe kvaliteten på bildet, ønsker du å fortsette? Feil i python-skriptet - Python-skriptet ditt ble ikke lagret fordi den inneholder en eller flere feil - Startnode er slettet kontakt systemadministrator + Python-skriptet ble ikke lagret fordi det inneholder en eller flere feil + Startnode er slettet. Kontakt din administrator Du må markere innhold før du kan endre stil - Det er ingen aktive styles eller formatteringer på denne siden - Du må stå til venstre for de 2 cellene du ønsker å slå sammen! + Det er ingen aktive stiler eller formateringer på denne siden + Sett markøren til venstre i de 2 cellene du ønsker å slå sammen Du kan ikke dele en celle som allerede er delt. Feil i XSLT kode - Din XSLT er ikke oppdatert da den inneholder feil + XSLT ble ikke lagret på grunn av feil i koden + Filtypen er deaktivert av administrator Om @@ -236,10 +246,10 @@ Legg til Alias Er du sikker? - Kant + Ramme eller Avbryt - Celle margin + Cellemargin Velg Lukk Lukk vindu @@ -260,7 +270,7 @@ Ned Last ned Rediger - Redigeret + Endret Elementer E-post Feil @@ -276,9 +286,9 @@ Språk Layout Laster - TRANSLATE ME: 'Locked' - Login - Logg av + Låst + Logg inn + Logg ut Logg ut Makro Flytt @@ -299,8 +309,8 @@ E-post som innholdet i skjemaet skal sendes til Papirkurv Gjenværende - Døp om - TRANSLATE ME: 'Renew' + Gi nytt navn + Forny Prøv igjen Rettigheter Søk @@ -310,7 +320,7 @@ Størrelse Sorter Type - Skriv for å søke... + Søk... Opp Oppdater Oppgrader @@ -323,11 +333,12 @@ Velkommen... Bredde Ja + Mappe Bakgrunnsfarge Fet - Tekst farge + Tekstfarge Skrifttype Tekst @@ -339,43 +350,43 @@ Kunne ikke lagre Web.Config-filen. Vennligst endre databasens tilkoblingsstreng manuelt. Din database er funnet og identifisert som Databasekonfigurasjon - installer-knappen for å installere Umbraco %0% databasen]]> - Neste for å fortsette.]]> - Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.

For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.

Klikk prøv på nytt når du er ferdig.
Mer informasjon om redigering av web.config her.

]]>
- Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator.]]> - Trykk på knappen oppgrader for å oppgradere databasen din til Umbraco %0%

Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå!

]]>
- Trykk Neste for å fortsette.]]> - neste for å fortsette konfigurasjonsveiviseren]]> - Passordet til standardbrukeren må endres!]]> - Standardbrukeren har blitt deaktivert eller har ingen tilgang til umbraco!

Ingen videre handling er nødvendig. Klikk neste for å fortsette.]]> - Passordet til standardbrukeren har blitt forandret etter installasjonen!

Ingen videre handling er nødvendig. Klikk Neste for å fortsette.]]> + Klikk <strong>installer</strong>-knappen for å installere Umbraco %0% databasen + Umbraco %0% har nå blitt kopiert til din database. Trykk <strong>Neste</strong> for å fortsette. + <p>Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.</p><p>For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.</p><p>Klikk <strong>prøv på nytt</strong> når du er ferdig.<br /> <a href="http://umbraco.org/redir/installWebConfig" target="_blank">Mer informasjon om redigering av web.config her.</a></p> + For å fullføre dette steget, må du vite en del informasjon om din database server ("tilkoblingsstreng").<br/> Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator. + <p> Trykk på knappen <strong>oppgrader</strong> for å oppgradere databasen din til Umbraco %0%</p> <p> Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå! </p> + Databasen din har blitt oppgradert til den siste utgaven, %0%.<br/>Trykk <strong>Neste</strong> for å fortsette. + Databasen din er av nyeste versjon! Klikk <strong>neste</strong> for å fortsette konfigurasjonsveiviseren + <strong>Passordet til standardbrukeren må endres! + <strong>Standardbrukeren har blitt deaktivert eller har ingen tilgang til umbraco!</strong></p><p>Ingen videre handling er nødvendig. Klikk <b>neste</b> for å fortsette. + <strong>Passordet til standardbrukeren har blitt forandret etter installasjonen!</strong></p><p>Ingen videre handling er nødvendig. Klikk <strong>Neste</strong> for å fortsette. Passordet er blitt endret! - umbraco skaper en standard bruker med login ( "admin") og passord ( "default") . Det er viktig at passordet er endret til noe unikt.

Dette trinnet vil sjekke standard brukerens passord og foreslår hvis det må skiftes ]]> + <p> umbraco skaper en standard bruker med login <strong> ( "admin") </ strong> og passord <strong> ( "default") </ strong>. Det er <strong> viktig </ strong> at passordet er endret til noe unikt. </ p> <p> Dette trinnet vil sjekke standard brukerens passord og foreslår hvis det må skiftes </ p> Få en god start med våre introduksjonsvideoer Ved å klikke på Neste-knappen (eller endre umbracoConfigurationStatus i Web.config), godtar du lisensen for denne programvaren som angitt i boksen nedenfor. Legg merke til at denne umbraco distribusjon består av to ulike lisenser, åpen kilde MIT lisens for rammen og umbraco frivareverktøy lisens som dekker brukergrensesnittet. Ikke installert. Berørte filer og mapper Mer informasjon om å sette opp rettigheter for umbraco her Du må gi ASP.NET brukeren rettigheter til å endre de følgende filer og mapper - Rettighetene er nesten perfekt satt opp!

Du kan kjøre umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte umbraco fullt ut.]]> + <strong>Rettighetene er nesten perfekt satt opp!</strong><br/><br/> Du kan kjøre umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte umbraco fullt ut. Hvordan løse problemet Klikk her for å lese tekstversjonen - innføringsvideo
om å sette opp rettigheter for umbraco eller les tekstversjonen.]]> - Rettighetsinnstillingene kan være et problem!


Du kan kjøre umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte umbraco fullt ut.]]> - Rettighetsinstillingene er ikke klargjort for umbraco!

For å kunne kjøre umbraco, må du oppdatere rettighetsinnstillingene dine.]]>
- Rettighetsinnstillingene er perfekt!

Du er klar for å kjøre umbraco og installere pakker!]]>
+ Se vår <strong>innføringsvideo</strong> om å sette opp rettigheter for umbraco eller les tekstversjonen. + <strong>Rettighetsinnstillingene kan være et problem!</strong><br/><br/> Du kan kjøre umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte umbraco fullt ut. + <strong>Rettighetsinstillingene er ikke klargjort for umbraco!</strong><br/><br/> For å kunne kjøre umbraco, må du oppdatere rettighetsinnstillingene dine. + <strong>Rettighetsinnstillingene er perfekt!</strong><br/><br/>Du er klar for å kjøre umbraco og installere pakker! Løser mappeproblem Følg denne linken for mer informasjon om problemer med ASP.NET og oppretting av mapper Konfigurerer mappetillatelser umbraco trenger skrive/endre tilgang til enkelte mapper for å kunne lagre filer som bilder og PDF-dokumenter. Den lagrer også midlertidig data (aka: hurtiglager) for å øke ytelsen på websiden din. Jeg ønsker å starte fra bunnen. - lær hvordan) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker.]]> + Din website er helt tom for øyeblikket. Dette er perfekt hvis du vil begynne helt forfra og lage dine egne dokumenttyper og maler. (<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">lær hvordan</a>) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker. Du har akkurat satt opp en ren Umbraco plattform. Hva vil du gjøre nå? Runway er installert - Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se denfulle listen av moduler ]]> + Du har nå fundamentet på plass. Velg hvilke moduler du ønsker å installer på toppen av det.<br/> Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se den<a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">fulle listen av moduler</a> Bare anbefalt for erfarne brukere Jeg vil starte med en enkel webside - "Runway" er en enkel webside som utstyrer deg med noen grunnleggende dokumenttyper og maler. Veiviseren kan sette opp Runway for deg automatisk, men du kan enkelt endre, utvide eller slette den. Runway er ikke nødvendig, og du kan enkelt bruke Umbraco uten den. Imidlertidig tilbyr Runway et enkelt fundament basert på de beste metodene for å hjelpe deg i gang fortere enn noensinne. Hvis du velger å installere Runway, kan du også velge blant grunnleggende byggeklosser kalt Runway Moduler for å forøke dine Runway-sider.

Sider inkludert i Runway: Hjemmeside, Komme-i-gang, Installere moduler.
Valgfrie Moduler: Toppnavigasjon, Sidekart, Kontakt, Galleri.
]]>
+ <p> "Runway" er en enkel webside som utstyrer deg med noen grunnleggende dokumenttyper og maler. Veiviseren kan sette opp Runway for deg automatisk, men du kan enkelt endre, utvide eller slette den. Runway er ikke nødvendig, og du kan enkelt bruke Umbraco uten den. Imidlertidig tilbyr Runway et enkelt fundament basert på de beste metodene for å hjelpe deg i gang fortere enn noensinne. Hvis du velger å installere Runway, kan du også velge blant grunnleggende byggeklosser kalt Runway Moduler for å forøke dine Runway-sider. </p> <small> <em>Sider inkludert i Runway:</em> Hjemmeside, Komme-i-gang, Installere moduler.<br /> <em>Valgfrie Moduler:</em> Toppnavigasjon, Sidekart, Kontakt, Galleri. </small> Hva er Runway Steg 1/5 Godta lisens Steg 2/5 Database konfigurasjon @@ -383,93 +394,94 @@ Steg 4/5: Skjekk Umbraco sikkerheten Steg 5/5: Umbraco er klar for deg til å starte! Tusen takk for at du valgte Umbraco! - Se ditt nye nettsted Du har installert Runway, hvorfor ikke se hvordan ditt nettsted ser ut.]]> - Mer hjelp og info Få hjelp fra vårt prisbelønte samfunn, bla gjennom dokumentasjonen eller se noen gratis videoer på hvordan man bygger et enkelt nettsted, hvordan bruke pakker og en rask guide til umbraco terminologi]]> + <h3>Se ditt nye nettsted</h3> Du har installert Runway, hvorfor ikke se hvordan ditt nettsted ser ut. + <h3>Mer hjelp og info</h3> Få hjelp fra vårt prisbelønte samfunn, bla gjennom dokumentasjonen eller se noen gratis videoer på hvordan man bygger et enkelt nettsted, hvordan bruke pakker og en rask guide til umbraco terminologi Umbraco %0% er installert og klar til bruk - web.config filen, og oppdatere AppSetting-nøkkelen umbracoConfigurationStatus til verdien '%0%']]> - starte øyeblikkelig ved å klikke på "Start Umbraco" knappen nedenfor.
Hvis du er ny på umbraco, kan du finne mange ressurser på våre komme-i-gang sider.]]>
- Start Umbraco For å administrere din webside, åpne umbraco og begynn å legge til innhold, oppdatere maler og stilark eller utvide funksjonaliteten]]> + For å fullføre installasjonen, må du manuelt endre <strong>web.config</strong> filen, og oppdatere AppSetting-nøkkelen <strong>umbracoConfigurationStatus</strong> til verdien <strong>'%0%'</strong> + Du kan <strong>starte øyeblikkelig</strong> ved å klikke på "Start Umbraco" knappen nedenfor. <br/>Hvis du er <strong>ny på umbraco</strong>, kan du finne mange ressurser på våre komme-i-gang sider. + <h3>Start Umbraco</h3> For å administrere din webside, åpne umbraco og begynn å legge til innhold, oppdatere maler og stilark eller utvide funksjonaliteten Tilkobling til databasen mislyktes. Umbraco Versjon 3 Umbraco Versjon 4 Pass på - umbraco %0% for en ny installasjon eller oppgradering fra versjon 3.0.

Trykk "neste" for å starte veiviseren.]]>
+ Denne veiviseren vil hjelpe deg gjennom prosessen med å konfigurere <strong>umbraco %0%</strong> for en ny installasjon eller oppgradering fra versjon 3.0. <br/><br/> Trykk <strong>"neste"</strong> for å starte veiviseren. - Culture Code - Culture Name + Språkkode + Språk - TRANSLATE ME: 'You've been idle and logout will automatically occur in' - TRANSLATE ME: 'Renew now to save your work' + Du har vært inaktiv og vil logges ut automatisk om + Forny innlogging for å lagre - © 2001 - %0%
umbraco.org

]]>
- Velkommen til umbraco, skriv inn ditt brukernavn og passord i feltene under: + <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.org" style="text-decoration: none" target="_blank">umbraco.org</a></p> + Velkommen til Umbraco, skriv inn ditt brukernavn og passord i feltene under: Skrivebord Seksjoner - Inndhold + Innhold - Velg siden ovenover... + Velg side over... %0% er nå kopiert til %1% Kopier til %0% er nå flyttet til %1% Flytt til har blitt valgt som rot til ditt nye innhold, klikk 'ok' nedenfor. - Intet element er valgt, vennligst velg et element i listen over før du klikker 'fortsett' - Gjeldende node kan ikke legges under denne pga. dens type - Gjeldende node kan ikke legges under en av dens undersider - TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + Ingen node er valgt, vennligst velg en node i listen over før du klikker 'fortsett' + Gjeldende nodes type tillates ikke under valgt node + Gjeldende node kan ikke legges under en underordnet node + Handlingen tillates ikke. Du mangler tilgang til en eller flere underordnede noder. + Relater kopierte elementer til original(e) Rediger dine varsler for %0% - Hei %0% Dette er en automatisk mail for å informere om at handlingen '%1%' er utført på siden '%2%' av brukeren '%3%' -Gå til http://%4%/default.aspx?section=content&id=%5% for å redigere. +Gå til http://%4%/umbraco/default.aspx?section=content&id=%5% for å redigere. Ha en fin dag! Vennlig hilsen umbraco roboten - ]]> - Hei %0%

+
+ <p>Hei %0%</p> -

Dette er en automatisk mail for å informere om at handlingen '%1%' - er blitt utført på siden '%2%' - av brukeren '%3%' -

- -

-

Rettelser:

- + <p>Dette er en automatisk mail for å informere om at handlingen '%1%' + er blitt utført på siden <a href="%7%"><strong>'%2%'</strong></a> + av brukeren <strong>'%3%'</strong> + </p> + <div style="margin: 8px 0; padding: 8px; display: block;"> + <br /> + <a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/umbraco/actions/publish.aspx?id=%5%">&nbsp;&nbsp;PUBLISER&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REDIGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/umbraco/actions/delete.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;SLETT&nbsp;&nbsp;&nbsp;&nbsp;</a> + <br /> + </div> + <p> + <h3>Rettelser:</h3> + <table style="width: 100%;"> %6% -
-

+ </table> + </p> - + <div style="margin: 8px 0; padding: 8px; display: block;"> + <br /> + <a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/umbraco/actions/publish.aspx?id=%5%">&nbsp;&nbsp;PUBLISER&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REDIGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; + <a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/umbraco/actions/delete.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;SLETT&nbsp;&nbsp;&nbsp;&nbsp;</a> + <br /> + </div> -

Ha en fin dag!

+ <p>Ha en fin dag!<br /><br /> Vennlig hilsen umbraco roboten -

]]>
+ </p> [%0%] Varsling om %1% utført på %2% Varsling @@ -481,7 +493,7 @@ Vennlig hilsen umbraco roboten Metadata Pakkenavn Pakken inneholder ingen elementer -
Du kan trygt fjerne pakken fra systemet ved å klikke "avinstaller pakke" nedenfor.]]>
+ Denne pakkefilen inneholder ingen elementer å avinstallere.<br/><br/>Du kan trygt fjerne pakken fra systemet ved å klikke "avinstaller pakke" nedenfor. Ingen oppdateringer tilgjengelig Alternativer for pakke Lesmeg for pakke @@ -490,8 +502,8 @@ Vennlig hilsen umbraco roboten Pakken ble avinstallert Pakken ble vellykket avinstallert Avinstaller pakke - Advarsel: alle dokumenter, media, etc. som som er avhengig av elementene du sletter, vil slutte å virke, noe som kan føre til ustabilitet, så avinstaller med forsiktighet. Hvis du er i tvil, kontakt pakkeutvikleren.]]> - Last ned oppdatering fra pakkebrønnen + Du kan velge bort elementer du ikke vil slette på dette tidspunkt, nedenfor. Når du klikker "bekreft avinstallering" vil alle elementer som er krysset av bli slettet.<br/> <span style="color:red;font-weight:bold;">Advarsel:</span> alle dokumenter, media, etc. som som er avhengig av elementene du sletter, vil slutte å virke, noe som kan føre til ustabilitet, så avinstaller med forsiktighet. Hvis du er i tvil, kontakt pakkeutvikleren. + Last ned oppdatering fra pakkeregisteret Oppgrader pakke Oppgraderingsinstrukser Det er en oppdatering tilgjengelig for denne pakken. Du kan laste den ned direkte fra pakkebrønnen. @@ -506,14 +518,14 @@ Vennlig hilsen umbraco roboten Avansert: Beskytt ved å velge hvilke brukergrupper som har tilgang til siden - ved å bruke Umbraco's medlems-grupper]]> - rollebasert autentikasjon.]]> - Feil-side + Om du ønsker å kontrollere tilgang til siden ved å bruke rolle-basert autentisering,<br /> ved å bruke Umbraco's medlems-grupper + Du må opprette en medlemsgruppe før du kan bruke <br /> rollebasert autentikasjon. + Feilside Brukt når personer logger på, men ikke har tilgang Hvordan vil du beskytte siden din? %0% er nå beskyttet Beskyttelse fjernet fra %0% - Innloggings-side + Innloggingsside Velg siden som har loginformularet Fjern beskyttelse Velg sidene som inneholder login-skjema og feilmelding ved feil innolgging. @@ -523,48 +535,46 @@ Vennlig hilsen umbraco roboten Om du ønsker å bruke enkel autentisering via ett enkelt brukernavn og passord - + %0% kunne ikke publiseres fordi et tredjepartstillegg avbrøt handlingen. Inkluder upubliserte undersider Publiserer - vennligst vent... %0% av %1% sider har blitt publisert... %0% er nå publisert %0% og alle undersider er nå publisert Publiser alle undersider - ok for å publisere %0% og dermed gjøre innholdet synlig for alle.

- Du kan publisere denne siden og alle dens undersider ved å krysse av Publiser alle undersider nedenfor. - ]]>
+ Klikk <em>ok</em> for å publisere <strong>%0%</strong> og dermed gjøre innholdet synlig for alle.<br/><br />Du kan publisere denne siden og alle dens undersider ved å krysse av <em>Publiser alle undersider</em> nedenfor. + %0% ble ikke publisert. Ett eller flere felter ble ikke godkjent av validering. + %0% kan ikke publiseres fordi en overordnet side ikke er publisert. - TRANSLATE ME: 'Add external link' - TRANSLATE ME: 'Add internal link' - TRANSLATE ME: 'Add' - TRANSLATE ME: 'Caption' - TRANSLATE ME: 'Internal page' - TRANSLATE ME: 'URL' - TRANSLATE ME: 'Move Down' - TRANSLATE ME: 'Move Up' - TRANSLATE ME: 'Open in new window' - TRANSLATE ME: 'Remove link' + Legg til ekstern lenke + Legg til intern lenke + Legg til + Tittel + Intern side + Url + Flytt ned + Flytt opp + Åpne i nytt vindu + Fjern lenke Gjeldende versjon - Rød tekst vil ikke bli vist i den valgte versjonen. , grønn betyr lagt til]]> - Dokumentet har blitt gjenopprettet til en tidligere versjon - Dette viser den valgte versjonen som HTML, hvis du ønsker å se forksjellene mellom 2 versjoner samtidig, bruk avviksvisningen - Gjenopprett til + Dette viser forskjellene mellom den gjeldende og den valgte versjonen<br /><del>Rød</del> tekst vil ikke bli vist i den valgte versjonen. , <ins>grønn betyr lagt til</ins> + Dokumentet er tilbakeført til en tidligere versjon + Dette viser den valgte versjonen som HTML, bruk avviksvisningen hvis du ønsker å se forksjellene mellom to versjoner samtidig. + Tilbakefør til Velg versjon Vis - Rediger script-filen + Rediger scriptfilen Concierge - Inndhold + Innhold Courier - Developer + Utvikler Umbraco konfigurasjonsveiviser Mediaarkiv Medlemmer @@ -575,8 +585,8 @@ Vennlig hilsen umbraco roboten Brukere - Standard mal - Ordbok-egenskap + Standardmal + Ordboksnøkkel For å importere en dokumenttype, finn ".udt" filen på datamaskinen din ved å klikke "Utforsk" knappen og klikk "Importer" (du vil bli spurt om bekreftelse i det neste skjermbildet) Ny tittel på arkfane Nodetype @@ -586,17 +596,20 @@ Vennlig hilsen umbraco roboten Arkfane Tittel på arkfane Arkfaner + Hovedinnholdstype aktivert + Denne dokumenttypen bruker + som hoveddokumenttype. Arkfaner fra hoveddokumenttyper vises ikke og kan kun endres på hoveddokumenttypen selv. Sortering ferdig. - Dra de forskjellige sidene opp eller ned for å arrangere dem. -
Ikke lukk dette vinduet under sortering]]>
+ Dra elementene opp eller ned for å arrangere dem. Du kan også klikke kolonneoverskriftene for å sortere alt på en gang. + Vennligst vent. Elementene blir sortert, dette kan ta litt tid.<br/> <br/> Ikke lukk dette vinduet under sortering - Publisering ble avbrutt av en 3. parts plugin + Publisering ble avbrutt av et tredjepartstillegg Egenskaptypen finnes allerede Egenskapstype opprettet - DataType: %1%]]> + Navn: %0% <br /> DataType: %1% Egenskapstype slettet Innholdstype lagret Du har opprettet en arkfane @@ -606,44 +619,51 @@ Vennlig hilsen umbraco roboten Stilarket ble lagret Stilark lagret uten feil Datatype lagret - Ordbok-element lagret + Ordbokelement lagret Publiseringen feilet fordi den overliggende siden ikke er publisert Innhold publisert og er nå synlig for besøkende Innhold lagret - Husk å publisere for å gjøre det synlig for besøkende + Husk å publisere for å gjøre endringene synlig for besøkende Sendt for godkjenning - Endringer har blitt sendt for godkjenning + Endringer har blitt sendt til godkjenning Medlem lagret - Stylesheetegenskap lagret - Stylesheet lagret - Template lagret + Stilarksegenskap lagret + Stilark lagret + Mal lagret Feil ved lagring av bruker (sjekk loggen) Bruker lagret Filen ble ikke lagret Filen kunne ikke lagres. Vennligst sjekk filrettigheter Filen ble lagret - File ble lagret uten feil + Filen ble lagret uten feil Språk lagret Python-skriptet ble ikke lagret Python-skriptet kunne ikke lagres fordi det inneholder en eller flere feil Python-skriptet er lagret! Ingen feil i python-skriptet! Malen ble ikke lagret - Vennligst forviss deg om at du ikke har 2 maler med samme alias + Vennligst forviss deg om at du ikke har to maler med samme alias Malen ble lagret Malen ble lagret uten feil! XSLT-koden ble ikke lagret XSLT-koden inneholdt en feil XSLT-koden ble ikke lagret, sjekk filrettigheter XSLT lagret - Det var ingen feil i den XSLT! + Ingen feil i XSLT! + Media lagret + Brukertypen lagret + Innhold avpublisert + Delmal lagret + Delmal lagret uten feil + Delmal ble ikke lagret! + En feil oppsto ved lagring av delmal Bruk CSS syntaks f.eks: h1, .redHeader, .blueText - Rediger stylesheet + Rediger stilark Rediger egenskap for stilark - Navn for å identifisere egenskapen for stilarket i rik-tekst editoren + Navn for å identifisere stilarksegenskapen i rik-tekst editoren Forhåndsvis Stiler @@ -651,43 +671,45 @@ Vennlig hilsen umbraco roboten Rediger mal Sett inn innholdsområde Sett inn plassholder for innholdsområde - Sett inn ordbok-element + Sett inn ordbokselement Sett inn makro - Sett inn umbraco side-felt - Master mal - Hurtigguide til umbraco sine mal-tagger + Sett inn Umbraco sidefelt + Hovedmal + Hurtigguide til Umbraco sine maltagger Mal Alternativt felt Alternativ tekst - Casing + Store/små bokstaver Felt som skal settes inn Konverter linjeskift - Erstatter et linjeskift med html-tag'en &lt;br&gt; + Erstatter et linjeskift med htmltaggen &lt;br&gt; Ja, kun dato Formatter som dato HTML koding - Formater spesialtegn med deres tilsvarende HTML-tegn. - Denne teksten vil settes inn like etter verdien av feltet - Denne teksten vil settes inn like før verdien av feltet - Lowercase + Formater spesialtegn med tilsvarende HTML-tegn. + Denne teksten vil settes inn etter verdien av feltet + Denne teksten vil settes inn før verdien av feltet + Små bokstaver Ingen Sett inn etter felt Sett inn før felt Rekursivt - Fjern paragraf-tags + Fjern paragraftagger Fjerner eventuelle &lt;P&gt; rundt teksten - Uppercase - URL encode - Dersom innholdet av feltene skal sendes til en URL, skal spesialtegn formatteres + Store bokstaver + URL koding + Dersom innholdet av feltene skal sendes til en URL skal spesialtegn formatteres Denne teksten vil benyttes dersom feltene over er tomme Dette feltet vil benyttes dersom feltet over er tomt Ja, med klokkeslett. Dato/tid separator: + Egendefinerte felt + Standardfelter Oppgaver satt til deg - som du er tildelt. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML".
For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]>
+ Listen nedenfor viser oversettelsesoppgaver <strong>som du er tildelt</strong>. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". <br/> For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen. Lukk oppgave Oversettelses detaljer Last ned all oversettelsesoppgaver som XML @@ -695,7 +717,7 @@ Vennlig hilsen umbraco roboten Last ned XML DTD Felt Inkluder undersider - Hei %0% Dette er en automatisk mail for å informere deg om at dokumentet '%1%' @@ -706,11 +728,11 @@ Vennlig hilsen umbraco roboten Ha en fin dag! Vennlig hilsen Umbraco Robot. - ]]> + [%0%] Oversettingsoppgave for %1% Ingen oversettelses-bruker funnet. Vennligst opprett en oversettelses-bruker før du begynner å sende innhold til oversetting Oppgaver opprettet av deg - opprettet av deg. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]> + Listen under viser sider <strong>opprettet av deg</strong>. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen. Siden '%0%' har blitt sendt til oversetting Send til oversetting Tildelt av @@ -725,14 +747,14 @@ Vennlig hilsen umbraco roboten Last opp XML med oversettelse - Hurtigbuffer-leser + Hurtigbufferleser Papirkurv - Opprettede Pakker + Opprettede pakker Datatyper Ordbok Installerte pakker - TRANSLATE ME: 'Install skin' - TRANSLATE ME: 'Install starter kit' + Installer utseende + Installer startpakke Språk Installer lokal pakke Makroer @@ -745,11 +767,11 @@ Vennlig hilsen umbraco roboten Pakker Pakker Python Filer - Installer fra pakkebrønn + Installer fra pakkeregister Installer Runway Runway moduler - TRANSLATE ME: 'Scripting Files' - Scriptfiler + Skriptfiler + Skript Stiler Maler XSLT Filer @@ -763,12 +785,12 @@ Vennlig hilsen umbraco roboten Administrator Kategorifelt - TRANSLATE ME: 'Change Your Password' - TRANSLATE ME: 'You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button' + Bytt passord + Du kan endre passordet til Umbraco ved å fylle ut skjemaet under og klikke "Bytt passord" knappen. Innholdskanal Videresend til Canvas ved login Beskrivelsesfelt - Deaktiver User + Deaktiver bruker Dokumenttype Redaktør Utdragsfelt @@ -776,23 +798,27 @@ Vennlig hilsen umbraco roboten Login Øverste nivå i Media Moduler - Deaktiver tilgang til umbraco + Deaktiver tilgang til Umbraco Passord - TRANSLATE ME: 'Your password has been changed!' - TRANSLATE ME: 'Please confirm the new password' - TRANSLATE ME: 'Enter your new password' - TRANSLATE ME: 'Your new password cannot be blank!' - TRANSLATE ME: 'There was a difference between the new password and the confirmed password. Please try again!' - TRANSLATE ME: 'The confirmed password doesn't match the new password!' + Passordet er endret + Bekreft nytt passord + Nytt passord + Nytt passord kan ikke være blankt + Nytt og bekreftet passord må være like + Nytt og bekreftet passord må være like Overskriv tillatelser på undernoder Du redigerer for øyeblikket tillatelser for sidene: Velg sider for å redigere deres tillatelser Søk i alle undersider - Start node + Startnode Brukernavn Brukertillatelser Brukertype Brukertyper Forfatter + Nytt passord + Bekreft nytt passord + Gjeldende passord + Feil passord
\ No newline at end of file From 25780663a6c4be9e5ed4b21207251bff74bb85d3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 15 Jul 2013 15:26:18 +1000 Subject: [PATCH 05/85] Fixes: U4-1304 Umbraco.Field not replacing localLink when recursive:true . --- src/Umbraco.Web/UmbracoHelper.cs | 2 +- .../umbraco/templateControls/Item.cs | 18 ++++++++++++++++++ .../umbraco/templateControls/ItemRenderer.cs | 6 ++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index cbdedc7ae1..98d944a637 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -314,7 +314,7 @@ namespace Umbraco.Web - var item = new Item() + var item = new Item(currentPage) { Field = fieldAlias, TextIfEmpty = altText, diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs index a8be0b3a50..5d9e608fa8 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs @@ -6,6 +6,7 @@ using System.Security.Permissions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using Umbraco.Core.Models; using umbraco.BusinessLogic.Actions; using umbraco.presentation.LiveEditing.Modules.ItemEditing; @@ -19,6 +20,7 @@ namespace umbraco.presentation.templateControls [Designer("umbraco.presentation.templateControls.ItemDesigner, umbraco")] public class Item : CompositeControl { + #region Private Fields /// The item's unique ID on the page. @@ -26,6 +28,12 @@ namespace umbraco.presentation.templateControls public AttributeCollectionAdapter LegacyAttributes; #endregion + /// + /// Used by the UmbracoHelper to assign an IPublishedContent to the Item which allows us to pass this in + /// to the 'item' ctor so that it renders with the new API instead of the old one. + /// + internal IPublishedContent ContentItem { get; private set; } + #region Public Control Properties /// @@ -191,6 +199,16 @@ namespace umbraco.presentation.templateControls : LiveEditingItemRenderer.Instance; } + /// + /// Internal ctor used to assign an IPublishedContent object. + /// + /// + internal Item(IPublishedContent contentItem) + :this() + { + ContentItem = contentItem; + } + #endregion #region Overriden Control Methods diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs index 37f6d4ad2f..6fc4e32ea5 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs @@ -110,13 +110,15 @@ namespace umbraco.presentation.templateControls if (cache == null) throw new InvalidOperationException("Unsupported IPublishedContentCache, only the Xml one is supported."); var xml = cache.GetXml(Umbraco.Web.UmbracoContext.Current, Umbraco.Web.UmbracoContext.Current.InPreviewMode); var itemPage = new page(xml.GetElementById(tempNodeId.ToString())); - tempElementContent = new item(itemPage.Elements, item.LegacyAttributes).FieldContent; + tempElementContent = + new item(item.ContentItem, itemPage.Elements, item.LegacyAttributes).FieldContent; } } else { // gets the field content from the current page (via the PageElements collection) - tempElementContent = new item(item.PageElements, item.LegacyAttributes).FieldContent; + tempElementContent = + new item(item.ContentItem, item.PageElements, item.LegacyAttributes).FieldContent; } return tempElementContent; From e5c758bbc1d499dd9c3f4104d148d0ac5448d21a Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 15 Jul 2013 16:07:42 +0200 Subject: [PATCH 06/85] Fixes U4-1838 uGoLive Success/Failure Images not showing --- src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx b/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx index d70e8c59c4..94b056f296 100644 --- a/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx +++ b/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx @@ -6,6 +6,7 @@ + \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx index 64cace4a38..b99e16d8fc 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx @@ -61,8 +61,12 @@
\ No newline at end of file From 275dbc83dd9d60720b18988856ddc82a78b2137c Mon Sep 17 00:00:00 2001 From: enkelmedia Date: Mon, 15 Jul 2013 19:38:10 +0200 Subject: [PATCH 10/85] Update to readme to contain info about the support for MVC --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f842afd3c2..ccacb7028e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Umbraco CMS **More than 177,000 sites trust Umbraco** -For the first time on the Microsoft platform a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports your ASP.NET User and Custom Controls out of the box. It's a developers dream and your users will love it too. +For the first time on the Microsoft platform a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports ASP.NET MVC or Web Forms, including User and Custom Controls, out of the box. It's a developers dream and your users will love it too. Used by more than 177,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)) you can be sure that the technology is proven, stable and scales. From 0296c646cbbbb06b844e0898ac27db24ed518f70 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 16 Jul 2013 11:45:28 +1000 Subject: [PATCH 11/85] Fixes up a small code issue for U4-2505 --- src/Umbraco.Core/Sync/ConfigServerRegistrar.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs b/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs index 56a6967dc4..5c1a8c2784 100644 --- a/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs +++ b/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs @@ -32,16 +32,20 @@ namespace Umbraco.Core.Sync { get { - if (_addresses == null && _xmlServers != null) + if (_addresses == null) { _addresses = new List(); - var nodes = _xmlServers.SelectNodes("./server"); - if (nodes != null) + + if (_xmlServers != null) { - foreach (XmlNode n in nodes) + var nodes = _xmlServers.SelectNodes("./server"); + if (nodes != null) { - _addresses.Add(new ConfigServerAddress(n)); - } + foreach (XmlNode n in nodes) + { + _addresses.Add(new ConfigServerAddress(n)); + } + } } } From 3900b7ebc8f4b0598c597f1379e57096edbf75cd Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Tue, 16 Jul 2013 13:09:53 +0200 Subject: [PATCH 12/85] Remove WebForms from nuspec file Not just WebForms anymore. :) --- build/NuSpecs/UmbracoCms.nuspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index 82be656204..e84ebc8e2e 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -10,8 +10,8 @@ http://umbraco.com/ http://umbraco.com/media/357769/100px_transparent.png false - Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project - Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project + Installs Umbraco Cms in your Visual Studio ASP.NET project + Installs Umbraco Cms in your Visual Studio ASP.NET project en-US umbraco From 8063717e4c7d9ecc88a6b9987940e6975369714e Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 16 Jul 2013 13:21:27 +0200 Subject: [PATCH 13/85] U4-2511 Locallink:NODEID not working --- .../umbraco.presentation/umbraco/nodeFactory/Property.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs index caee1f6689..a7654c132e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs @@ -22,7 +22,7 @@ namespace umbraco.NodeFactory private string _parsedValue; public string Value { - get { return _parsedValue ?? (_parsedValue = TemplateUtilities.ResolveUrlsFromTextString(_value)); } + get { return _parsedValue ?? (_parsedValue = TemplateUtilities.ParseInternalLinks(TemplateUtilities.ResolveUrlsFromTextString(_value))); } } public Guid Version From 1d7bfc2781ffe88a60dcf9faf3a19fbb5ba798dc Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 16 Jul 2013 13:33:52 +0200 Subject: [PATCH 14/85] U4-2465 "Login Name already exists" when creating a new member that existed before --- .../umbraco.presentation/umbraco/members/EditMember.aspx.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index 68412ec702..f8c5e56cda 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -142,8 +142,8 @@ namespace umbraco.cms.presentation.members void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) { - var oldEmail = MemberEmail.Text.ToLower(); - var newEmail = _document.Email.ToLower(); + var oldEmail = _document.Email.ToLower(); + var newEmail = MemberEmail.Text.ToLower(); var requireUniqueEmail = Membership.Providers[Member.UmbracoMemberProviderName].RequiresUniqueEmail; var howManyMembersWithEmail = Member.GetMembersFromEmail(newEmail).Length; if (((oldEmail == newEmail && howManyMembersWithEmail > 1) || From d8aad718d50643f0e4c3f9281055c68f22eba894 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Jul 2013 11:28:46 +1000 Subject: [PATCH 15/85] Fixed broken unit test --- src/Umbraco.Core/Persistence/PetaPocoExtensions.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index 6faf4d637a..51ae2638b0 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -74,7 +74,11 @@ namespace Umbraco.Core.Persistence //get all columns but not the primary key if it is auto-incremental var cols = string.Join(", ", ( from c in pd.Columns - where c.Value.ResultColumn == false + where + //don't return ResultColumns + !c.Value.ResultColumn + //if the table is auto-incremental, don't return the primary key + && (pd.TableInfo.AutoIncrement && c.Key != pd.TableInfo.PrimaryKey) select tableName + "." + db.EscapeSqlIdentifier(c.Key)) .ToArray()); @@ -87,10 +91,10 @@ namespace Umbraco.Core.Persistence var values = new List(); foreach (var i in pd.Columns) { - //if (pd.TableInfo.AutoIncrement && i.Key == pd.TableInfo.PrimaryKey) - //{ - // continue; - //} + if (pd.TableInfo.AutoIncrement && i.Key == pd.TableInfo.PrimaryKey) + { + continue; + } values.Add(string.Format("{0}{1}", "@", index++)); db.AddParam(cmd, i.Value.GetValue(poco), "@"); } From 197dacfae77872f39f06ab8c5e71eb512ed582c4 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Wed, 17 Jul 2013 09:56:50 +0700 Subject: [PATCH 16/85] Update of ru.xml with latest keys --- src/Umbraco.Web.UI/umbraco/config/lang/ru.xml | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index 7b5daa8c96..81f27436ec 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -1,11 +1,11 @@ - + Alexander Bryukhov (Unico Design company) http://unicodsgn.com - Управление доменами + Языки и домены История исправлений Просмотреть Копировать @@ -42,13 +42,25 @@ Домен '%0%' удален Домен с именем '%0%' уже существует - - https://www.example.com/, example.com/en, и т.п. Используйте символ '*'
- если домен не важен, а нужно просто установить язык.]]> +
Также здесь допустимы части адресов URL первого уровня, например "example.com/en", + однако их следует по возможности избегать. Рекомендуется использовать настройку культуры (языка), расположенную выше.]]>
Домен '%0%' обновлен - Неверное имя домена + Такой домен уже назначен. + Недопустимый узел. + Недопустимый формат домена. + Язык + Унаследовать Править существующие домены + Недостаточно полномочий. + удалить + Язык (культура) + + или унаследуйте язык от родительских узлов.
+ Эта установка будет применена также и к текущему узлу, если только для него ниже явно не задан домен.]]> +
+ Домены Наблюдать за @@ -103,6 +115,7 @@ Заголовок страницы Свойства Этот документ опубликован, но скрыт, потому что его родительский документ '%0%' не опубликован + ВНИМАНИЕ: этот документ опубликован, но его нет в глобальном кэше (внутренняя ошибка) Опубликовать Состояние публикации Опубликовать @@ -198,7 +211,7 @@ Добавить предустановленное значение Тип данных в БД GUID типа данных - Отрисовать элемент + Редактор свойства Кнопки Включить расширенные настройки для Включить контекстное меню @@ -223,6 +236,7 @@ ПРЕДУПРЕЖДЕНИЕ! Несмотря на то, что CodeMirror по-умолчанию разрешен в данной конфигурации, он по-прежнему отключен для браузеров Internet Explorer ввиду нестабильной работы Укажите, пожалуйста, алиас и имя для этого свойства! + Использование данного типа файлов на сайте запрещено администратором Ошибка доступа к указанному файлу или папке Укажите заголовок Выберите тип @@ -485,7 +499,8 @@ Узел %0% был перемещён в %1% Выберите, куда должен быть перемещён узел %0% был выбран как родительский узел для нового элемента, нажмите 'Ок'. - Не выбран узел! Пожалуйста выберите один из списка, прежде чем нажать 'Ок'. + Не выбран узел! Пожалуйста выберите узел назначения, прежде чем нажать 'Ок'. + Текущий узел не может быть размещен непосредственно в корне дерева Текущий узел не может быть размещён в выбранном Вами из-за несоответствия типов. Текущий узел не может быть перемещен внутрь своих дочерних узлов Данное действие не может быть осуществлено, так как Вы не имеете достаточных прав для совершения действий над одним или более дочерними документами. @@ -569,6 +584,7 @@ Руководство по обновлению Для данного пакета доступно обновление. Вы можете загрузить это обновление непосредственно из центрального репозитория пакетов Umbraco. Версия пакета + История версий пакета Перейти на веб-сайт пакета @@ -596,6 +612,11 @@ Применяйте, если хотите установить самый простой способ доступа к документу - явно указанные имя пользователя и пароль + + + @@ -696,6 +717,8 @@ Не забудьте опубликовать, чтобы сделать видимым Отослано на утверждение Изменения отосланы на утверждение + Медиа-элемент сохранен + Участник сохранен Правило стиля CSS сохранено Стиль CSS сохранен @@ -898,4 +921,4 @@ Типы пользователей Автор -
\ No newline at end of file +
From 1c70570078d83b58d31bbb23646e2fa51842b69a Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Jul 2013 14:16:38 +1000 Subject: [PATCH 17/85] Fixes : U4-2055 Unpublish Date Bug in Umbraco 6.0.3 -> with unit test to ensure that all dates are formatted as ISO date standards when used in SQL --- src/Umbraco.Core/DateTimeExtensions.cs | 22 +++++++++++++++++++ .../Querying/ModelToSqlExpressionHelper.cs | 7 ++++-- .../Querying/PocoToSqlExpressionHelper.cs | 7 ++++-- src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../Persistence/Querying/QueryBuilderTests.cs | 16 ++++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Core/DateTimeExtensions.cs diff --git a/src/Umbraco.Core/DateTimeExtensions.cs b/src/Umbraco.Core/DateTimeExtensions.cs new file mode 100644 index 0000000000..74460814b3 --- /dev/null +++ b/src/Umbraco.Core/DateTimeExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Umbraco.Core +{ + public static class DateTimeExtensions + { + + /// + /// Returns the DateTime as an ISO formatted string that is globally expectable + /// + /// + /// + public static string ToIsoString(this DateTime dt) + { + return dt.ToString("yyyy-MM-dd HH:mm:ss"); + } + + } +} diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index 7a65fe33bc..470a098fd8 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -455,8 +455,11 @@ namespace Umbraco.Core.Persistence.Querying if (fieldType == typeof(decimal)) return ((decimal)value).ToString(CultureInfo.InvariantCulture); - if (fieldType == typeof(DateTime)) - return "'" + EscapeParam(((DateTime)value).ToString(CultureInfo.InvariantCulture)) + "'"; + if (fieldType == typeof (DateTime)) + { + return "'" + EscapeParam(((DateTime)value).ToIsoString()) + "'"; + } + if (fieldType == typeof(bool)) return ((bool)value) ? Convert.ToString(1, CultureInfo.InvariantCulture) : Convert.ToString(0, CultureInfo.InvariantCulture); diff --git a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs index 456607a348..d065849102 100644 --- a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs @@ -465,8 +465,11 @@ namespace Umbraco.Core.Persistence.Querying if (fieldType == typeof(decimal)) return ((decimal)value).ToString(CultureInfo.InvariantCulture); - if(fieldType == typeof(DateTime)) - return "'" + EscapeParam(((DateTime)value).ToString(CultureInfo.InvariantCulture)) + "'"; + if (fieldType == typeof (DateTime)) + { + return "'" + EscapeParam(((DateTime)value).ToIsoString()) + "'"; + } + if (fieldType == typeof(bool)) return ((bool)value) ? Convert.ToString(1, CultureInfo.InvariantCulture) : Convert.ToString(0, CultureInfo.InvariantCulture); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ccc361e3f7..1c8fff3334 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -140,6 +140,7 @@ + diff --git a/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs b/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs index 5823970874..25fc2c3d35 100644 --- a/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs @@ -12,6 +12,22 @@ namespace Umbraco.Tests.Persistence.Querying [TestFixture] public class QueryBuilderTests : BaseUsingSqlCeSyntax { + [Test] + public void Dates_Formatted_Properly() + { + var sql = new Sql(); + sql.Select("*").From(); + + var dt = new DateTime(2013, 11, 21, 13, 25, 55); + + var query = Query.Builder.Where(x => x.ExpireDate <= dt); + var translator = new SqlTranslator(sql, query); + + var result = translator.Translate(); + + Assert.IsTrue(result.SQL.Contains("[expireDate] <= '2013-11-21 13:25:55'")); + } + [Test] public void Can_Build_StartsWith_Query_For_IContent() { From a79e349f3de550f5dbd9d326f66756aeb331bf17 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 18 Jul 2013 11:00:56 +0200 Subject: [PATCH 18/85] U4-2467 v4.11.1: Membership search does not search on email address anymore --- .../umbraco/members/MemberSearch.ascx.cs | 87 +++++++++++-------- 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs index 46c9ff7f70..c165310b3c 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web; using System.Web.UI; -using System.Web.UI.WebControls; using Examine.LuceneEngine.SearchCriteria; +using Examine.SearchCriteria; using umbraco.cms.businesslogic.member; using System.Web.Security; namespace umbraco.presentation.umbraco.members { - public partial class MemberSearch : System.Web.UI.UserControl + public partial class MemberSearch : UserControl { protected void Page_Load(object sender, EventArgs e) { @@ -19,46 +18,30 @@ namespace umbraco.presentation.umbraco.members ButtonSearch.Text = ui.Text("search"); } - protected void ButtonSearch_Click(object sender, System.EventArgs e) + protected void ButtonSearch_Click(object sender, EventArgs e) { resultsPane.Visible = true; - if (!Member.InUmbracoMemberMode()) + if (Member.InUmbracoMemberMode()) { - - IEnumerable results; - if (searchQuery.Text.Contains("@")) - { - results = from MembershipUser x in Membership.FindUsersByEmail(searchQuery.Text) - select new MemberSearchResult() { Id = x.UserName, Email = x.Email, LoginName = x.UserName, Name = x.UserName }; - } - else - { - results = from MembershipUser x in Membership.FindUsersByName(searchQuery.Text + "%") - select new MemberSearchResult() { Id = x.UserName, Email = x.Email, LoginName = x.UserName, Name = x.UserName }; - } - - rp_members.DataSource = results; - rp_members.DataBind(); - } - else - { - - string query = searchQuery.Text.ToLower(); + var query = searchQuery.Text.ToLower(); var internalSearcher = UmbracoContext.Current.InternalMemberSearchProvider; - IEnumerable results; - if (!String.IsNullOrEmpty(query)) + if (String.IsNullOrEmpty(query) == false) { - var criteria = internalSearcher.CreateSearchCriteria("member", Examine.SearchCriteria.BooleanOperation.And); - var operation = criteria.Field("__nodeName", query.MultipleCharacterWildcard()); - results = internalSearcher.Search(operation.Compile()).Select(x => new MemberSearchResult() - { - Id = x["id"], - Name = x["nodeName"], - Email = x["email"], - LoginName = x["loginName"] - }); + var criteria = internalSearcher.CreateSearchCriteria("member", BooleanOperation.Or); + var fields = new[] {"id", "__nodeName", "email"}; + var term = new[] {query.ToLower().Escape()}; + var operation = criteria.GroupedOr(fields, term).Compile(); + + var results = internalSearcher.Search(operation) + .Select(x => new MemberSearchResult + { + Id = x["id"], + Name = x["nodeName"], + Email = x["email"], + LoginName = x["loginName"] + }); rp_members.DataSource = results; rp_members.DataBind(); } @@ -67,7 +50,39 @@ namespace umbraco.presentation.umbraco.members resultsPane.Visible = false; } } + else + { + IEnumerable results; + if (searchQuery.Text.Contains("@")) + { + results = from MembershipUser x in Membership.FindUsersByEmail(searchQuery.Text) + select + new MemberSearchResult() + { + Id = x.UserName, + Email = x.Email, + LoginName = x.UserName, + Name = x.UserName + }; + } + else + { + results = from MembershipUser x in Membership.FindUsersByName(searchQuery.Text + "%") + select + new MemberSearchResult() + { + Id = x.UserName, + Email = x.Email, + LoginName = x.UserName, + Name = x.UserName + }; + } + + rp_members.DataSource = results; + rp_members.DataBind(); + } } + public class MemberSearchResult { public string Id { get; set; } From e48f08b6579b3698ec03b6d86c6bb8fbefadb471 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 18 Jul 2013 16:07:39 +0200 Subject: [PATCH 19/85] When using Public Access > Single User Protection the email of the member is empty, this caused errors because the result of GetMembersFromEmail is null --- .../umbraco/members/EditMember.aspx.cs | 9 ++++++++- src/umbraco.cms/businesslogic/member/Member.cs | 11 ++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index f8c5e56cda..cf54379d96 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -1,5 +1,6 @@ using System; using System.Web.UI; +using System.Web.UI.Design.WebControls; using System.Web.UI.WebControls; using Umbraco.Core.IO; using umbraco.cms.businesslogic.member; @@ -144,8 +145,14 @@ namespace umbraco.cms.presentation.members { var oldEmail = _document.Email.ToLower(); var newEmail = MemberEmail.Text.ToLower(); + var requireUniqueEmail = Membership.Providers[Member.UmbracoMemberProviderName].RequiresUniqueEmail; - var howManyMembersWithEmail = Member.GetMembersFromEmail(newEmail).Length; + + var howManyMembersWithEmail = 0; + var membersWithEmail = Member.GetMembersFromEmail(newEmail); + if (membersWithEmail != null) + howManyMembersWithEmail = membersWithEmail.Length; + if (((oldEmail == newEmail && howManyMembersWithEmail > 1) || (oldEmail != newEmail && howManyMembersWithEmail > 0)) && requireUniqueEmail) diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index dd78840be4..947330b292 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -551,14 +551,19 @@ namespace umbraco.cms.businesslogic.member SqlHelper.CreateParameter("@id", Id)); } - return m_Email.ToLower(); + return string.IsNullOrWhiteSpace(m_Email) ? m_Email : m_Email.ToLower(); } set { var oldEmail = Email; - var newEmail = value.ToLower(); + var newEmail = string.IsNullOrWhiteSpace(value) ? value : value.ToLower(); var requireUniqueEmail = Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail; - var howManyMembersWithEmail = Member.GetMembersFromEmail(newEmail).Length; + + var howManyMembersWithEmail = 0; + var membersWithEmail = GetMembersFromEmail(newEmail); + if (membersWithEmail != null) + howManyMembersWithEmail = membersWithEmail.Length; + if (((oldEmail == newEmail && howManyMembersWithEmail > 1) || (oldEmail != newEmail && howManyMembersWithEmail > 0)) && requireUniqueEmail) From d88494e90ed2a096cc1cec4c43c7c5e1436acf79 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 18 Jul 2013 17:09:26 +0200 Subject: [PATCH 20/85] U4-638 Bug (and fix/solution): Saving inline base64 image (or any attribute value with equal sign at the end) --- src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs index ac8bb63ee3..437e0da9fe 100644 --- a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs +++ b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs @@ -31,7 +31,7 @@ namespace umbraco.editorControls.tinymce // gather all attributes // TODO: This should be replaced with a general helper method - but for now we'll wanna leave umbraco.dll alone for this patch var ht = new Hashtable(); - var matches = Regex.Matches(tag.Value.Replace(">", " >"), "(?\\S*)=\"(?[^\"]*)\"|(?\\S*)=(?[^\"|\\s]*)\\s", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); + var matches = Regex.Matches(tag.Value.Replace(">", " >"), "(?\\S*?)=\"(?[^\"]*)\"|(?\\S*?)=(?[^\"|\\s]*)\\s", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); foreach (Match attributeSet in matches) { ht.Add(attributeSet.Groups["attributeName"].Value.ToLower(), From 6a9532f10ada80e84470e347d5f1ad01bdaf56bb Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 19 Jul 2013 12:27:37 +1000 Subject: [PATCH 21/85] Fixes: U4-1599 [MVC] ChangeContentType doesn't work in macros rendered from a View -> We need to manually reset the ContentType after we execute a webforms based macro because Server.Execute resets the ContentType back to the default. --- src/Umbraco.Web/UmbracoHelper.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index 98d944a637..9d84e497dd 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -182,10 +182,18 @@ namespace Umbraco.Web // within Razor since it will never be inserted into the page pipeline (which may even not exist at all // if we're running MVC). // + // I'm sure there's more things that will get lost with this context changing but I guess we'll figure + // those out as we go along. One thing we lose is the content type response output. + // http://issues.umbraco.org/issue/U4-1599 if it is setup during the macro execution. So + // here we'll save the content type response and reset it after execute is called. + + var contentType = _umbracoContext.HttpContext.Response.ContentType; var traceIsEnabled = containerPage.Trace.IsEnabled; containerPage.Trace.IsEnabled = false; _umbracoContext.HttpContext.Server.Execute(containerPage, output, false); containerPage.Trace.IsEnabled = traceIsEnabled; + //reset the content type + _umbracoContext.HttpContext.Response.ContentType = contentType; //Now, we need to ensure that local links are parsed html = TemplateUtilities.ParseInternalLinks(output.ToString()); From 1bf41217966c4a015cacc43764000e8d58ee72db Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 19 Jul 2013 12:36:02 +1000 Subject: [PATCH 22/85] Fixes a null check in UmbracoTemplatePage --- src/Umbraco.Web/Mvc/UmbracoTemplatePage.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Mvc/UmbracoTemplatePage.cs b/src/Umbraco.Web/Mvc/UmbracoTemplatePage.cs index 7c5d23ae74..9eba36e21a 100644 --- a/src/Umbraco.Web/Mvc/UmbracoTemplatePage.cs +++ b/src/Umbraco.Web/Mvc/UmbracoTemplatePage.cs @@ -64,7 +64,12 @@ namespace Umbraco.Web.Mvc /// public override UmbracoHelper Umbraco { - get { return _helper ?? (_helper = new UmbracoHelper(UmbracoContext, Model.Content)); } + get + { + return _helper ?? (_helper = Model == null + ? new UmbracoHelper(UmbracoContext) + : new UmbracoHelper(UmbracoContext, Model.Content)); + } } /// From 3dea16fad1d38dc0a2edb716306d2b50216b260b Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 12:39:50 +0200 Subject: [PATCH 23/85] U4-2309 BackOffice / ExamineMngr : "Optimize index" don't ends correctly when website has not members. --- src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx b/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx index 3c49b20c10..127ecac644 100644 --- a/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx +++ b/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx @@ -50,7 +50,7 @@
- +
From a57334d1f78f2f6f41d9128f6dbb684e1e9ffdde Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 12:55:16 +0200 Subject: [PATCH 24/85] Merge pull request #40 from michielvoo/u4-663 U4-663 --- src/umbraco.cms/businesslogic/template/Template.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/umbraco.cms/businesslogic/template/Template.cs b/src/umbraco.cms/businesslogic/template/Template.cs index 26e4ffdddd..7f58d40953 100644 --- a/src/umbraco.cms/businesslogic/template/Template.cs +++ b/src/umbraco.cms/businesslogic/template/Template.cs @@ -428,10 +428,10 @@ namespace umbraco.cms.businesslogic.template switch (DetermineRenderingEngine(t, design)) { case RenderingEngine.Mvc: - ViewHelper.CreateViewFile(t, true); + ViewHelper.CreateViewFile(t); break; case RenderingEngine.WebForms: - MasterPageHelper.CreateMasterPage(t, true); + MasterPageHelper.CreateMasterPage(t); break; } From 6766aa97320e391379eb7141d1ca6babd3d3b489 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 04:18:29 -0700 Subject: [PATCH 25/85] Merge pull request #41 from michielvoo/u4-667 U4-667 --- .../umbraco/developer/Macros/editMacro.aspx | 29 +++++++++++++++---- .../umbraco/create.aspx.cs | 19 +++--------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx index 20bbb8fe36..7018375a65 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx @@ -223,9 +223,28 @@ - + + + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs index 3bfc65d285..c8ec4a581d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs @@ -1,21 +1,11 @@ using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Xml.XPath; using System.Xml; using Umbraco.Core.IO; namespace umbraco.cms.presentation { - public class Create : BasePages.UmbracoEnsuredPage { [Obsolete("This property is no longer used")] @@ -44,18 +34,17 @@ namespace umbraco.cms.presentation { throw new ArgumentException("The create dialog for \"" + nodeType + "\" does not match anything defined in the \"" + SystemFiles.CreateUiXml + "\". This could mean an incorrectly installed package or a corrupt UI file"); } - //title.Text = ui.Text("create") + " " + ui.Text(def.SelectSingleNode("./header").FirstChild.Value.ToLower(), base.getUser()); + try { - //headerTitle.Text = title.Text; - UI.Controls.Add(LoadControl(SystemDirectories.Umbraco + def.SelectSingleNode("./usercontrol").FirstChild.Value)); + var virtualPath = SystemDirectories.Umbraco + def.SelectSingleNode("./usercontrol").FirstChild.Value; + var mainControl = LoadControl(virtualPath); + UI.Controls.Add(mainControl); } catch (Exception ex) { throw new ArgumentException("ERROR CREATING CONTROL FOR NODETYPE: " + nodeType, ex); } } - - } } From 8740848aac40258319a4205afb9d4f0bec4382bd Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 04:26:50 -0700 Subject: [PATCH 26/85] Merge pull request #42 from michielvoo/u4-232 Enabled support for integrated security for SQL Server to the installer. Conflicts: src/Umbraco.Web.UI/install/steps/database.ascx --- src/Umbraco.Core/DatabaseContext.cs | 14 ++++++ .../install/steps/Database.ascx.cs | 22 ++++++-- .../install/steps/Database.ascx.designer.cs | 4 +- .../install/steps/database.ascx | 50 +++++++++++++++++-- 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 420831d299..214636153a 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -169,6 +169,20 @@ namespace Umbraco.Core Initialize(providerName); } + /// + /// Configures a ConnectionString for the Umbraco database that uses Microsoft SQL Server integrated security. + /// + /// Name or address of the database server + /// Name of the database + public void ConfigureIntegratedSecurityDatabaseConnection(string server, string databaseName) + { + const string providerName = "System.Data.SqlClient"; + string connectionString = String.Format("Server={0};Database={1};Integrated Security=true", server, databaseName); + + SaveConnectionString(connectionString, providerName); + Initialize(providerName); + } + internal string BuildAzureConnectionString(string server, string databaseName, string user, string password) { if (server.Contains(".") && ServerStartsWithTcp(server) == false) diff --git a/src/Umbraco.Web.UI/install/steps/Database.ascx.cs b/src/Umbraco.Web.UI/install/steps/Database.ascx.cs index 800a025756..e482c5c6fe 100644 --- a/src/Umbraco.Web.UI/install/steps/Database.ascx.cs +++ b/src/Umbraco.Web.UI/install/steps/Database.ascx.cs @@ -189,19 +189,31 @@ namespace Umbraco.Web.UI.Install.Steps { try { + var dbContext = ApplicationContext.Current.DatabaseContext; + if (string.IsNullOrEmpty(ConnectionString.Text) == false) { - ApplicationContext.Current.DatabaseContext.ConfigureDatabaseConnection(ConnectionString.Text); + dbContext.ConfigureDatabaseConnection(ConnectionString.Text); } else if (IsEmbeddedDatabase) { - ApplicationContext.Current.DatabaseContext.ConfigureEmbeddedDatabaseConnection(); + dbContext.ConfigureEmbeddedDatabaseConnection(); } else { - ApplicationContext.Current.DatabaseContext.ConfigureDatabaseConnection(DatabaseServer.Text, DatabaseName.Text, - DatabaseUsername.Text, DatabasePassword.Text, - DatabaseType.SelectedValue); + var server = DatabaseServer.Text; + var databaseName = DatabaseName.Text; + + if (DatabaseType.SelectedValue == "SqlServer" && DatabaseIntegratedSecurity.Checked == true) + { + dbContext.ConfigureIntegratedSecurityDatabaseConnection(server, databaseName); + } + else + { + dbContext.ConfigureDatabaseConnection(server, databaseName, + DatabaseUsername.Text, DatabasePassword.Text, DatabaseType.SelectedValue + ); + } } } catch (Exception ex) diff --git a/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs b/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs index 320e92760d..428151da84 100644 --- a/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs +++ b/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs @@ -101,7 +101,9 @@ namespace Umbraco.Web.UI.Install.Steps { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.TextBox DatabaseName; - + + protected global::System.Web.UI.WebControls.CheckBox DatabaseIntegratedSecurity; + /// /// DatabaseUsernameItem control. /// diff --git a/src/Umbraco.Web.UI/install/steps/database.ascx b/src/Umbraco.Web.UI/install/steps/database.ascx index b1b46eeebd..862355ebaf 100644 --- a/src/Umbraco.Web.UI/install/steps/database.ascx +++ b/src/Umbraco.Web.UI/install/steps/database.ascx @@ -1,6 +1,6 @@ <%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="Umbraco.Web.UI.Install.Steps.Database" - TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> <%@ Import Namespace="Umbraco.Core.Configuration" %> +
@@ -17,7 +17,6 @@
-
@@ -56,6 +55,46 @@
+
@@ -104,6 +143,12 @@
+ +
+ Integrated security: + +
+
Username: @@ -205,7 +250,6 @@
-
<%--Ensure that the client API is registered for the image.--%> diff --git a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs new file mode 100644 index 0000000000..d0cfd28d01 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs @@ -0,0 +1,8 @@ +using System; + +namespace Umbraco.Web.UI.Umbraco.Controls.Images +{ + public partial class ImageViewer : global::umbraco.controls.Images.ImageViewer + { + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs new file mode 100644 index 0000000000..164c636c69 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Umbraco.Web.UI.Umbraco.Controls.Images { + + + public partial class ImageViewer { + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 7d0761cf1e..06df4f50b2 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -778,12 +778,8 @@ - ImageViewer.ascx ASPXCodeBehind - - ImageViewer.ascx - ImageViewerUpdater.asmx Component @@ -1822,7 +1818,6 @@ ASPXCodeBehind - ASPXCodeBehind diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx deleted file mode 100644 index 0ceb3cd09a..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx +++ /dev/null @@ -1,48 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ImageViewer.ascx.cs" Inherits="umbraco.controls.Images.ImageViewer" %> -<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> - -
- - - - - <%#AltText%> - - - - <%#AltText%> - - -
');"> -
-
-
- - - <%--Register the javascript callback method if any.--%> - - -
-<%--Ensure that the client API is registered for the image.--%> - - - diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs index 115175d9c3..eaf2eb5b82 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs @@ -1,22 +1,19 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using Umbraco.Core.IO; using umbraco.cms.businesslogic.media; -using umbraco.cms.businesslogic; using Umbraco.Core; namespace umbraco.controls.Images { - public partial class ImageViewer : System.Web.UI.UserControl + public partial class ImageViewer : UserControl { public ImageViewer() { MediaItemPath = "#"; - MediaItemThumbnailPath = umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/images/blank.png"; + MediaItemThumbnailPath = IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/images/blank.png"; AltText = "No Image"; ImageFound = false; ViewerStyle = Style.Basic; @@ -54,9 +51,9 @@ namespace umbraco.controls.Images protected bool ImageFound { get; private set; } - private int m_FileWidth = 0; - private int m_FileHeight = 0; - private bool m_IsBound = false; + private int m_FileWidth; + private int m_FileHeight; + private bool m_IsBound; /// /// automatically bind if it's not explicitly called. @@ -65,7 +62,11 @@ namespace umbraco.controls.Images protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); - if (!m_IsBound) + + View view = FindControl(ViewerStyle.ToString()) as View; + MultiView.SetActiveView(view); + + if (m_IsBound == false) { DataBind(); } @@ -95,7 +96,7 @@ namespace umbraco.controls.Images } MediaItemPath = pFile.Value != null && !string.IsNullOrEmpty(pFile.Value.ToString()) - ? umbraco.IO.IOHelper.ResolveUrl(pFile.Value.ToString()) + ? IOHelper.ResolveUrl(pFile.Value.ToString()) : "#"; AltText = MediaItemPath != "#" ? m.Text : ui.GetText("no") + " " + ui.GetText("media"); @@ -117,6 +118,55 @@ namespace umbraco.controls.Images { ImageFound = false; } - } - } + } + + #region Controls + + /// + /// JsInclude1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; + + /// + /// MultiView control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.MultiView MultiView; + + /// + /// Basic control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View Basic; + + /// + /// ImageLink control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View ImageLink; + + /// + /// ThumbnailPreview control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View ThumbnailPreview; + + #endregion + } } \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs deleted file mode 100644 index c5e0edd1b1..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace umbraco.controls.Images { - - - public partial class ImageViewer { - - /// - /// JsInclude1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; - } -} diff --git a/src/umbraco.editorControls/mediapicker/mediaChooser.cs b/src/umbraco.editorControls/mediapicker/mediaChooser.cs index 85a2ae4dba..e523298120 100644 --- a/src/umbraco.editorControls/mediapicker/mediaChooser.cs +++ b/src/umbraco.editorControls/mediapicker/mediaChooser.cs @@ -1,20 +1,13 @@ using System; using System.Web.UI; - +using Umbraco.Core.IO; using umbraco.cms.presentation.Trees; -using ClientDependency.Core; -using umbraco.presentation; -using ClientDependency.Core.Controls; using umbraco.interfaces; -using umbraco.IO; -using umbraco.BasePages; using umbraco.controls.Images; -using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; -using System.Resources; using umbraco.editorControls.mediapicker; -using umbraco.uicontrols.TreePicker; using umbraco.cms.businesslogic; + namespace umbraco.editorControls { /// @@ -23,8 +16,8 @@ namespace umbraco.editorControls [ValidationProperty("Value")] public class mediaChooser : BaseTreePickerEditor { - bool _showpreview; - bool _showadvanced; + readonly bool _showpreview; + readonly bool _showadvanced; protected ImageViewer ImgViewer; protected HtmlGenericControl PreviewContainer; @@ -51,7 +44,7 @@ namespace umbraco.editorControls { get { - return _showadvanced ? umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/dialogs/mediaPicker.aspx" : TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Media, "media"); + return _showadvanced ? IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/dialogs/mediaPicker.aspx" : TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Media, "media"); } } @@ -87,7 +80,7 @@ namespace umbraco.editorControls TreePickerUrl, ModalWidth.ToString(), ModalHeight.ToString(), - umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco).TrimEnd('/') + IOHelper.ResolveUrl(SystemDirectories.Umbraco).TrimEnd('/') }); } } @@ -119,14 +112,14 @@ namespace umbraco.editorControls //create the preview wrapper PreviewContainer = new HtmlGenericControl("div"); PreviewContainer.ID = "preview"; - this.Controls.Add(PreviewContainer); + Controls.Add(PreviewContainer); - ImgViewer = (ImageViewer)Page.LoadControl(umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/controls/Images/ImageViewer.ascx"); + ImgViewer = (ImageViewer)Page.LoadControl(IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/controls/Images/ImageViewer.ascx"); ImgViewer.ID = "ImgViewer"; - ImgViewer.ViewerStyle = ImageViewer.Style.ImageLink; + ImgViewer.ViewerStyle = ImageViewer.Style.ImageLink; PreviewContainer.Style.Add(HtmlTextWriterStyle.MarginTop, "5px"); - PreviewContainer.Controls.Add(ImgViewer); + PreviewContainer.Controls.Add(ImgViewer); } } @@ -159,23 +152,6 @@ namespace umbraco.editorControls ImgViewer.MediaId = int.Parse(ItemIdValue.Value); } } - - //if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) - //{ - // //renders the media picker JS class - // ScriptManager.RegisterStartupScript(this, this.GetType(), "MediaChooser", MediaChooserScripts.MediaPicker, true); - // ScriptManager.RegisterStartupScript(this, this.GetType(), this.ClientID + "MediaPicker", strScript, true); - - //} - //else - //{ - // //renders the media picker JS class - // Page.ClientScript.RegisterClientScriptBlock(typeof(mediaChooser), "MediaChooser", MediaChooserScripts.MediaPicker, true); - // Page.ClientScript.RegisterStartupScript(this.GetType(), this.ClientID + "MediaPicker", strScript, true); - - //} - } - } } From 7518b514a7a167c7f8954cdc5061fc6bb1966dcf Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 06:18:13 -0700 Subject: [PATCH 30/85] Merge pull request #51 from kipusoep/master Updated the download link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f842afd3c2..64a219c651 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ To view more examples please visit [http://umbraco.com/why-umbraco/#caseStudies] ## Downloading ## -The downloadable Umbraco releases live at [http://our.umbraco.org/contribute/releases](http://our.umbraco.org/contribute/releases). +The downloadable Umbraco releases live at [http://our.umbraco.org/download](http://our.umbraco.org/download). ## Forums ## From 90cfd004cbe842a0b9df79d5c46cd7fbf8dbed7e Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 15:22:05 +0200 Subject: [PATCH 31/85] Merge branch 'wip-u4-1949' of https://github.com/AndyButland/Umbraco-CMS into AndyButland-wip-u4-1949 --- .../Configuration/UmbracoSettings.cs | 19 +++++++++++ .../config/umbracoSettings.config | 3 ++ .../GenericProperties/GenericProperty.ascx.cs | 32 ++++++++++++++++--- src/umbraco.businesslogic/UmbracoSettings.cs | 10 ++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings.cs b/src/Umbraco.Core/Configuration/UmbracoSettings.cs index 9eadbb2f34..4ed5027539 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings.cs @@ -1305,6 +1305,25 @@ namespace Umbraco.Core.Configuration } } + /// + /// Gets the default document type property used when adding new properties through the back-office + /// + /// Configured text for the default document type property + /// If undefined, 'Textstring' is the default + public static string DefaultDocumentTypeProperty + { + get + { + var defaultDocumentTypeProperty = GetKey("/settings/content/defaultDocumentTypeProperty"); + if (string.IsNullOrEmpty(defaultDocumentTypeProperty)) + { + defaultDocumentTypeProperty = "Textstring"; + } + + return defaultDocumentTypeProperty; + } + } + /// /// Configuration regarding webservices /// diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index e5e88a781a..4510e6ae2f 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -105,6 +105,9 @@ ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd + + + Textstring diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs index 4106275165..7390d4fbd5 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs @@ -130,7 +130,7 @@ namespace umbraco.controls.GenericProperties tbValidation.Text = ""; tbDescription.Text = ""; ddlTab.SelectedIndex = 0; - ddlTypes.SelectedIndex = 0; + SetDefaultDocumentTypeProperty(); checkMandatory.Checked = false; } @@ -195,13 +195,24 @@ namespace umbraco.controls.GenericProperties if (_dataTypeDefinitions != null) { ddlTypes.Items.Clear(); + var itemSelected = false; foreach(cms.businesslogic.datatype.DataTypeDefinition dt in _dataTypeDefinitions) { - ListItem li = new ListItem(dt.Text, dt.Id.ToString()); - if (_pt != null && _pt.DataTypeDefinition.Id == dt.Id) - li.Selected = true; + var li = new ListItem(dt.Text, dt.Id.ToString()); + if ((_pt != null && _pt.DataTypeDefinition.Id == dt.Id)) + { + li.Selected = true; + itemSelected = true; + } + ddlTypes.Items.Add(li); } + + // If item not selected from previous edit or load, set to default according to settings + if (!itemSelected) + { + SetDefaultDocumentTypeProperty(); + } } // tabs @@ -234,6 +245,19 @@ namespace umbraco.controls.GenericProperties tbDescription.Text = _pt.GetRawDescription(); } + private void SetDefaultDocumentTypeProperty() + { + var itemToSelect = ddlTypes.Items.FindByText(UmbracoSettings.DefaultDocumentTypeProperty); + if (itemToSelect != null) + { + itemToSelect.Selected = true; + } + else + { + ddlTypes.SelectedIndex = -1; + } + } + protected void defaultDeleteHandler(object sender, System.EventArgs e) { diff --git a/src/umbraco.businesslogic/UmbracoSettings.cs b/src/umbraco.businesslogic/UmbracoSettings.cs index 1b82199d38..647ce1dd0a 100644 --- a/src/umbraco.businesslogic/UmbracoSettings.cs +++ b/src/umbraco.businesslogic/UmbracoSettings.cs @@ -581,6 +581,16 @@ namespace umbraco get { return Umbraco.Core.Configuration.UmbracoSettings.IconPickerBehaviour; } } + /// + /// Gets the default document type property used when adding new properties through the back-office + /// + /// Configured text for the default document type property + /// If undefined, 'Textstring' is the default + public static string DefaultDocumentTypeProperty + { + get { return Umbraco.Core.Configuration.UmbracoSettings.DefaultDocumentTypeProperty; } + } + /// /// Configuration regarding webservices /// From 64fb5885562d6dfa750a184c54bc3c8358176de3 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 19 Jul 2013 15:40:12 +0200 Subject: [PATCH 32/85] defaultDocumentTypeProperty is no longer case-sensitive. Added to the Release config as well so it makes it into the umbraco downloadable package. --- src/Umbraco.Web.UI/config/umbracoSettings.Release.config | 3 +++ .../umbraco/controls/GenericProperties/GenericProperty.ascx.cs | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config index 537e7ca4ed..1758488f54 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config @@ -111,6 +111,9 @@ ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd + + + Textstring diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs index 7390d4fbd5..e4dc39b3a2 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs @@ -247,7 +247,8 @@ namespace umbraco.controls.GenericProperties private void SetDefaultDocumentTypeProperty() { - var itemToSelect = ddlTypes.Items.FindByText(UmbracoSettings.DefaultDocumentTypeProperty); + var itemToSelect = ddlTypes.Items.Cast().FirstOrDefault(item => item.Text.ToLowerInvariant() == UmbracoSettings.DefaultDocumentTypeProperty.ToLowerInvariant()); + if (itemToSelect != null) { itemToSelect.Selected = true; From 41c920a4ecc928d109ea8eca6b264f04f5698181 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 11:29:32 +1000 Subject: [PATCH 33/85] Updated to latest CDF version which contains some fixes. --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 8 ++++---- src/Umbraco.Web.UI/packages.config | 4 ++-- src/Umbraco.Web/Umbraco.Web.csproj | 4 ++-- src/Umbraco.Web/packages.config | 2 +- src/umbraco.cms/packages.config | 2 +- src/umbraco.cms/umbraco.cms.csproj | 4 ++-- src/umbraco.controls/packages.config | 2 +- src/umbraco.controls/umbraco.controls.csproj | 4 ++-- src/umbraco.editorControls/packages.config | 2 +- src/umbraco.editorControls/umbraco.editorControls.csproj | 4 ++-- src/umbraco.macroRenderings/packages.config | 2 +- .../umbraco.macroRenderings.csproj | 4 ++-- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 08e2a61284..aafeb8e742 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -100,13 +100,13 @@ {07fbc26b-2927-4a22-8d96-d644c667fecc} UmbracoExamine - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll - + False - ..\packages\ClientDependency-Mvc.1.7.0.3\lib\ClientDependency.Core.Mvc.dll + ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll False diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index a481c72581..bcc32a46e1 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -1,7 +1,7 @@  - - + + diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 7d0761cf1e..f9f387c013 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -93,9 +93,9 @@ {07fbc26b-2927-4a22-8d96-d644c667fecc} UmbracoExamine - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll False diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 9590b4fc69..69c5c12585 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.cms/packages.config b/src/umbraco.cms/packages.config index 3a63559557..fb0f66ebab 100644 --- a/src/umbraco.cms/packages.config +++ b/src/umbraco.cms/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.cms/umbraco.cms.csproj b/src/umbraco.cms/umbraco.cms.csproj index d51da1be04..cfa764afab 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -104,9 +104,9 @@ AllRules.ruleset - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll False diff --git a/src/umbraco.controls/packages.config b/src/umbraco.controls/packages.config index d30bbbe9c0..a432c3897a 100644 --- a/src/umbraco.controls/packages.config +++ b/src/umbraco.controls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.controls/umbraco.controls.csproj b/src/umbraco.controls/umbraco.controls.csproj index daf27f279f..0bf53c57d0 100644 --- a/src/umbraco.controls/umbraco.controls.csproj +++ b/src/umbraco.controls/umbraco.controls.csproj @@ -66,9 +66,9 @@ AllRules.ruleset - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll diff --git a/src/umbraco.editorControls/packages.config b/src/umbraco.editorControls/packages.config index d30bbbe9c0..a432c3897a 100644 --- a/src/umbraco.editorControls/packages.config +++ b/src/umbraco.editorControls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.editorControls/umbraco.editorControls.csproj b/src/umbraco.editorControls/umbraco.editorControls.csproj index bdd3e23fc1..b3b07340cd 100644 --- a/src/umbraco.editorControls/umbraco.editorControls.csproj +++ b/src/umbraco.editorControls/umbraco.editorControls.csproj @@ -112,9 +112,9 @@ {651E1350-91B6-44B7-BD60-7207006D7003} Umbraco.Web - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll System diff --git a/src/umbraco.macroRenderings/packages.config b/src/umbraco.macroRenderings/packages.config index c840bab970..38a750a6ff 100644 --- a/src/umbraco.macroRenderings/packages.config +++ b/src/umbraco.macroRenderings/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj b/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj index c07eff239b..74f7adb80d 100644 --- a/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj +++ b/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj @@ -104,9 +104,9 @@ AllRules.ruleset - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll False From 6f9883d373b63cdbc252da9a20b1044adef08e7f Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 12:30:12 +1000 Subject: [PATCH 34/85] Fixes MNTP required validation (U4-1975) --- .../MultiNodeTreePicker/MNTP_DataEditor.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs b/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs index 72d36c8fa2..b002218bd8 100644 --- a/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs +++ b/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs @@ -9,10 +9,10 @@ using System.Web.UI.WebControls; using System.Xml.Linq; using ClientDependency.Core; using Umbraco.Core; +using Umbraco.Core.IO; using umbraco.cms.presentation.Trees; using umbraco.controls.Images; using umbraco.controls.Tree; -using umbraco.IO; [assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerStyles.css", "text/css")] [assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerScripts.js", "application/x-javascript")] @@ -25,6 +25,7 @@ namespace umbraco.editorControls.MultiNodeTreePicker [ClientDependency(ClientDependencyType.Javascript, "ui/jqueryui.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "ui/jquery.tooltip.min.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "controls/Images/ImageViewer.js", "UmbracoRoot")] + [ValidationProperty("Value")] public class MNTP_DataEditor : Control, INamingContainer { #region Static Constructor @@ -93,9 +94,15 @@ namespace umbraco.editorControls.MultiNodeTreePicker ControlHeight = 200; } + /// + /// This is used for validation purposes only, see the [ValidationProperty("Value")] attribute above. + /// + public string Value + { + get { return string.Join(",", SelectedIds); } + } - - #region Protected members + #region Protected members /// /// @@ -374,9 +381,7 @@ namespace umbraco.editorControls.MultiNodeTreePicker this.Controls.Add(PickedValue); this.Controls.Add(RightColumn); } - - - + /// /// Ensure the repeater is data bound /// From 73e2559a139aba7aa5700e48e27a68c3831f1b62 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:14:48 +0700 Subject: [PATCH 35/85] tinyMCE internal language pack - RU --- src/Umbraco.Web.UI/umbraco_client/tinymce3/langs/ru.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/langs/ru.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/langs/ru.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/langs/ru.js new file mode 100644 index 0000000000..72f1a26f3c --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/langs/ru.js @@ -0,0 +1 @@ +tinyMCE.addI18n({ru:{common:{"more_colors":"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430...","invalid_data":"\u041e\u0448\u0438\u0431\u043a\u0430: \u0412\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u043c.","popup_blocked":"\u0411\u043b\u043e\u043a\u0438\u0440\u0430\u0442\u043e\u0440 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u043a\u043e\u043d \u0437\u0430\u043a\u0440\u044b\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0430\u0439\u0442\u0435.","clipboard_no_support":"\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0412\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: Ctrl C \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, Ctrl V \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c.","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0440\u0435\u0437\u043a\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 Firefox. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: Ctrl C \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, Ctrl V \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e?","not_set":"- \u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e -","class_name":"\u041a\u043b\u0430\u0441\u0441",browse:"\u041e\u0431\u0437\u043e\u0440",close:"\u0417\u0430\u043a\u0440\u044b\u0442\u044c",cancel:"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c",update:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c",insert:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c",apply:"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c","edit_confirm":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WYSIWYG \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f?","invalid_data_number":"{#field} - \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e","invalid_data_min":"{#field} - \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 {#min}","invalid_data_size":"{#field} - \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442",value:"(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435)"},contextmenu:{full:"\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435",right:"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",center:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",left:"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435"},insertdatetime:{"day_short":"\u0432\u0441,\u043f\u043d,\u0432\u0442,\u0441\u0440,\u0447\u0442,\u043f\u0442,\u0441\u0431,\u0432\u0441","day_long":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435,\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a,\u0432\u0442\u043e\u0440\u043d\u0438\u043a,\u0441\u0440\u0435\u0434\u0430,\u0447\u0435\u0442\u0432\u0435\u0440\u0433,\u043f\u044f\u0442\u043d\u0438\u0446\u0430,\u0441\u0443\u0431\u0431\u043e\u0442\u0430,\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","months_short":"\u044f\u043d\u0432,\u0444\u0435\u0432,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433,\u0441\u0435\u043d,\u043e\u043a\u0442,\u043d\u043e\u044f,\u0434\u0435\u043a","months_long":"\u044f\u043d\u0432\u0430\u0440\u044c,\u0444\u0435\u0432\u0440\u0430\u043b\u044c,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440\u0435\u043b\u044c,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433\u0443\u0441\u0442,\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c,\u043e\u043a\u0442\u044f\u0431\u0440\u044c,\u043d\u043e\u044f\u0431\u0440\u044c,\u0434\u0435\u043a\u0430\u0431\u0440\u044c","inserttime_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f","insertdate_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443","time_fmt":"%H:%M:%S","date_fmt":"%d.%m.%Y"},print:{"print_desc":"\u041f\u0435\u0447\u0430\u0442\u044c"},preview:{"preview_desc":"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440"},directionality:{"rtl_desc":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","ltr_desc":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e"},layer:{content:"\u041d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439","absolute_desc":"\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","backward_desc":"\u041d\u0430 \u0437\u0430\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d","forward_desc":"\u041d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d","insertlayer_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0439"},save:{"save_desc":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c","cancel_desc":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f"},nonbreaking:{"nonbreaking_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0435\u043b"},iespell:{download:"ieSpell \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c?","iespell_desc":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u044e"},advhr:{"advhr_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c","delta_height":"","delta_width":""},emotions:{"emotions_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0430\u0439\u043b","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c","search_desc":"\u041d\u0430\u0439\u0442\u0438","delta_width":"","delta_height":""},advimage:{"delta_width":"200","image_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","delta_height":""},advlink:{"delta_width":"200","link_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","delta_height":""},xhtmlxtras:{"attribs_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442","ins_desc":"\u0417\u0430\u043c\u0435\u043d\u0430","del_desc":"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435","acronym_desc":"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0446\u0438\u044f","abbr_desc":"\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","cite_desc":"\u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c CSS \u0441\u0442\u0438\u043b\u044c","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435","paste_word_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 Word","paste_text_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442"},"paste_dlg":{"word_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e.","text_linebreaks":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a","text_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e."},table:{"cellprops_delta_width":"30",cell:"\u042f\u0447\u0435\u0439\u043a\u0430",col:"\u0421\u0442\u043e\u043b\u0431\u0435\u0446",row:"\u0421\u0442\u0440\u043e\u043a\u0430",del:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443","copy_row_desc":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","cut_row_desc":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","paste_row_after_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","paste_row_before_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","props_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b","cell_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438","row_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438","merge_cells_desc":"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438","split_cells_desc":"\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443","delete_col_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446","col_after_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430","col_before_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430","delete_row_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","row_after_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","row_before_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443",desc:"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u0412\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044f\u043d\u044b.\n\n\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f?","restore_content":"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435","unload_msg":"\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044f\u043d\u044b, \u0435\u0441\u043b\u0438 \u0412\u044b \u0443\u0439\u0434\u0435\u0442\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b."},fullscreen:{desc:"\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c"},media:{"delta_height":"",edit:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0438\u043f\u0430",desc:"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043b\u0438\u043f","delta_width":""},fullpage:{desc:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430","delta_width":"","delta_height":""},template:{desc:"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d"},visualchars:{desc:"\u0412\u0441\u0435 \u0437\u043d\u0430\u043a\u0438"},spellchecker:{desc:"\u041f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",menu:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f","ignore_word":"\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c","ignore_words":"\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435",langs:"\u042f\u0437\u044b\u043a\u0438",wait:"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435...",sug:"\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b","no_sug":"\u041d\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432","no_mpell":"\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e.","learn_word":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u043e"},pagebreak:{desc:"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b"},advlist:{types:"\u0421\u0438\u043c\u0432\u043e\u043b\u044b",def:"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435","lower_alpha":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","lower_greek":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","lower_roman":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b","upper_alpha":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","upper_roman":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b",circle:"\u041e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438",disc:"\u041a\u0440\u0443\u0433\u0438",square:"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b"},colors:{"333300":"\u0422\u0451\u043c\u043d\u043e-\u043e\u043b\u0438\u0432\u043a\u043e\u0432\u044b\u0439","993300":"\u0411\u0438\u0441\u043c\u0430\u0440\u043a-\u0444\u0443\u0440\u0438\u043e\u0437\u043e","000000":"\u0427\u0435\u0440\u043d\u044b\u0439","003300":"\u0422\u0435\u043c\u043d\u043e-\u0437\u0435\u043b\u0435\u043d\u044b\u0439","003366":"\u0422\u0451\u043c\u043d\u0430\u044f \u043b\u0430\u0437\u0443\u0440\u044c","000080":"\u0422\u0451\u043c\u043d\u043e-\u0441\u0438\u043d\u0438\u0439","333399":"\u0418\u043d\u0434\u0438\u0433\u043e","333333":"\u041e\u0447\u0435\u043d\u044c \u0442\u0451\u043c\u043d\u043e-\u0441\u0435\u0440\u044b\u0439","800000":"\u0422\u0451\u043c\u043d\u043e-\u0431\u043e\u0440\u0434\u043e\u0432\u044b\u0439",FF6600:"\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439","808000":"\u041e\u043b\u0438\u0432\u043a\u043e\u0432\u044b\u0439","008000":"\u0412\u043b\u044e\u0431\u043b\u0435\u043d\u043d\u043e\u0439 \u0436\u0430\u0431\u044b","008080":"C\u0438\u043d\u0435-\u0437\u0435\u043b\u0435\u043d\u044b\u0439","0000FF":"\u0421\u0438\u043d\u0438\u0439","666699":"\u0421\u0435\u0440\u043e-\u0433\u043e\u043b\u0443\u0431\u043e\u0439","808080":"\u0421\u0435\u0440\u044b\u0439",FF0000:"\u041a\u0440\u0430\u0441\u043d\u044b\u0439",FF9900:"\u042f\u043d\u0442\u0430\u0440\u043d\u044b\u0439","99CC00":"\u0416\u0451\u043b\u0442\u043e-\u0437\u0435\u043b\u0451\u043d\u044b\u0439","339966":"\u0411\u0438\u0440\u044e\u0437\u043e\u0432\u044b\u0439","33CCCC":"\u042f\u0439\u0446\u0430 \u0434\u0440\u043e\u0437\u0434\u0430","3366FF":"\u041a\u043e\u0440\u043e\u043b\u0435\u0432\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u0438\u0439","800080":"\u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u043e-\u0431\u0430\u043a\u043b\u0430\u0436\u0430\u043d\u043d\u044b\u0439","999999":"\u041a\u0432\u0430\u0440\u0446\u0435\u0432\u044b\u0439",FF00FF:"\u041f\u0443\u0440\u043f\u0443\u0440\u043d\u044b\u0439",FFCC00:"\u0417\u043e\u043b\u043e\u0442\u043e\u0439",FFFF00:"\u0416\u0435\u043b\u0442\u044b\u0439","00FF00":"\u0417\u0435\u043b\u0435\u043d\u044b\u0439","00FFFF":"\u0426\u0438\u0430\u043d","00CCFF":"\u041d\u0435\u0431\u0435\u0441\u043d\u044b\u0439","993366":"\u0420\u043e\u0437\u043e\u0432\u0430\u0442\u043e-\u043b\u0438\u043b\u043e\u0432\u044b\u0439",C0C0C0:"\u0421\u0435\u0440\u0435\u0431\u0440\u0438\u0441\u0442\u044b\u0439",FF99CC:"\u0420\u043e\u0437\u043e\u0432\u044b\u0439",FFCC99:"\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u043e-\u043f\u0435\u0440\u0441\u0438\u043a\u043e\u0432\u044b\u0439",FFFF99:"\u0412\u0435\u0440\u0434\u0435\u043f\u0435\u0448\u0435\u0432\u044b\u0439",CCFFCC:"\u0417\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u0447\u0430\u044f",CCFFFF:"\u0411\u043b\u0435\u0434\u043d\u043e-\u0441\u0438\u043d\u0438\u0439","99CCFF":"\u0421\u0432\u0435\u0442\u043b\u043e-\u043d\u0435\u0431\u0435\u0441\u043d\u044b\u0439",CC99FF:"\u0424\u0438\u0430\u043b\u043a\u043e\u0432\u044b\u0439",FFFFFF:"\u0411\u0435\u043b\u044b\u0439"},aria:{"rich_text_area":"\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440"},wordcount:{words:"\u0421\u043b\u043e\u0432:"}}}); From f2a7dde5ce00a8922e1fd628dac525b24abf56ca Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:16:00 +0700 Subject: [PATCH 36/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/themes/simple/langs/ru.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/simple/langs/ru.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/simple/langs/ru.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/simple/langs/ru.js new file mode 100644 index 0000000000..42ec53aba6 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/simple/langs/ru.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.simple',{"cleanup_desc":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043e\u0434","redo_desc":"\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl+Y)","undo_desc":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl+Z)","numlist_desc":"\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","bullist_desc":"\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","striketrough_desc":"\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","underline_desc":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439 (Ctrl+U)","italic_desc":"\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)","bold_desc":"\u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl+B)"}); From bb750d186a188bdea8e44ddfe51c05e10028814f Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:17:56 +0700 Subject: [PATCH 37/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/themes/advanced/langs/ru.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru.js new file mode 100644 index 0000000000..19f797872e --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advanced',{"underline_desc":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439 (Ctrl+U)","italic_desc":"\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)","bold_desc":"\u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl+B)",dd:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430",dt:"\u0422\u0435\u0440\u043c\u0438\u043d \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430",samp:"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430",code:"\u041a\u043e\u0434",blockquote:"\u0426\u0438\u0442\u0430\u0442\u0430",h6:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6",h5:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5",h4:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4",h3:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3",h2:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2",h1:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1",pre:"\u041f\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439",address:"\u0410\u0434\u0440\u0435\u0441",div:"Div",paragraph:"\u0410\u0431\u0437\u0430\u0446",block:"\u0424\u043e\u0440\u043c\u0430\u0442",fontdefault:"\u0428\u0440\u0438\u0444\u0442","font_size":"\u0420\u0430\u0437\u043c\u0435\u0440","style_select":"\u0421\u0442\u0438\u043b\u044c","more_colors":"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430...","toolbar_focus":"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u043a\u043d\u043e\u043f\u043e\u043a (Alt+Q). \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0443 (Alt+Z). \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u0443\u0442\u0438 (Alt+X).",newdocument:"\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0441\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c?",path:"\u0422\u0435\u0433\u0438","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0440\u0435\u0437\u043a\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 Firefox. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: Ctrl C \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, Ctrl V \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e?","blockquote_desc":"\u0426\u0438\u0442\u0430\u0442\u0430","help_desc":"\u041f\u043e\u043c\u043e\u0449\u044c","newdocument_desc":"\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442","image_props_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","paste_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c","copy_desc":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cut_desc":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c","anchor_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044f\u043a\u043e\u0440\u044c","visualaid_desc":"\u0412\u0441\u0435 \u0437\u043d\u0430\u043a\u0438","charmap_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b","backcolor_desc":"\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430","forecolor_desc":"\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430","custom1_desc":"\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","removeformat_desc":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442","hr_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0442\u0443","sup_desc":"\u041d\u0430\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","sub_desc":"\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","code_desc":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTML \u043a\u043e\u0434","cleanup_desc":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043e\u0434","image_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","unlink_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","link_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","redo_desc":"\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl+Y)","undo_desc":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl+Z)","indent_desc":"\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","outdent_desc":"\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","numlist_desc":"\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","bullist_desc":"\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","justifyfull_desc":"\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435","justifyright_desc":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","justifycenter_desc":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","justifyleft_desc":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","striketrough_desc":"\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","help_shortcut":"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-F10 \u0434\u043b\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-0 \u0434\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438.","rich_text_area":"\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440","shortcuts_desc":"\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438",toolbar:"\u041f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); From a2a20133aaf6da5ae028c97d3c9d9550ca863b94 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:18:38 +0700 Subject: [PATCH 38/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/themes/advanced/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru_dlg.js new file mode 100644 index 0000000000..7dd31b2adb --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/themes/advanced/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advanced_dlg',{"link_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a","link_is_external":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 http://?","link_is_email":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 mailto:?","link_titlefield":"\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430","link_target_blank":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435","link_target_same":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043d\u0435","link_target":"\u0426\u0435\u043b\u044c","link_url":"\u0410\u0434\u0440\u0435\u0441","link_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0441\u044b\u043b\u043a\u0438","image_align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_textbottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","image_align_texttop":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","image_align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","image_align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_baseline":"\u041f\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438","image_align":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","image_hspace":"\u0413\u043e\u0440\u0438\u0437. \u043e\u0442\u0441\u0442\u0443\u043f","image_vspace":"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f","image_dimensions":"\u0420\u0430\u0437\u043c\u0435\u0440","image_alt":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","image_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a","image_border":"\u0413\u0440\u0430\u043d\u0438\u0446\u0430","image_src":"\u0410\u0434\u0440\u0435\u0441","image_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","charmap_title":"\u0412\u044b\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0430","colorpicker_name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:","colorpicker_color":"\u041a\u043e\u0434:","colorpicker_named_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_named_tab":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f","colorpicker_palette_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_palette_tab":"\u041f\u0430\u043b\u0438\u0442\u0440\u0430","colorpicker_picker_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_picker_tab":"\u0421\u043f\u0435\u043a\u0442\u0440","colorpicker_title":"\u0426\u0432\u0435\u0442\u0430","code_wordwrap":"\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a","code_title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 HTML \u043a\u043e\u0434\u0430","anchor_name":"\u0418\u043c\u044f \u044f\u043a\u043e\u0440\u044f","anchor_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u043a\u043e\u0440\u044f","about_loaded":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b","about_version":"\u0412\u0435\u0440\u0441\u0438\u044f","about_author":"\u0410\u0432\u0442\u043e\u0440","about_plugin":"\u041f\u043b\u0430\u0433\u0438\u043d","about_plugins":"\u041f\u043b\u0430\u0433\u0438\u043d\u044b","about_license":"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f","about_help":"\u041f\u043e\u043c\u043e\u0449\u044c","about_general":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","about_title":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 TinyMCE","charmap_usage":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \"\u0412\u043b\u0435\u0432\u043e\" \u0438 \"\u0412\u043f\u0440\u0430\u0432\u043e\" \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.","anchor_invalid":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u044f\u043a\u043e\u0440\u044f.","accessibility_help":"\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438","accessibility_usage_title":"\u041e\u0431\u0449\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435","invalid_color_value":"\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430"}); From ef3094f8d9421a1ca63ec571eeeb74cae4e424ed Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:19:51 +0700 Subject: [PATCH 39/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/advhr/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advhr/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advhr/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advhr/langs/ru_dlg.js new file mode 100644 index 0000000000..10c3ceb59d --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advhr/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advhr_dlg',{size:"\u0412\u044b\u0441\u043e\u0442\u0430",noshade:"\u0411\u0435\u0437 \u0442\u0435\u043d\u0438",width:"\u0428\u0438\u0440\u0438\u043d\u0430",normal:"\u041e\u0431\u044b\u0447\u043d\u0430\u044f",widthunits:"\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f"}); From 6787252f9be76ede3475bb14d3497b060ef2cd1a Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:20:36 +0700 Subject: [PATCH 40/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/advimage/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advimage/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advimage/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advimage/langs/ru_dlg.js new file mode 100644 index 0000000000..01c3f66238 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advimage/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advimage_dlg',{"image_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_textbottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","align_texttop":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_baseline":"\u041f\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",hspace:"\u0413\u043e\u0440\u0438\u0437. \u043e\u0442\u0441\u0442\u0443\u043f",vspace:"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f",dimensions:"\u0420\u0430\u0437\u043c\u0435\u0440",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",list:"\u0421\u043f\u0438\u0441\u043e\u043a",alt:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",src:"\u0410\u0434\u0440\u0435\u0441","dialog_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","missing_alt":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f? \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u043b\u0438 \u0442\u0435\u043c, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u0439\u0442\u044b \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438.","example_img":"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f",misc:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",mouseout:"\u0412 \u043f\u043e\u043a\u043e\u0435",mouseover:"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438","alt_image":"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","swap_image":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",map:"\u041a\u0430\u0440\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a",id:"\u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",classes:"\u041a\u043b\u0430\u0441\u0441\u044b",style:"\u0421\u0442\u0438\u043b\u044c","long_desc":"\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","constrain_proportions":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438",preview:"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",general:"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","tab_advanced":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","tab_appearance":"\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435","tab_general":"\u041e\u0431\u0449\u0435\u0435",width:"\u0428\u0438\u0440\u0438\u043d\u0430",height:"\u0412\u044b\u0441\u043e\u0442\u0430"}); From ca124fb662c7f9860524cbde37af4dc76ec5ab5f Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:21:16 +0700 Subject: [PATCH 41/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/advlink/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advlink/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advlink/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advlink/langs/ru_dlg.js new file mode 100644 index 0000000000..af117bd8b6 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/advlink/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advlink_dlg',{"target_name":"\u0418\u043c\u044f \u0446\u0435\u043b\u0438",classes:"\u041a\u043b\u0430\u0441\u0441\u044b",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0418\u043c\u044f","popup_position":"\u041f\u043e\u0437\u0438\u0446\u0438\u044f (X/Y)",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","popup_size":"\u0420\u0430\u0437\u043c\u0435\u0440","popup_dependent":"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Firefox)","popup_resizable":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440","popup_location":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f","popup_menubar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043c\u0435\u043d\u044e","popup_toolbar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432","popup_statusbar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f","popup_scrollbars":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0441\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438","popup_return":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \'return false\'","popup_name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430","popup_url":"\u0410\u0434\u0440\u0435\u0441",popup:"\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Java","target_blank":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435","target_top":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043a\u0430\u0434\u0440\u0435 (\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u0434\u0440\u044b)","target_parent":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435/\u043a\u0430\u0434\u0440\u0435","target_same":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043d\u0435/\u043a\u0430\u0434\u0440\u0435","anchor_names":"\u042f\u043a\u043e\u0440\u044f","popup_opts":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430","advanced_props":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","event_props":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439","popup_props":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f","general_props":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","advanced_tab":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","popup_tab":"\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435","general_tab":"\u041e\u0431\u0449\u0435\u0435",list:"\u0421\u043f\u0438\u0441\u043e\u043a","is_external":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 http://?","is_email":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 mailto:?",titlefield:"\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430",target:"\u041e\u043a\u043d\u043e",url:"\u0410\u0434\u0440\u0435\u0441",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0441\u044b\u043b\u043a\u0438","link_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",accesskey:"\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430",tabindex:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",rev:"\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0438 \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435",rel:"\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043a \u0446\u0435\u043b\u0438",mime:"MIME \u0442\u0438\u043f \u0446\u0435\u043b\u0438",encoding:"\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0446\u0435\u043b\u0438",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430","target_langcode":"\u042f\u0437\u044b\u043a \u0446\u0435\u043b\u0438",width:"\u0428\u0438\u0440\u0438\u043d\u0430",height:"\u0412\u044b\u0441\u043e\u0442\u0430"}); From 2307424fb642160089a0c95a381e432d7edc58fb Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:22:01 +0700 Subject: [PATCH 42/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/emotions/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/emotions/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/emotions/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/emotions/langs/ru_dlg.js new file mode 100644 index 0000000000..a6874b9806 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/emotions/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.emotions_dlg',{cry:"\u041f\u043b\u0430\u0447\u0443",cool:"\u041a\u0440\u0443\u0442\u043e\u0439",desc:"\u0421\u043c\u0430\u0439\u043b\u044b",title:"\u0412\u044b\u0431\u043e\u0440 \u0441\u043c\u0430\u0439\u043b\u0430",yell:"\u041a\u0440\u0438\u0447\u0443",wink:"\u041f\u043e\u0434\u043c\u0438\u0433\u0438\u0432\u0430\u044e",undecided:"\u0412 \u043d\u0435\u0440\u0435\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438","tongue_out":"\u0414\u0440\u0430\u0437\u043d\u044e\u0441\u044c",surprised:"\u0423\u0434\u0438\u0432\u043b\u044f\u044e\u0441\u044c",smile:"\u0423\u043b\u044b\u0431\u0430\u044e\u0441\u044c",sealed:"\u041d\u0435\u043c \u043a\u0430\u043a \u0440\u044b\u0431\u0430","money_mouth":"\u0414\u0435\u043d\u044c\u0433\u0438",laughing:"\u0421\u043c\u0435\u044e\u0441\u044c",kiss:"\u041f\u043e\u0446\u0435\u043b\u0443\u0439",innocent:"\u0410\u043d\u0433\u0435\u043b",frown:"\u0425\u043c\u0443\u0440\u044e\u0441\u044c","foot_in_mouth":"\u0412 \u0440\u043e\u0442 \u043c\u043d\u0435 \u043d\u043e\u0433\u0438",embarassed:"\u041a\u0440\u0430\u0441\u043d\u0435\u044e",usage:"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \"\u0412\u043b\u0435\u0432\u043e\" \u0438 \"\u0412\u043f\u0440\u0430\u0432\u043e\" \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438."}); From a4a96208895993099c0b52afb8c88b35c20210d7 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:22:46 +0700 Subject: [PATCH 43/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/fullpage/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/fullpage/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/fullpage/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/fullpage/langs/ru_dlg.js new file mode 100644 index 0000000000..7df2760bd6 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/fullpage/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.fullpage_dlg',{title:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430","meta_tab":"\u041e\u0431\u0449\u0435\u0435","appearance_tab":"\u0412\u0438\u0434","advanced_tab":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","meta_props":"\u0426\u0435\u043b\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438",langprops:"\u042f\u0437\u044b\u043a \u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","meta_title":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","meta_keywords":"\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430","meta_description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","meta_robots":"\u0420\u0430\u0431\u043e\u0442\u044b",doctypes:"\u0422\u0438\u043f",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","xml_pi":"\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 XML",encoding:"\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430","appearance_bgprops":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u043e\u043d\u0430","appearance_marginprops":"\u041e\u0442\u0441\u0442\u0443\u043f\u044b","appearance_linkprops":"\u0426\u0432\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a","appearance_textprops":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0430",bgcolor:"\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430",bgimage:"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","left_margin":"\u041e\u0442\u0441\u0442\u0443\u043f \u0441\u043b\u0435\u0432\u0430","right_margin":"\u041e\u0442\u0441\u0442\u0443\u043f \u0441\u043f\u0440\u0430\u0432\u0430","top_margin":"\u041e\u0442\u0441\u0442\u0443\u043f \u0441\u0432\u0435\u0440\u0445\u0443","bottom_margin":"\u041e\u0442\u0441\u0442\u0443\u043f \u0441\u043d\u0438\u0437\u0443","text_color":"\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430","font_size":"\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430","font_face":"\u0428\u0440\u0438\u0444\u0442","link_color":"\u0426\u0432\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438","hover_color":"\u0426\u0432\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438","visited_color":"\u0426\u0432\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438","active_color":"\u0426\u0432\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438",textcolor:"\u0426\u0432\u0435\u0442",fontsize:"\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430",fontface:"\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0448\u0440\u0438\u0444\u0442\u043e\u0432","meta_index_follow":"Index and follow the links","meta_index_nofollow":"Index and don\'t follow the links","meta_noindex_follow":"Do not index but follow the links","meta_noindex_nofollow":"Do not index and don \\ \'t follow the links","appearance_style":"\u041b\u0438\u0441\u0442 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0438\u043b\u0435\u0439",stylesheet:"\u041b\u0438\u0441\u0442 \u0441\u0442\u0438\u043b\u0435\u0439",style:"\u0421\u0442\u0438\u043b\u044c",author:"\u0410\u0432\u0442\u043e\u0440",copyright:"\u041a\u043e\u043f\u0438\u0440\u0430\u0439\u0442",add:"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442",remove:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442",moveup:"\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0432\u0435\u0440\u0445",movedown:"\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u043d\u0438\u0437","head_elements":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Header",info:"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f","add_title":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Title","add_meta":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Meta","add_script":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Script","add_style":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Style","add_link":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Link","add_base":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Base","add_comment":"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439","title_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Title","script_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Script","style_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Style","base_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Base","link_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Link","meta_element":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 Meta","comment_element":"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439",src:"Src",language:"\u042f\u0437\u044b\u043a",href:"\u0441\u0441\u044b\u043b\u043a\u0430",target:"\u0426\u0435\u043b\u044c",type:"Type",charset:"\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430",defer:"\u041e\u0442\u0441\u0440\u043e\u0447\u043a\u0430",media:"\u041c\u0435\u0434\u0438\u0430",properties:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",name:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",value:"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435",content:"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435",rel:"Rel",rev:"Rev",hreflang:"\u042f\u0437\u044b\u043a \u0441\u0441\u044b\u043b\u043a\u0438","general_props":"\u041e\u0431\u0449\u0435\u0435","advanced_props":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e"}); From 0da8a8db36cf5a8b97318f0e1bfb331cb16ce94e Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:23:51 +0700 Subject: [PATCH 44/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/media/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/media/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/media/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/media/langs/ru_dlg.js new file mode 100644 index 0000000000..31a2d222c1 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/media/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.media_dlg',{list:"\u0421\u043f\u0438\u0441\u043e\u043a",file:"\u0410\u0434\u0440\u0435\u0441",advanced:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",general:"\u041e\u0431\u0449\u0435\u0435",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043b\u0438\u043f\u0430","align_top_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_center":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","qt_stream_warn":"\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u043b\u0435 QT Src.",qtsrc:"QT Src",progress:"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441",sound:"\u0417\u0432\u0443\u043a",swstretchvalign:"\u0412\u0435\u0440. \u0432\u044b\u0440-\u0435 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f",swstretchhalign:"\u0413\u043e\u0440. \u0432\u044b\u0440-\u0435 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f",swstretchstyle:"\u0421\u0442\u0438\u043b\u044c \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u0435",scriptcallbacks:"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430","align_top_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",uimode:"\u0420\u0435\u0436\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430",rate:"\u0420\u0435\u0439\u0442\u0438\u043d\u0433",playcount:"\u0429\u0435\u0442\u0447\u0438\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439",defaultframe:"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u0430\u0434\u0440",currentposition:"\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f",currentmarker:"\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440",captioningid:"\u0418\u043c\u044f \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432",baseurl:"\u0411\u0430\u0437\u043e\u0440\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"\u041e\u043a\u043e\u043d\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e",stretchtofit:"\u041f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430",mute:"\u0411\u0435\u0437 \u0437\u0432\u0443\u043a\u0430",invokeurls:"\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441",fullscreen:"\u041d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d",enabled:"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e",autostart:"\u0410\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a",volume:"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c",target:"\u0426\u0435\u043b\u044c",qtsrcchokespeed:"Choke speed",href:"\u0421\u0441\u044b\u043b\u043a\u0430",endtime:"\u0412\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f",starttime:"\u0412\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430",enablejavascript:"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c JavaScript",correction:"\u0411\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438",targetcache:"\u041a\u044d\u0448 \u0446\u0435\u043b\u0438",playeveryframe:"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440",kioskmode:"\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043e\u0441\u043a",controller:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",menu:"\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e",loop:"\u041f\u043e\u0432\u0442\u043e\u0440",play:"\u0410\u0432\u0442\u0437\u0430\u043f\u0443\u0441\u043a",hspace:"\u0413\u043e\u0440. \u043e\u0442\u0441\u0442\u0443\u043f",vspace:"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f","class_name":"\u041a\u043b\u0430\u0441\u0441",name:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",id:"\u0418\u043c\u044f",type:"\u0422\u0438\u043f",size:"\u0420\u0430\u0437\u043c\u0435\u0440\u044b",preview:"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","constrain_proportions":"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438",controls:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",numloop:"\u041f\u043e\u0432\u0442\u043e\u0440\u044b",console:"\u041a\u043e\u043d\u0441\u043e\u043b\u044c",cache:"\u041a\u044d\u0448",autohref:"\u0410\u0432\u0442\u043e-\u0441\u0441\u044b\u043b\u043a\u0430",liveconnect:"SWLiveConnect",flashvars:"Flash \u043a\u043e\u043c\u0430\u043d\u0434\u044b",base:"Base",bgcolor:"\u0424\u043e\u043d",wmode:"\u041e\u043a\u043d\u043e",salign:"\u0412\u044b\u0440-\u0435",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",scale:"\u041e\u0431\u043b\u0430\u0441\u0442\u044c",quality:"\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e",shuffle:"\u0412 \u0440\u0430\u0437\u0431\u0440\u043e\u0441",prefetch:"\u0423\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430",nojava:"\u0411\u0435\u0437 Java",maintainaspect:"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440",imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f",center:"\u0426\u0435\u043d\u0442\u0440",autogotourl:"\u0410\u0432\u0442\u043e\u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441","shockwave_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Shockwave","rmp_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Real Media","wmp_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Windows Media","qt_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Quicktime","flash_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Flash",hidden:"\u0421\u043a\u0440\u044b\u0442\u044b\u0439","align_bottom_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_bottom_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",flash:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 Flash \u0444\u0430\u0439\u043b\u0430",quicktime:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 Quick Time \u0444\u0430\u0439\u043b\u0430","embedded_audio_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u043e\u0433\u043e \u0430\u0443\u0434\u0438\u043e",windowsmedia:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 Windows Media \u0444\u0430\u0439\u043b\u0430",realmedia:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 Real Media \u0444\u0430\u0439\u043b\u0430",shockwave:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 Shockwave \u0444\u0430\u0439\u043b\u0430",audio:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 HTML5 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430",video:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 HTML5 \u0432\u0438\u0434\u0435\u043e \u0444\u0430\u0439\u043b\u0430","html5_video_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b HTML5 Video",altsource1:"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a 1",altsource2:"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a 2",preload:"\u041f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430",poster:"\u041f\u043e\u0441\u0442\u0435\u0440",source:"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","html5_audio_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0443\u0434\u0438\u043e","preload_none":"\u0411\u0435\u0437 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438","preload_metadata":"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e","preload_auto":"\u041d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430",iframe:"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u0432 IFrame",embeddedaudio:"\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0417\u0432\u0443\u043a"}); From 6cdb564a9fabee822961045ba35d73e9892c8393 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:24:31 +0700 Subject: [PATCH 45/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/paste/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/langs/ru_dlg.js new file mode 100644 index 0000000000..c3c3d438f4 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.paste_dlg',{"word_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e.","text_linebreaks":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a","text_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e."}); From 6c03dac869b5a9dfed724289c42ea46f59d80692 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:25:18 +0700 Subject: [PATCH 46/85] tinyMCE internal language pack - RU --- .../tinymce3/plugins/searchreplace/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/langs/ru_dlg.js new file mode 100644 index 0000000000..699a5c728a --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.searchreplace_dlg',{findwhat:"\u041f\u043e\u0438\u0441\u043a",replacewith:"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430",direction:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",up:"\u0412\u0432\u0435\u0440\u0445 ",down:"\u0412\u043d\u0438\u0437",mcase:"\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440",findnext:"\u041d\u0430\u0439\u0442\u0438 \u0434\u0430\u043b\u0435\u0435",allreplaced:"\u0412\u0441\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b.","searchnext_desc":"\u041d\u0430\u0439\u0442\u0438 \u0435\u0449\u0435",notfound:"\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d. \u0421\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.","search_title":"\u041f\u043e\u0438\u0441\u043a","replace_title":"\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430",replaceall:"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435",replace:"\u0417\u0430\u043c\u0435\u043d\u0430"}); From fdecd697b7c29a87308cde7ee03254f62d1102e0 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:26:04 +0700 Subject: [PATCH 47/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/style/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/style/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/style/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/style/langs/ru_dlg.js new file mode 100644 index 0000000000..198028455a --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/style/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.style_dlg',{"text_lineheight":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438","text_variant":"\u0412\u0430\u0440\u0438\u0430\u043d\u0442","text_style":"\u0421\u0442\u0438\u043b\u044c","text_weight":"\u0422\u043e\u043b\u0449\u0438\u043d\u0430","text_size":"\u0420\u0430\u0437\u043c\u0435\u0440","text_font":"\u0428\u0440\u0438\u0444\u0442","text_props":"\u0422\u0435\u043a\u0441\u0442","positioning_tab":"\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435","list_tab":"\u0421\u043f\u0438\u0441\u043e\u043a","border_tab":"\u0413\u0440\u0430\u043d\u0438\u0446\u0430","box_tab":"\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440","block_tab":"\u0411\u043b\u043e\u043a","background_tab":"\u0424\u043e\u043d","text_tab":"\u0422\u0435\u043a\u0441\u0442",apply:"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c",title:"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 CSS \u0441\u0442\u0438\u043b\u044f",clip:"\u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435",placement:"\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435",overflow:"\u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435",zindex:"Z-\u0438\u043d\u0434\u0435\u043a\u0441",visibility:"\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c","positioning_type":"\u0422\u0438\u043f",position:"\u041f\u043e\u0437\u0438\u0446\u0438\u044f","bullet_image":"\u041c\u0430\u0440\u043a\u0435\u0440","list_type":"\u0422\u0438\u043f",color:"\u0426\u0432\u0435\u0442",height:"\u0412\u044b\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",style:"\u0421\u0442\u0438\u043b\u044c",margin:"\u041e\u0442\u0441\u0442\u0443\u043f",left:"\u0421\u043b\u0435\u0432\u0430",bottom:"\u0421\u043d\u0438\u0437\u0443",right:"\u0421\u043f\u0440\u0430\u0432\u0430",top:"\u0412\u0432\u0435\u0440\u0445",same:"\u041e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445",padding:"\u041f\u043e\u043b\u044f","box_clear":"\u042f\u0432\u043d\u044b\u0439","box_float":"\u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439","box_height":"\u0412\u044b\u0441\u043e\u0442\u0430","box_width":"\u0428\u0438\u0440\u0438\u043d\u0430","block_display":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","block_whitespace":"\u041f\u0440\u043e\u0431\u0435\u043b","block_text_indent":"\u041e\u0442\u0441\u0442\u0443\u043f \u0442\u0435\u043a\u0441\u0442\u0430","block_text_align":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","block_vertical_alignment":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","block_letterspacing":"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u0443\u043a\u0432\u0430\u043c\u0438","block_wordspacing":"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u0432\u0430\u043c\u0438","background_vpos":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_hpos":"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_attachment":"\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430","background_repeat":"\u041f\u043e\u0432\u0442\u043e\u0440","background_image":"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","background_color":"\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430","text_none":"\u0411\u0435\u0437 \u0432\u0441\u0435\u0433\u043e","text_blink":"\u041c\u0435\u0440\u0446\u0430\u044e\u0449\u0438\u0439","text_case":"\u0420\u0435\u0433\u0438\u0441\u0442\u0440","text_striketrough":"\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","text_underline":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","text_overline":"\u0421 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0435\u0440\u0442\u043e\u0439","text_decoration":"\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435","text_color":"\u0426\u0432\u0435\u0442",text:"\u0422\u0435\u043a\u0441\u0442",background:"\u0424\u043e\u043d",block:"\u0411\u043b\u043e\u043a",box:"\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",list:"\u0421\u043f\u0438\u0441\u043e\u043a"}); From f7196ee8f94c4307ded90bf79c079c098c2bd882 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:26:47 +0700 Subject: [PATCH 48/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/table/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/langs/ru_dlg.js new file mode 100644 index 0000000000..f4f8111c29 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"\u041f\u0440\u0430\u0432\u0438\u043b\u0430","frame_all":"\u0432\u0441\u0435","frame_cols":"\u043a\u043e\u043b\u043e\u043d\u043a\u0438","frame_rows":"\u0440\u044f\u0434\u044b","frame_groups":"\u0433\u0440\u0443\u043f\u043f\u044b","frame_none":"\u043d\u0435\u0442",frame:"\u041a\u0430\u0434\u0440",caption:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b","missing_scope":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043b\u043e\u043b\u0432\u043a\u0430? \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c.","cell_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u044f\u0447\u0435\u0435\u043a.","row_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u0441\u0442\u0440\u043e\u043a.","col_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u043a\u043e\u043b\u043e\u043d\u043e\u043a.",colgroup:"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432",rowgroup:"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u0440\u043e\u043a",scope:"\u041e\u0431\u043b\u0430\u0441\u0442\u044c",tfoot:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435",tbody:"\u0422\u0435\u043b\u043e",thead:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","row_all":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_even":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_odd":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_row":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443","cell_all":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","cell_row":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435","cell_cell":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443",th:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",td:"\u0414\u0430\u043d\u043d\u044b\u0435",summary:"\u041e\u0431\u0449\u0435\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",mime:"MIME \u0442\u0438\u043f \u0446\u0435\u043b\u0438",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0418\u043c\u044f","merge_cells_title":"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438",bgcolor:"\u0426\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438",bordercolor:"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",valign:"\u0412\u0435\u0440\u0442. \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","cell_type":"\u0422\u0438\u043f","cell_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438","row_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438","align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_default":"\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",cellpadding:"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445",cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438",rows:"\u0421\u0442\u0440\u043e\u043a\u0438",cols:"\u0421\u0442\u043e\u043b\u0431\u0446\u044b",height:"\u0412\u044b\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b",rowtype:"\u0422\u0438\u043f \u0441\u0442\u0440\u043e\u043a\u0438","advanced_props":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","general_props":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","advanced_tab":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","general_tab":"\u041e\u0431\u0449\u0435\u0435","cell_col":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435"}); From 7134e80c441c79d1cb62d9d5a43d25547507105a Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:27:31 +0700 Subject: [PATCH 49/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/template/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/template/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/template/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/template/langs/ru_dlg.js new file mode 100644 index 0000000000..7122e95c8c --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/template/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.template_dlg',{title:"\u0428\u0430\u0431\u043b\u043e\u043d\u044b",label:"\u0428\u0430\u0431\u043b\u043e\u043d","desc_label":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",select:"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d",preview:"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",warning:"\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043c \u0434\u0430\u043d\u043d\u044b\u0445/","mdate_format":"%Y.%m.%d %H:%M:%S","cdate_format":"%Y.%m.%d %H:%M:%S","months_long":"\u044f\u043d\u0432\u0430\u0440\u044c,\u0444\u0435\u0432\u0440\u0430\u043b\u044c,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440\u0435\u043b\u044c,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433\u0443\u0441\u0442,\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c,\u043e\u043a\u0442\u044f\u0431\u0440\u044c,\u043d\u043e\u044f\u0431\u0440\u044c,\u0434\u0435\u043a\u0430\u0431\u0440\u044c","months_short":"\u044f\u043d\u0432,\u0444\u0435\u0432,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433,\u0441\u0435\u043d,\u043e\u043a\u0442,\u043d\u043e\u044f,\u0434\u0435\u043a","day_long":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435,\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a,\u0432\u0442\u043e\u0440\u043d\u0438\u043a,\u0441\u0440\u0435\u0434\u0430,\u0447\u0435\u0442\u0432\u0435\u0440\u0433,\u043f\u044f\u0442\u043d\u0438\u0446\u0443,\u0441\u0443\u0431\u0431\u043e\u0442\u0430,\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","day_short":"\u0432\u0441,\u043f\u043d,\u0432\u0442,\u0441\u0440,\u0447\u0442,\u043f\u0442,\u0441\u0431,\u0432\u0441"}); From 5dd14723e9a75b5dfa91a2f7f4d8e4e821fb6a38 Mon Sep 17 00:00:00 2001 From: Alexander Bryukhov Date: Mon, 22 Jul 2013 10:29:12 +0700 Subject: [PATCH 50/85] tinyMCE internal language pack - RU --- .../umbraco_client/tinymce3/plugins/xhtmlxtras/langs/ru_dlg.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/xhtmlxtras/langs/ru_dlg.js diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/xhtmlxtras/langs/ru_dlg.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/xhtmlxtras/langs/ru_dlg.js new file mode 100644 index 0000000000..c7ad710df7 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/xhtmlxtras/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.xhtmlxtras_dlg',{"attribs_title":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","option_rtl":"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","option_ltr":"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e","insert_date":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443/\u0432\u0440\u0435\u043c\u044f",remove:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","title_cite_element":"\u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","title_abbr_element":"\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","title_acronym_element":"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0446\u0438\u044f","title_del_element":"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435","title_ins_element":"\u0417\u0430\u043c\u0435\u043d\u0430","fieldset_events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_attrib_tab":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_general_tab":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b","general_tab":"\u041e\u0431\u0449\u0435\u0435","attribute_attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b","attribute_events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","attribute_label_accesskey":"\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430","attribute_label_tabindex":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","attribute_label_langcode":"\u042f\u0437\u044b\u043a","attribute_option_rtl":"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","attribute_option_ltr":"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e","attribute_label_langdir":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","attribute_label_datetime":"\u0414\u0430\u0442\u0430/\u0412\u0440\u0435\u043c\u044f","attribute_label_cite":"\u0426\u0438\u0442\u0430\u0442\u0430","attribute_label_style":"\u0421\u0442\u0438\u043b\u044c","attribute_label_class":"\u041a\u043b\u0430\u0441\u0441","attribute_label_id":"\u0418\u043c\u044f","attribute_label_title":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a"}); From 8b7bbed1b5cf142c714607d9cdc5e3774ff0bb3f Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 15:18:10 +1000 Subject: [PATCH 51/85] Implemented YSOD overlay when an unhandled server exception is thrown, this also ensures only when debug=true in the web.config which is injected into the server vars. --- .../common/mocks/umbraco.servervariables.js | 3 +- .../src/common/services/dialog.service.js | 21 +++++++++++ .../src/common/services/util.service.js | 27 +++++++++----- .../src/less/modals.less | 36 +++++++++++++++++++ .../views/common/dialogs/ysod.controller.js | 22 ++++++++++++ .../src/views/common/dialogs/ysod.html | 28 +++++++++++++++ .../Editors/BackOfficeController.cs | 3 +- src/Umbraco.Web/Editors/ContentController.cs | 3 +- 8 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js index 79b52c4cca..bd8c505a3d 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js @@ -16,5 +16,6 @@ Umbraco.Sys.ServerVariables = { }, umbracoSettings: { "umbracoPath": "/umbraco" - } + }, + isDebuggingEnabled: true }; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js index ed6fd2fcfa..5ffd67efad 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js @@ -340,6 +340,27 @@ angular.module('umbraco.services') template: 'views/common/dialogs/property.html', show: true }); + }, + + /** + * @ngdoc method + * @name umbraco.services.dialogService#ysodDialog + * @methodOf umbraco.services.dialogService + * + * @description + * Opens a dialog to show a custom YSOD + */ + ysodDialog: function (ysodError) { + + var newScope = $rootScope.$new(); + newScope.error = ysodError; + return openDialog({ + modalClass: "umb-modal wide", + scope: newScope, + //callback: options.callback, + template: 'views/common/dialogs/ysod.html', + show: true + }); } }; }]); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 24e258f0ab..7781dc83eb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -257,7 +257,7 @@ angular.module('umbraco.services').factory('umbImageHelper', umbImageHelper); * @name umbraco.services.umbRequestHelper * @description A helper object used for sending requests to the server **/ -function umbRequestHelper($http, $q, umbDataFormatter, angularHelper) { +function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogService) { return { /** @@ -319,7 +319,7 @@ function umbRequestHelper($http, $q, umbDataFormatter, angularHelper) { (!queryStrings ? "" : "?" + (angular.isString(queryStrings) ? queryStrings : this.dictionaryToQueryString(queryStrings))); }, - + /** * @ngdoc function * @name umbraco.services.umbRequestHelper#resourcePromise @@ -378,14 +378,23 @@ function umbRequestHelper($http, $q, umbDataFormatter, angularHelper) { //invoke the callback var result = callbacks.error.apply(this, [data, status, headers, config]); - //when there's an erorr... - // TODO: Deal with the error in a global way + //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. + if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { - //return an error object including the error message for UI - deferred.reject({ - errorMsg: result.errorMsg, - data: result.data - }); + dialogService.ysodDialog({ + errorMsg: result.errorMsg, + data: result.data + }); + } + else { + + //return an error object including the error message for UI + deferred.reject({ + errorMsg: result.errorMsg, + data: result.data + }); + + } }); diff --git a/src/Umbraco.Web.UI.Client/src/less/modals.less b/src/Umbraco.Web.UI.Client/src/less/modals.less index 89f761f4a0..152702b4d0 100644 --- a/src/Umbraco.Web.UI.Client/src/less/modals.less +++ b/src/Umbraco.Web.UI.Client/src/less/modals.less @@ -95,6 +95,10 @@ } +.umb-modal.fade.in.wide { + margin-left: -640px; + width: 640px !important; +} /* MEDIA PICKER */ .umb-modal .umb-btn-toolbar { @@ -173,3 +177,35 @@ .umb-modal .thumbnails > li.folder a:hover { text-decoration: none } + + +/* YSOD */ + +/* These styles are an exact replica of a real .Net YSOD */ +.umb-modal .ysod { + font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;padding:5px; +} +.umb-modal .ysod > div { + font-family: Arial, Helvetica, Geneva, SunSans-Regular, sans-serif; + line-height: 13px; + font-size: 11px; +} +.umb-modal .ysod hr { + margin: 0px; + color: silver; + background-color: silver; + height: 1px; +} +.umb-modal .ysod p {font-family:"Verdana";font-weight:normal;color:black;} +.umb-modal .ysod b {font-family:"Verdana";font-weight:bold;color:black;} +.umb-modal .ysod h1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red;padding: 0px;text-transform: none !important;margin: 0px; } +.umb-modal .ysod h2 { font-style:italic; font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon; } +.umb-modal .ysod pre {border:none;font-family:"Consolas","Lucida Console",Monospace;font-size:13px;margin:0;padding:0.5em;line-height:17px;} +.umb-modal .ysod .marker {font-weight: bold; color: black;text-decoration: none;} +.umb-modal .ysod .version {color: gray;} +.umb-modal .ysod .error {margin-bottom: 10px;} +.umb-modal .ysod .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:pointer; } +.umb-modal .ysod table {background-color:#ffffcc;width:100%;} +.umb-modal .ysod table pre {background-color: inherit;} +.umb-modal .ysod table code {background-color: inherit;} +.umb-modal .ysod a.btn { margin-top:10px;margin-right:10px;float:right;} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.controller.js new file mode 100644 index 0000000000..46abf5c88a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.controller.js @@ -0,0 +1,22 @@ +/** + * @ngdoc controller + * @name Umbraco.Dialogs.LegacyDeleteController + * @function + * + * @description + * The controller for deleting content + */ +function YsodController($scope, legacyResource, treeService, navigationService) { + + if ($scope.error && $scope.error.data && $scope.error.data.StackTrace) { + //trim whitespace + $scope.error.data.StackTrace = $scope.error.data.StackTrace.trim(); + } + + $scope.closeDialog = function() { + $scope.dismiss(); + }; + +} + +angular.module("umbraco").controller("Umbraco.Dialogs.YsodController", YsodController); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html new file mode 100644 index 0000000000..2ad93bb30a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html @@ -0,0 +1,28 @@ +
+ + Close + +

{{error.errorMsg}}

+
+

{{error.data.ExceptionMessage}}

+
+ Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. +
+
+ Exception Details: {{error.data.ExceptionType}}: {{error.data.ExceptionMessage}} +
+
+ Stack Trace: +
+
+ + + + + +
+
{{error.data.StackTrace}}
+
+ +
+
diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 116a941212..7383d2b806 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -68,7 +68,8 @@ namespace Umbraco.Web.Editors { {"umbracoPath", GlobalSettings.Path} } - } + }, + { "isDebuggingEnabled", HttpContext.IsDebuggingEnabled } }; return JavaScript(ServerVariablesParser.Parse(d)); diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index da3c81b2b3..2671ab66fe 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; From b9d0bca1b6d0e2abc2fea7f66a0e41b046733cd9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 17:13:38 +1000 Subject: [PATCH 52/85] Fixed up validation messages when we are not redirecting, fixed up how we re-bind the content values to make sure we only set the values if they have been changed by the server and added unit tests for that. Added more properties to our display model including a new INotificationModel to put localized notifications in. --- .../src/common/services/util.service.js | 122 +++++++++++++++--- .../views/content/contentedit.controller.js | 36 +++--- .../services/content-editing-helper.spec.js | 34 ++++- src/Umbraco.Web/Editors/ContentController.cs | 37 +++++- .../ContentEditing/ContentItemDisplay.cs | 14 +- 5 files changed, 202 insertions(+), 41 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 7781dc83eb..e760873c72 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -678,11 +678,67 @@ angular.module('umbraco.services').factory('iconHelper', iconHelper); function contentEditingHelper($location, $routeParams, notificationsService, serverValidationManager) { return { - + + /** + * @ngdoc function + * @name getAllProps + * @methodOf contentEditingHelper + * @function + * + * @description + * Returns all propertes contained for the content item (since the normal model has properties contained inside of tabs) + */ + getAllProps: function(content) { + var allProps = []; + + for (var i = 0; i < content.tabs.length; i++) { + for (var p = 0; p < content.tabs[i].properties.length; p++) { + allProps.push(content.tabs[i].properties[p]); + } + } + + return allProps; + }, + + /** + * @ngdoc function + * @name reBindChangedProperties + * @methodOf contentEditingHelper + * @function + * + * @description + * re-binds all changed property values to the origContent object from the newContent object and returns an array of changed properties. + */ + reBindChangedProperties: function(origContent, newContent) { + + var changed = []; + + //get a list of properties since they are contained in tabs + var allOrigProps = this.getAllProps(origContent); + var allNewProps = this.getAllProps(newContent); + + function getNewProp(alias) { + return _.find(allNewProps, function(item) { + return item.alias === alias; + }); + } + + for (var p in allOrigProps) { + var newProp = getNewProp(allOrigProps[p].alias); + if (!_.isEqual(allOrigProps[p].value, newProp.value)) { + //they have changed so set the origContent prop's value to the new value + allOrigProps[p].value = newProp.value; + changed.push(allOrigProps[p]); + } + } + + return changed; + }, + /** * @ngdoc function * @name handleValidationErrors - * @methodOf ContentEditController + * @methodOf contentEditingHelper * @function * * @description @@ -692,13 +748,7 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser */ handleValidationErrors: function (content, modelState) { //get a list of properties since they are contained in tabs - var allProps = []; - - for (var i = 0; i < content.tabs.length; i++) { - for (var p = 0; p < content.tabs[i].properties.length; p++) { - allProps.push(content.tabs[i].properties[p]); - } - } + var allProps = this.getAllProps(content); //find the content property for the current error, for use in the loop below function findContentProp(props, propAlias) { @@ -744,13 +794,13 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser /** * @ngdoc function * @name handleSaveError - * @methodOf ContentEditController + * @methodOf contentEditingHelper * @function * * @description * A function to handle what happens when we have validation issues from the server side */ - handleSaveError: function (err) { + handleSaveError: function (err, scope) { //When the status is a 403 status, we have validation errors. //Otherwise the error is probably due to invalid data (i.e. someone mucking around with the ids or something). //Or, some strange server error @@ -762,9 +812,10 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser if (!this.redirectToCreatedContent(err.data.id, err.data.ModelState)) { //we are not redirecting because this is not new content, it is existing content. In this case - // we need to clear the server validation items. When we are creating new content we cannot clear - // the server validation items because we redirect and they need to persist until the validation is re-bound. - serverValidationManager.clear(); + // we need to detect what properties have changed and re-bind them with the server data. Then we need + // to re-bind any server validation errors after the digest takes place. + this.reBindChangedProperties(scope.content, err.data); + serverValidationManager.executeAndClearAllSubscriptions(); } //indicates we've handled the server result @@ -783,10 +834,51 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser return false; }, + /** + * @ngdoc function + * @name handleSaveError + * @methodOf handleSuccessfulSave + * @function + * + * @description + * A function to handle when saving a content item is successful. This will rebind the values of the model that have changed + * ensure the notifications are displayed and that the appropriate events are fired. This will also check if we need to redirect + * when we're creating new content. + */ + handleSuccessfulSave: function (args) { + + if (!args) { + throw "args cannot be null"; + } + if (!args.scope) { + throw "args.scope cannot be null"; + } + if (!args.scope.content) { + throw "args.scope.content cannot be null"; + } + if (!args.newContent) { + throw "args.newContent cannot be null"; + } + if (!args.notifyHeader) { + throw "args.notifyHeader cannot be null"; + } + if (!args.notifyMsg) { + throw "args.notifyMsg cannot be null"; + } + + notificationsService.success(args.notifyHeader, args.notifyMsg); + args.scope.$broadcast("saved", { scope: args.scope }); + if (!this.redirectToCreatedContent(args.scope.content.id)) { + //we are not redirecting because this is not new content, it is existing content. In this case + // we need to detect what properties have changed and re-bind them with the server data + this.reBindChangedProperties(args.scope.content, args.newContent); + } + }, + /** * @ngdoc function * @name redirectToCreatedContent - * @methodOf ContentEditController + * @methodOf contentEditingHelper * @function * * @description diff --git a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js index b24c35e0db..bc7fc67cde 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js @@ -60,17 +60,14 @@ function ContentEditController($scope, $routeParams, $location, contentResource, contentResource.publishContent(cnt, $routeParams.create, $scope.files) .then(function (data) { - //TODO: only update the content that has changed! - $scope.content = data; - - notificationsService.success("Published", "Content has been saved and published"); - $scope.$broadcast("saved", { scope: $scope }); - - contentEditingHelper.redirectToCreatedContent($scope.content.id); - }, function (err) { - //TODO: only update the content that has changed! - //$scope.content = err.data; - contentEditingHelper.handleSaveError(err); + contentEditingHelper.handleSuccessfulSave({ + scope: $scope, + newContent: data, + notifyHeader: "Published", + notifyMsg: "Content has been saved and published" + }); + }, function (err) { + contentEditingHelper.handleSaveError(err, $scope); }); }; @@ -85,17 +82,14 @@ function ContentEditController($scope, $routeParams, $location, contentResource, contentResource.saveContent(cnt, $routeParams.create, $scope.files) .then(function (data) { - //TODO: only update the content that has changed! - $scope.content = data; - - notificationsService.success("Saved", "Content has been saved"); - $scope.$broadcast("saved", { scope: $scope }); - - contentEditingHelper.redirectToCreatedContent($scope.content.id); + contentEditingHelper.handleSuccessfulSave({ + scope: $scope, + newContent: data, + notifyHeader: "Saved", + notifyMsg: "Content has been saved" + }); }, function (err) { - //TODO: only update the content that has changed! - //$scope.content = err.data; - contentEditingHelper.handleSaveError(err); + contentEditingHelper.handleSaveError(err, $scope); }); }; diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js index e52bdd3f7e..8b35033e2a 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js @@ -25,7 +25,7 @@ describe('contentEditingHelper tests', function () { err.data.ModelState = {}; //act - var handled = contentEditingHelper.handleSaveError(err); + var handled = contentEditingHelper.handleSaveError(err, {content: content}); //assert expect(handled).toBe(true); @@ -39,7 +39,7 @@ describe('contentEditingHelper tests', function () { }; //act - var handled = contentEditingHelper.handleSaveError(err); + var handled = contentEditingHelper.handleSaveError(err, null); //assert expect(handled).toBe(false); @@ -55,7 +55,7 @@ describe('contentEditingHelper tests', function () { }; //act - var handled = contentEditingHelper.handleSaveError(err); + var handled = contentEditingHelper.handleSaveError(err, { content: content }); //assert expect(handled).toBe(false); @@ -183,4 +183,32 @@ describe('contentEditingHelper tests', function () { }); }); + + describe('wires up property values after saving', function () { + + it('does not update un-changed values', function () { + + //arrange + var origContent = mocksUtils.getMockContent(1234); + origContent.tabs[0].properties[0].value = { complex1: "origValue1a", complex2: "origValue1b" }; + origContent.tabs[1].properties[0].value = "origValue2"; + origContent.tabs[1].properties[1].value = "origValue3"; + origContent.tabs[1].properties[2].value = "origValue4"; + + var newContent = mocksUtils.getMockContent(1234); + newContent.tabs[0].properties[0].value = { complex1: "origValue1a", complex2: "newValue1b" }; + newContent.tabs[1].properties[0].value = "origValue2"; + newContent.tabs[1].properties[1].value = "newValue3"; + newContent.tabs[1].properties[2].value = "origValue4"; + + //act + var changed = contentEditingHelper.reBindChangedProperties(origContent, newContent); + + //assert + expect(changed.length).toBe(2); + expect(changed[0].alias).toBe("list"); + expect(changed[1].alias).toBe("textarea"); + }); + + }); }); \ No newline at end of file diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 2671ab66fe..6a8807e886 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -18,6 +18,7 @@ using Umbraco.Web.Security; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; +using umbraco; namespace Umbraco.Web.Editors { @@ -113,6 +114,8 @@ namespace Umbraco.Web.Editors contentItem.PersistedContent.Name = contentItem.Name; } + //TODO: We need to support 'send to publish' + //TODO: We'll need to save the new template, publishat, etc... values here //Map the property values @@ -173,6 +176,7 @@ namespace Umbraco.Web.Editors } } + bool isPublishSuccess = false; if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) { //save the item @@ -181,7 +185,7 @@ namespace Umbraco.Web.Editors else { //publish the item - Services.ContentService.SaveAndPublish(contentItem.PersistedContent); + isPublishSuccess = Services.ContentService.SaveAndPublish(contentItem.PersistedContent); } @@ -194,6 +198,37 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, display)); } + //put the correct msgs in + switch (contentItem.Action) + { + case ContentSaveAction.Save: + case ContentSaveAction.SaveNew: + display.AddSuccessNotification(ui.Text("speechBubbles", "editContentSavedHeader"), ui.Text("speechBubbles", "editContentSavedText")); + break; + case ContentSaveAction.Publish: + case ContentSaveAction.PublishNew: + + //If the document is at a level deeper than the root but it's ancestor's path is not published, + //it means that we cannot actually publish this document because one of it's parent's is not published. + //So, we still need to save the document but we'll show a different notification. + if (contentItem.PersistedContent.Level > 1 && !Services.ContentService.IsPublishable(contentItem.PersistedContent)) + { + display.AddWarningNotification(ui.Text("publish"), ui.Text("speechBubbles", "editContentPublishedFailedByParent")); + } + else + { + if (isPublishSuccess) + { + display.AddSuccessNotification(ui.Text("speechBubbles", "editContentPublishedHeader"), ui.Text("speechBubbles", "editContentPublishedText")); + } + else + { + display.AddWarningNotification(ui.Text("publish"), ui.Text("speechBubbles", "contentPublishedFailedByEvent")); + } + } + break; + } + return display; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index a5856a1763..b179072677 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Runtime.Serialization; using System.Web.Http; using System.Web.Http.ModelBinding; @@ -12,8 +13,13 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be displayed in the back office ///
[DataContract(Name = "content", Namespace = "")] - public class ContentItemDisplay : TabbedContentItem + public class ContentItemDisplay : TabbedContentItem, INotificationModel { + public ContentItemDisplay() + { + Notifications = new List(); + } + [DataMember(Name = "publishDate")] public DateTime? PublishDate { get; set; } @@ -29,5 +35,11 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "ModelState")] public IDictionary Errors { get; set; } + /// + /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. + /// + [DataMember(Name = "notifications")] + public List Notifications { get; private set; } + } } \ No newline at end of file From ae2ed170501a2e72e194970804b6cd97033468fd Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 17:13:56 +1000 Subject: [PATCH 53/85] missing files. --- .../ContentEditing/INotificationModel.cs | 12 ++++ .../ContentEditing/MessagesExtensions.cs | 57 +++++++++++++++++++ .../Models/ContentEditing/Notification.cs | 16 ++++++ src/Umbraco.Web/Umbraco.Web.csproj | 3 + 4 files changed, 88 insertions(+) create mode 100644 src/Umbraco.Web/Models/ContentEditing/INotificationModel.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/MessagesExtensions.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/Notification.cs diff --git a/src/Umbraco.Web/Models/ContentEditing/INotificationModel.cs b/src/Umbraco.Web/Models/ContentEditing/INotificationModel.cs new file mode 100644 index 0000000000..2ffd10d8b6 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/INotificationModel.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Umbraco.Web.Models.ContentEditing +{ + public interface INotificationModel + { + /// + /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. + /// + List Notifications { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/MessagesExtensions.cs b/src/Umbraco.Web/Models/ContentEditing/MessagesExtensions.cs new file mode 100644 index 0000000000..87371c8551 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/MessagesExtensions.cs @@ -0,0 +1,57 @@ +using Umbraco.Web.UI; + +namespace Umbraco.Web.Models.ContentEditing +{ + public static class MessagesExtensions + { + public static void AddNotification(this INotificationModel model, string header, string msg, SpeechBubbleIcon type) + { + model.Notifications.Add(new Notification() + { + Header = header, + Message = msg, + NotificationType = type + }); + } + + public static void AddSuccessNotification(this INotificationModel model, string header, string msg) + { + model.Notifications.Add(new Notification() + { + Header = header, + Message = msg, + NotificationType = SpeechBubbleIcon.Success + }); + } + + public static void AddErrorNotification(this INotificationModel model, string header, string msg) + { + model.Notifications.Add(new Notification() + { + Header = header, + Message = msg, + NotificationType = SpeechBubbleIcon.Error + }); + } + + public static void AddWarningNotification(this INotificationModel model, string header, string msg) + { + model.Notifications.Add(new Notification() + { + Header = header, + Message = msg, + NotificationType = SpeechBubbleIcon.Warning + }); + } + + public static void AddInfoNotification(this INotificationModel model, string header, string msg) + { + model.Notifications.Add(new Notification() + { + Header = header, + Message = msg, + NotificationType = SpeechBubbleIcon.Info + }); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/Notification.cs b/src/Umbraco.Web/Models/ContentEditing/Notification.cs new file mode 100644 index 0000000000..c5c5634442 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/Notification.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; +using Umbraco.Web.UI; + +namespace Umbraco.Web.Models.ContentEditing +{ + [DataContract(Name = "notification", Namespace = "")] + public class Notification + { + [DataMember(Name = "header")] + public string Header { get; set; } + [DataMember(Name = "message")] + public string Message { get; set; } + [DataMember(Name = "type")] + public SpeechBubbleIcon NotificationType { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 4b0088854d..9bbd85616f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -308,7 +308,10 @@ + + + From feb1892e9e89f823d265712c49b5dde555aaf43d Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 18:16:50 +1000 Subject: [PATCH 54/85] Gets notification msgs on the server side to be displayed. Fixes property existence checking... was checking on id before but that is incorrect, needs to be on alias since a new property id is gen'd on each save and we're not re-wiring them back up. Fixes YSOD messaging for content as well. Changes the ModelState to modelState to be consistent in js. --- .../common/services/notifications.service.js | 50 +++++++++++++++++- .../src/common/services/util.service.js | 51 +++++++++++-------- .../src/views/common/dialogs/ysod.html | 2 +- .../views/content/contentedit.controller.js | 4 +- .../services/content-editing-helper.spec.js | 2 +- src/Umbraco.Web/Editors/ContentController.cs | 2 +- .../ContentEditing/ContentItemDisplay.cs | 2 +- .../ContentEditing/ContentPropertyBasic.cs | 17 ------- src/Umbraco.Web/UI/SpeechBubbleIcon.cs | 10 ++-- .../Filters/ContentItemValidationHelper.cs | 14 +++-- 10 files changed, 97 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js b/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js index e90ff8a244..0456612104 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js @@ -42,7 +42,55 @@ angular.module('umbraco.services') } return { - /** + + /** + * @ngdoc method + * @name umbraco.services.notificationsService#showNotification + * @methodOf umbraco.services.notificationsService + * + * @description + * Shows a notification based on the object passed in, normally used to render notifications sent back from the server + * + * @returns {Object} args notification object + */ + showNotification: function(args) { + if (!args) { + throw "args cannot be null"; + } + if (!args.type) { + throw "args.type cannot be null"; + } + if (!args.header) { + throw "args.header cannot be null"; + } + if (!args.message) { + throw "args.message cannot be null"; + } + switch(args.type) { + case 0: + //save + this.success(args.header, args.message); + break; + case 1: + //info + this.success(args.header, args.message); + break; + case 2: + //error + this.error(args.header, args.message); + break; + case 3: + //success + this.success(args.header, args.message); + break; + case 4: + //warning + this.warning(args.header, args.message); + break; + } + }, + + /** * @ngdoc method * @name umbraco.services.notificationsService#success * @methodOf umbraco.services.notificationsService diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index e760873c72..32f97895b4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -441,12 +441,24 @@ function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogServ function (data, status, headers, config) { //failure callback - deferred.reject({ - data: data, - status: status, - headers: headers, - config: config - }); + //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. + if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { + + dialogService.ysodDialog({ + errorMsg: 'An error occurred', + data: data + }); + } + else { + + //return an error object including the error message for UI + deferred.reject({ + errorMsg: 'An error occurred', + data: data, + status: status + }); + } + }); return deferred.promise; @@ -675,7 +687,7 @@ angular.module('umbraco.services').factory('iconHelper', iconHelper); * @name umbraco.services.contentEditingHelper * @description A helper service for content controllers when editing/creating/saving content. **/ -function contentEditingHelper($location, $routeParams, notificationsService, serverValidationManager) { +function contentEditingHelper($location, $routeParams, notificationsService, serverValidationManager, dialogService) { return { @@ -742,7 +754,7 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser * @function * * @description - * A function to handle the validation (ModelState) errors collection which will happen on a 403 error indicating validation errors + * A function to handle the validation (modelState) errors collection which will happen on a 403 error indicating validation errors * It's worth noting that when a 403 occurs, the data is still saved just never published, though this depends on if the entity is a new * entity and whether or not the data fulfils the absolute basic requirements like having a mandatory Name. */ @@ -806,11 +818,11 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser //Or, some strange server error if (err.status === 403) { //now we need to look through all the validation errors - if (err.data && (err.data.ModelState)) { + if (err.data && (err.data.modelState)) { - this.handleValidationErrors(err.data, err.data.ModelState); + this.handleValidationErrors(err.data, err.data.modelState); - if (!this.redirectToCreatedContent(err.data.id, err.data.ModelState)) { + if (!this.redirectToCreatedContent(err.data.id, err.data.modelState)) { //we are not redirecting because this is not new content, it is existing content. In this case // we need to detect what properties have changed and re-bind them with the server data. Then we need // to re-bind any server validation errors after the digest takes place. @@ -821,14 +833,12 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser //indicates we've handled the server result return true; } - else { - //TODO: Implement an overlay showing the full YSOD like we had in v5 - notificationsService.error("Server error", err); + else { + dialogService.ysodDialog(err); } } else { - //TODO: Implement an overlay showing the full YSOD like we had in v5 - notificationsService.error("Validation failed", err); + dialogService.ysodDialog(err); } return false; @@ -859,14 +869,11 @@ function contentEditingHelper($location, $routeParams, notificationsService, ser if (!args.newContent) { throw "args.newContent cannot be null"; } - if (!args.notifyHeader) { - throw "args.notifyHeader cannot be null"; - } - if (!args.notifyMsg) { - throw "args.notifyMsg cannot be null"; + + for (var i = 0; i < args.newContent.notifications.length;i++) { + notificationsService.showNotification(args.newContent.notifications[i]); } - notificationsService.success(args.notifyHeader, args.notifyMsg); args.scope.$broadcast("saved", { scope: args.scope }); if (!this.redirectToCreatedContent(args.scope.content.id)) { //we are not redirecting because this is not new content, it is existing content. In this case diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html index 2ad93bb30a..a096546090 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/ysod.html @@ -4,7 +4,7 @@

{{error.errorMsg}}


-

{{error.data.ExceptionMessage}}

+

{{error.data.ExceptionMessage || error.data.Message}}

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js index bc7fc67cde..9bbc78d338 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js @@ -62,9 +62,7 @@ function ContentEditController($scope, $routeParams, $location, contentResource, .then(function (data) { contentEditingHelper.handleSuccessfulSave({ scope: $scope, - newContent: data, - notifyHeader: "Published", - notifyMsg: "Content has been saved and published" + newContent: data }); }, function (err) { contentEditingHelper.handleSaveError(err, $scope); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js index 8b35033e2a..dee7d6dfcf 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js @@ -22,7 +22,7 @@ describe('contentEditingHelper tests', function () { data: content, status: 403 }; - err.data.ModelState = {}; + err.data.modelState = {}; //act var handled = contentEditingHelper.handleSaveError(err, {content: content}); diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 6a8807e886..be8cff37e7 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -184,7 +184,7 @@ namespace Umbraco.Web.Editors } else { - //publish the item + //publish the item and check if it worked, if not we will show a diff msg below isPublishSuccess = Services.ContentService.SaveAndPublish(contentItem.PersistedContent); } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index b179072677..4e4f403760 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.Models.ContentEditing /// still save the item but it cannot be published. So we need a way of returning validation errors as well as the /// updated model. /// - [DataMember(Name = "ModelState")] + [DataMember(Name = "modelState")] public IDictionary Errors { get; set; } /// diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs index f439eadf79..237d75939c 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs @@ -20,22 +20,5 @@ namespace Umbraco.Web.Models.ContentEditing [Required(AllowEmptyStrings = false)] public string Alias { get; set; } - protected bool Equals(ContentPropertyBasic other) - { - return Id == other.Id; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - var other = obj as ContentPropertyBasic; - return other != null && Equals(other); - } - - public override int GetHashCode() - { - return Id; - } } } \ No newline at end of file diff --git a/src/Umbraco.Web/UI/SpeechBubbleIcon.cs b/src/Umbraco.Web/UI/SpeechBubbleIcon.cs index ae76f48cfe..2dd0d4946a 100644 --- a/src/Umbraco.Web/UI/SpeechBubbleIcon.cs +++ b/src/Umbraco.Web/UI/SpeechBubbleIcon.cs @@ -10,22 +10,22 @@ namespace Umbraco.Web.UI /// /// Save icon /// - Save, + Save = 0, /// /// Info icon /// - Info, + Info = 1, /// /// Error icon /// - Error, + Error = 2, /// /// Success icon /// - Success, + Success = 3, /// /// Warning icon /// - Warning + Warning = 4 } } diff --git a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs b/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs index ff85558cad..d819dd9d17 100644 --- a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs +++ b/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http.Controllers; @@ -80,16 +81,19 @@ namespace Umbraco.Web.WebApi.Filters /// private bool ValidateProperties(ContentItemBasic postedItem, HttpActionContext actionContext) { + //ensure the property actually exists in our server side properties + //var propertyAliases = postedItem.ContentDto.Properties.Select(x => x.Alias).ToArray(); + foreach (var p in postedItem.Properties) { - //ensure the property actually exists in our server side properties - if (postedItem.ContentDto.Properties.Contains(p) == false) + //if (propertyAliases.Contains(p.Alias) == false) + if (postedItem.PersistedContent.Properties[p.Alias] == null) { //TODO: Do we return errors here ? If someone deletes a property whilst their editing then should we just //save the property data that remains? Or inform them they need to reload... not sure. This problem exists currently too i think. - var message = string.Format("property with id: {0} was not found", p.Id); - actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, message); + var message = string.Format("property with alias: {0} was not found", p.Alias); + actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, new InvalidOperationException(message)); return false; } } From b565a3468b2c8424d81d76ae9e23dc16d4665356 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 22 Jul 2013 18:40:02 +1000 Subject: [PATCH 55/85] Moves larger util classes to their own files, fixes up the notification service to ensure notifications go away properly. --- .../lib/umbraco/Extensions.js | 20 +- .../services/contenteditinghelper.service.js | 236 ++++++++ .../common/services/notifications.service.js | 46 +- .../services/umbrequesthelper.service.js | 269 ++++++++++ .../src/common/services/util.service.js | 507 ------------------ .../views/content/contentedit.controller.js | 4 +- .../umbraco/lib/Umbraco/Extensions.js | 20 +- 7 files changed, 552 insertions(+), 550 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js create mode 100644 src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js diff --git a/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js b/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js index 4f2494d3a7..e19438d3ef 100644 --- a/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js +++ b/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js @@ -3,16 +3,16 @@ //extensions to base classes such as String and extension methods for jquery. //NOTE: jquery must be loaded before this file. - //create guid object on the window (which makes it global) - if (window.Guid == null) { - window.Guid = { - generate: function () { - ///generates a new Guid - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - } + + + //create guid method on the String + if (String.CreateGuid == null) { + String.CreateGuid = function () { + ///generates a new Guid + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); }; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js new file mode 100644 index 0000000000..e2cac02d83 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -0,0 +1,236 @@ + +/** +* @ngdoc service +* @name umbraco.services.contentEditingHelper +* @description A helper service for content controllers when editing/creating/saving content. +**/ +function contentEditingHelper($location, $routeParams, notificationsService, serverValidationManager, dialogService) { + + return { + + /** + * @ngdoc function + * @name getAllProps + * @methodOf contentEditingHelper + * @function + * + * @description + * Returns all propertes contained for the content item (since the normal model has properties contained inside of tabs) + */ + getAllProps: function (content) { + var allProps = []; + + for (var i = 0; i < content.tabs.length; i++) { + for (var p = 0; p < content.tabs[i].properties.length; p++) { + allProps.push(content.tabs[i].properties[p]); + } + } + + return allProps; + }, + + /** + * @ngdoc function + * @name reBindChangedProperties + * @methodOf contentEditingHelper + * @function + * + * @description + * re-binds all changed property values to the origContent object from the newContent object and returns an array of changed properties. + */ + reBindChangedProperties: function (origContent, newContent) { + + var changed = []; + + //get a list of properties since they are contained in tabs + var allOrigProps = this.getAllProps(origContent); + var allNewProps = this.getAllProps(newContent); + + function getNewProp(alias) { + return _.find(allNewProps, function (item) { + return item.alias === alias; + }); + } + + for (var p in allOrigProps) { + var newProp = getNewProp(allOrigProps[p].alias); + if (!_.isEqual(allOrigProps[p].value, newProp.value)) { + //they have changed so set the origContent prop's value to the new value + allOrigProps[p].value = newProp.value; + changed.push(allOrigProps[p]); + } + } + + return changed; + }, + + /** + * @ngdoc function + * @name handleValidationErrors + * @methodOf contentEditingHelper + * @function + * + * @description + * A function to handle the validation (modelState) errors collection which will happen on a 403 error indicating validation errors + * It's worth noting that when a 403 occurs, the data is still saved just never published, though this depends on if the entity is a new + * entity and whether or not the data fulfils the absolute basic requirements like having a mandatory Name. + */ + handleValidationErrors: function (content, modelState) { + //get a list of properties since they are contained in tabs + var allProps = this.getAllProps(content); + + //find the content property for the current error, for use in the loop below + function findContentProp(props, propAlias) { + return _.find(props, function (item) { + return (item.alias === propAlias); + }); + } + + for (var e in modelState) { + //the alias in model state can be in dot notation which indicates + // * the first part is the content property alias + // * the second part is the field to which the valiation msg is associated with + //There will always be at least 2 parts since all model errors for properties are prefixed with "Properties" + var parts = e.split("."); + if (parts.length > 1) { + var propertyAlias = parts[1]; + + //find the content property for the current error + var contentProperty = findContentProp(allProps, propertyAlias); + + if (contentProperty) { + //if it contains 2 '.' then we will wire it up to a property's field + if (parts.length > 2) { + //add an error with a reference to the field for which the validation belongs too + serverValidationManager.addPropertyError(contentProperty, parts[2], modelState[e][0]); + } + else { + //add a generic error for the property, no reference to a specific field + serverValidationManager.addPropertyError(contentProperty, "", modelState[e][0]); + } + } + } + else { + //the parts are only 1, this means its not a property but a native content property + serverValidationManager.addFieldError(parts[0], modelState[e][0]); + } + + //add to notifications + notificationsService.error("Validation", modelState[e][0]); + } + }, + + /** + * @ngdoc function + * @name handleSaveError + * @methodOf contentEditingHelper + * @function + * + * @description + * A function to handle what happens when we have validation issues from the server side + */ + handleSaveError: function (err, scope) { + //When the status is a 403 status, we have validation errors. + //Otherwise the error is probably due to invalid data (i.e. someone mucking around with the ids or something). + //Or, some strange server error + if (err.status === 403) { + //now we need to look through all the validation errors + if (err.data && (err.data.modelState)) { + + this.handleValidationErrors(err.data, err.data.modelState); + + if (!this.redirectToCreatedContent(err.data.id, err.data.modelState)) { + //we are not redirecting because this is not new content, it is existing content. In this case + // we need to detect what properties have changed and re-bind them with the server data. Then we need + // to re-bind any server validation errors after the digest takes place. + this.reBindChangedProperties(scope.content, err.data); + serverValidationManager.executeAndClearAllSubscriptions(); + } + + //indicates we've handled the server result + return true; + } + else { + dialogService.ysodDialog(err); + } + } + else { + dialogService.ysodDialog(err); + } + + return false; + }, + + /** + * @ngdoc function + * @name handleSaveError + * @methodOf handleSuccessfulSave + * @function + * + * @description + * A function to handle when saving a content item is successful. This will rebind the values of the model that have changed + * ensure the notifications are displayed and that the appropriate events are fired. This will also check if we need to redirect + * when we're creating new content. + */ + handleSuccessfulSave: function (args) { + + if (!args) { + throw "args cannot be null"; + } + if (!args.scope) { + throw "args.scope cannot be null"; + } + if (!args.scope.content) { + throw "args.scope.content cannot be null"; + } + if (!args.newContent) { + throw "args.newContent cannot be null"; + } + + for (var i = 0; i < args.newContent.notifications.length; i++) { + notificationsService.showNotification(args.newContent.notifications[i]); + } + + args.scope.$broadcast("saved", { scope: args.scope }); + if (!this.redirectToCreatedContent(args.scope.content.id)) { + //we are not redirecting because this is not new content, it is existing content. In this case + // we need to detect what properties have changed and re-bind them with the server data + this.reBindChangedProperties(args.scope.content, args.newContent); + } + }, + + /** + * @ngdoc function + * @name redirectToCreatedContent + * @methodOf contentEditingHelper + * @function + * + * @description + * Changes the location to be editing the newly created content after create was successful. + * We need to decide if we need to redirect to edito mode or if we will remain in create mode. + * We will only need to maintain create mode if we have not fulfilled the basic requirements for creating an entity which is at least having a name. + */ + redirectToCreatedContent: function (id, modelState) { + + //only continue if we are currently in create mode and if there is no 'Name' modelstate errors + // since we need at least a name to create content. + if ($routeParams.create && (!modelState || !modelState["Name"])) { + + //need to change the location to not be in 'create' mode. Currently the route will be something like: + // /belle/#/content/edit/1234?doctype=newsArticle&create=true + // but we need to remove everything after the query so that it is just: + // /belle/#/content/edit/9876 (where 9876 is the new id) + + //clear the query strings + $location.search(null); + //change to new path + $location.path("/" + $routeParams.section + "/" + $routeParams.method + "/" + id); + //don't add a browser history for this + $location.replace(); + return true; + } + return false; + } + }; +} +angular.module('umbraco.services').factory('contentEditingHelper', contentEditingHelper); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js b/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js index 0456612104..f21909b048 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/notifications.service.js @@ -26,19 +26,30 @@ angular.module('umbraco.services') var nArray = []; - function add(item) { - var index = nArray.length; - nArray.push(item); + function add(item) { + angularHelper.safeApply($rootScope, function () { + + //we need to ID the item, going by index isn't good enough because people can remove at different indexes + // whenever they want. Plus once we remove one, then the next index will be different. The only way to + // effectively remove an item is by an Id. + item.id = String.CreateGuid(); + + nArray.push(item); + + $timeout(function () { + var found = _.find(nArray, function(i) { + return i.id === item.id; + }); + if (found) { + var index = nArray.indexOf(found); + nArray.splice(index, 1); + } + + }, 7000); - $timeout(function () { - angularHelper.safeApply($rootScope, function () { - nArray.splice(index, 1); - }); - - }, 7000); - - return nArray[index]; + return item; + }); } return { @@ -104,9 +115,8 @@ angular.module('umbraco.services') * @returns {Object} notification object */ success: function (headline, message) { - angularHelper.safeApply($rootScope, function () { - return add({ headline: headline, message: message, type: 'success', time: new Date() }); - }); + return add({ headline: headline, message: message, type: 'success', time: new Date() }); + }, /** * @ngdoc method @@ -122,9 +132,7 @@ angular.module('umbraco.services') * @returns {Object} notification object */ error: function (headline, message) { - angularHelper.safeApply($rootScope, function() { - return add({ headline: headline, message: message, type: 'error', time: new Date() }); - }); + return add({ headline: headline, message: message, type: 'error', time: new Date() }); }, /** @@ -142,9 +150,7 @@ angular.module('umbraco.services') * @returns {Object} notification object */ warning: function (headline, message) { - angularHelper.safeApply($rootScope, function() { - return add({ headline: headline, message: message, type: 'warning', time: new Date() }); - }); + return add({ headline: headline, message: message, type: 'warning', time: new Date() }); }, /** diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js new file mode 100644 index 0000000000..6574f078a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js @@ -0,0 +1,269 @@ +/** +* @ngdoc service +* @name umbraco.services.umbRequestHelper +* @description A helper object used for sending requests to the server +**/ +function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogService) { + return { + + /** + * @ngdoc method + * @name umbraco.services.umbRequestHelper#dictionaryToQueryString + * @methodOf umbraco.services.umbRequestHelper + * @function + * + * @description + * This will turn an array of key/value pairs into a query string + * + * @param {Array} queryStrings An array of key/value pairs + */ + dictionaryToQueryString: function (queryStrings) { + + if (!angular.isArray(queryStrings)) { + throw "The queryString parameter is not an array of key value pairs"; + } + + return _.map(queryStrings, function (item) { + var key = null; + var val = null; + for (var k in item) { + key = k; + val = item[k]; + break; + } + if (key == null || val == null) { + throw "The object in the array was not formatted as a key/value pair"; + } + return key + "=" + val; + }).join("&"); + + }, + + /** + * @ngdoc method + * @name umbraco.services.umbRequestHelper#getApiUrl + * @methodOf umbraco.services.umbRequestHelper + * @function + * + * @description + * This will return the webapi Url for the requested key based on the servervariables collection + * + * @param {string} apiName The webapi name that is found in the servervariables["umbracoUrls"] dictionary + * @param {string} actionName The webapi action name + * @param {object} queryStrings Can be either a string or an array containing key/value pairs + */ + getApiUrl: function (apiName, actionName, queryStrings) { + if (!Umbraco || !Umbraco.Sys || !Umbraco.Sys.ServerVariables || !Umbraco.Sys.ServerVariables["umbracoUrls"]) { + throw "No server variables defined!"; + } + + if (!Umbraco.Sys.ServerVariables["umbracoUrls"][apiName]) { + throw "No url found for api name " + apiName; + } + + return Umbraco.Sys.ServerVariables["umbracoUrls"][apiName] + actionName + + (!queryStrings ? "" : "?" + (angular.isString(queryStrings) ? queryStrings : this.dictionaryToQueryString(queryStrings))); + + }, + + /** + * @ngdoc function + * @name umbraco.services.umbRequestHelper#resourcePromise + * @methodOf umbraco.services.umbRequestHelper + * @function + * + * @description + * This returns a promise with an underlying http call, it is a helper method to reduce + * the amount of duplicate code needed to query http resources and automatically handle any + * Http errors. See /docs/source/using-promises-resources.md + * + * @param {object} opts A mixed object which can either be a string representing the error message to be + * returned OR an object containing either: + * { success: successCallback, errorMsg: errorMessage } + * OR + * { success: successCallback, error: errorCallback } + * In both of the above, the successCallback must accept these parameters: data, status, headers, config + * If using the errorCallback it must accept these parameters: data, status, headers, config + * The success callback must return the data which will be resolved by the deferred object. + * The error callback must return an object containing: {errorMsg: errorMessage, data: originalData } + */ + resourcePromise: function (httpPromise, opts) { + var deferred = $q.defer(); + + /** The default success callback used if one is not supplied in the opts */ + function defaultSuccess(data, status, headers, config) { + //when it's successful, just return the data + return data; + } + + /** The default error callback used if one is not supplied in the opts */ + function defaultError(data, status, headers, config) { + return { + //NOTE: the default error message here should never be used based on the above docs! + errorMsg: (angular.isString(opts) ? opts : 'An error occurred!'), + data: data + }; + } + + //create the callbacs based on whats been passed in. + var callbacks = { + success: (!opts.success ? defaultSuccess : opts.success), + error: (!opts.error ? defaultError : opts.error) + }; + + httpPromise.success(function (data, status, headers, config) { + + //invoke the callback + var result = callbacks.success.apply(this, [data, status, headers, config]); + + //when it's successful, just return the data + deferred.resolve(result); + + }).error(function (data, status, headers, config) { + + //invoke the callback + var result = callbacks.error.apply(this, [data, status, headers, config]); + + //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. + if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { + + dialogService.ysodDialog({ + errorMsg: result.errorMsg, + data: result.data + }); + } + else { + + //return an error object including the error message for UI + deferred.reject({ + errorMsg: result.errorMsg, + data: result.data + }); + + } + + }); + + return deferred.promise; + + }, + + /** Used for saving media/content specifically */ + postSaveContent: function (restApiUrl, content, action, files) { + + var deferred = $q.defer(); + + //save the active tab id so we can set it when the data is returned. + var activeTab = _.find(content.tabs, function (item) { + return item.active; + }); + var activeTabIndex = (activeTab === undefined ? 0 : _.indexOf(content.tabs, activeTab)); + + //save the data + this.postMultiPartRequest( + restApiUrl, + { key: "contentItem", value: umbDataFormatter.formatContentPostData(content, action) }, + function (data, formData) { + //now add all of the assigned files + for (var f in files) { + //each item has a property id and the file object, we'll ensure that the id is suffixed to the key + // so we know which property it belongs to on the server side + formData.append("file_" + files[f].id, files[f].file); + } + + }, + function (data, status, headers, config) { + //success callback + + //reset the tabs and set the active one + _.each(data.tabs, function (item) { + item.active = false; + }); + data.tabs[activeTabIndex].active = true; + + //the data returned is the up-to-date data so the UI will refresh + deferred.resolve(data); + }, + function (data, status, headers, config) { + //failure callback + + //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. + if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { + + dialogService.ysodDialog({ + errorMsg: 'An error occurred', + data: data + }); + } + else { + + //return an error object including the error message for UI + deferred.reject({ + errorMsg: 'An error occurred', + data: data, + status: status + }); + } + + }); + + return deferred.promise; + }, + + /** Posts a multi-part mime request to the server */ + postMultiPartRequest: function (url, jsonData, transformCallback, successCallback, failureCallback) { + + //validate input, jsonData can be an array of key/value pairs or just one key/value pair. + if (!jsonData) { throw "jsonData cannot be null"; } + + if (angular.isArray(jsonData)) { + _.each(jsonData, function (item) { + if (!item.key || !item.value) { throw "jsonData array item must have both a key and a value property"; } + }); + } + else if (!jsonData.key || !jsonData.value) { throw "jsonData object must have both a key and a value property"; } + + + $http({ + method: 'POST', + url: url, + //IMPORTANT!!! You might think this should be set to 'multipart/form-data' but this is not true because when we are sending up files + // the request needs to include a 'boundary' parameter which identifies the boundary name between parts in this multi-part request + // and setting the Content-type manually will not set this boundary parameter. For whatever reason, setting the Content-type to 'false' + // will force the request to automatically populate the headers properly including the boundary parameter. + headers: { 'Content-Type': false }, + transformRequest: function (data) { + var formData = new FormData(); + //add the json data + if (angular.isArray(data)) { + _.each(data, function (item) { + formData.append(item.key, !angular.isString(item.value) ? angular.toJson(item.value) : item.value); + }); + } + else { + formData.append(data.key, !angular.isString(data.value) ? angular.toJson(data.value) : data.value); + } + + //call the callback + if (transformCallback) { + transformCallback.apply(this, [data, formData]); + } + + return formData; + }, + data: jsonData + }). + success(function (data, status, headers, config) { + if (successCallback) { + successCallback.apply(this, [data, status, headers, config]); + } + }). + error(function (data, status, headers, config) { + if (failureCallback) { + failureCallback.apply(this, [data, status, headers, config]); + } + }); + } + }; +} +angular.module('umbraco.services').factory('umbRequestHelper', umbRequestHelper); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 32f97895b4..b3713da0f6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -1,6 +1,5 @@ /*Contains multiple services for various helper tasks */ - /** * @ngdoc function * @name umbraco.services.legacyJsLoader @@ -252,276 +251,6 @@ function umbImageHelper() { } angular.module('umbraco.services').factory('umbImageHelper', umbImageHelper); -/** -* @ngdoc service -* @name umbraco.services.umbRequestHelper -* @description A helper object used for sending requests to the server -**/ -function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogService) { - return { - - /** - * @ngdoc method - * @name umbraco.services.umbRequestHelper#dictionaryToQueryString - * @methodOf umbraco.services.umbRequestHelper - * @function - * - * @description - * This will turn an array of key/value pairs into a query string - * - * @param {Array} queryStrings An array of key/value pairs - */ - dictionaryToQueryString: function(queryStrings) { - - if (!angular.isArray(queryStrings)) { - throw "The queryString parameter is not an array of key value pairs"; - } - - return _.map(queryStrings, function (item) { - var key = null; - var val = null; - for (var k in item) { - key = k; - val = item[k]; - break; - } - if (key == null || val == null) { - throw "The object in the array was not formatted as a key/value pair"; - } - return key + "=" + val; - }).join("&"); - - }, - - /** - * @ngdoc method - * @name umbraco.services.umbRequestHelper#getApiUrl - * @methodOf umbraco.services.umbRequestHelper - * @function - * - * @description - * This will return the webapi Url for the requested key based on the servervariables collection - * - * @param {string} apiName The webapi name that is found in the servervariables["umbracoUrls"] dictionary - * @param {string} actionName The webapi action name - * @param {object} queryStrings Can be either a string or an array containing key/value pairs - */ - getApiUrl: function(apiName, actionName, queryStrings) { - if (!Umbraco || !Umbraco.Sys || !Umbraco.Sys.ServerVariables || !Umbraco.Sys.ServerVariables["umbracoUrls"]) { - throw "No server variables defined!"; - } - - if (!Umbraco.Sys.ServerVariables["umbracoUrls"][apiName]) { - throw "No url found for api name " + apiName; - } - - return Umbraco.Sys.ServerVariables["umbracoUrls"][apiName] + actionName + - (!queryStrings ? "" : "?" + (angular.isString(queryStrings) ? queryStrings : this.dictionaryToQueryString(queryStrings))); - - }, - - /** - * @ngdoc function - * @name umbraco.services.umbRequestHelper#resourcePromise - * @methodOf umbraco.services.umbRequestHelper - * @function - * - * @description - * This returns a promise with an underlying http call, it is a helper method to reduce - * the amount of duplicate code needed to query http resources and automatically handle any - * Http errors. See /docs/source/using-promises-resources.md - * - * @param {object} opts A mixed object which can either be a string representing the error message to be - * returned OR an object containing either: - * { success: successCallback, errorMsg: errorMessage } - * OR - * { success: successCallback, error: errorCallback } - * In both of the above, the successCallback must accept these parameters: data, status, headers, config - * If using the errorCallback it must accept these parameters: data, status, headers, config - * The success callback must return the data which will be resolved by the deferred object. - * The error callback must return an object containing: {errorMsg: errorMessage, data: originalData } - */ - resourcePromise: function (httpPromise, opts) { - var deferred = $q.defer(); - - /** The default success callback used if one is not supplied in the opts */ - function defaultSuccess(data, status, headers, config) { - //when it's successful, just return the data - return data; - } - - /** The default error callback used if one is not supplied in the opts */ - function defaultError(data, status, headers, config) { - return { - //NOTE: the default error message here should never be used based on the above docs! - errorMsg: (angular.isString(opts) ? opts : 'An error occurred!'), - data: data - }; - } - - //create the callbacs based on whats been passed in. - var callbacks = { - success: (!opts.success ? defaultSuccess : opts.success), - error: (!opts.error ? defaultError : opts.error) - }; - - httpPromise.success(function (data, status, headers, config) { - - //invoke the callback - var result = callbacks.success.apply(this, [data, status, headers, config]); - - //when it's successful, just return the data - deferred.resolve(result); - - }).error(function (data, status, headers, config) { - - //invoke the callback - var result = callbacks.error.apply(this, [data, status, headers, config]); - - //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. - if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { - - dialogService.ysodDialog({ - errorMsg: result.errorMsg, - data: result.data - }); - } - else { - - //return an error object including the error message for UI - deferred.reject({ - errorMsg: result.errorMsg, - data: result.data - }); - - } - - }); - - return deferred.promise; - - }, - - /** Used for saving media/content specifically */ - postSaveContent: function (restApiUrl, content, action, files) { - - var deferred = $q.defer(); - - //save the active tab id so we can set it when the data is returned. - var activeTab = _.find(content.tabs, function (item) { - return item.active; - }); - var activeTabIndex = (activeTab === undefined ? 0 : _.indexOf(content.tabs, activeTab)); - - //save the data - this.postMultiPartRequest( - restApiUrl, - { key: "contentItem", value: umbDataFormatter.formatContentPostData(content, action) }, - function (data, formData) { - //now add all of the assigned files - for (var f in files) { - //each item has a property id and the file object, we'll ensure that the id is suffixed to the key - // so we know which property it belongs to on the server side - formData.append("file_" + files[f].id, files[f].file); - } - - }, - function (data, status, headers, config) { - //success callback - - //reset the tabs and set the active one - _.each(data.tabs, function (item) { - item.active = false; - }); - data.tabs[activeTabIndex].active = true; - - //the data returned is the up-to-date data so the UI will refresh - deferred.resolve(data); - }, - function (data, status, headers, config) { - //failure callback - - //when there's a 500 (unhandled) error show a YSOD overlay if debugging is enabled. - if (status >= 500 && status < 600 && Umbraco.Sys.ServerVariables["isDebuggingEnabled"] === true) { - - dialogService.ysodDialog({ - errorMsg: 'An error occurred', - data: data - }); - } - else { - - //return an error object including the error message for UI - deferred.reject({ - errorMsg: 'An error occurred', - data: data, - status: status - }); - } - - }); - - return deferred.promise; - }, - - /** Posts a multi-part mime request to the server */ - postMultiPartRequest: function (url, jsonData, transformCallback, successCallback, failureCallback) { - - //validate input, jsonData can be an array of key/value pairs or just one key/value pair. - if (!jsonData) {throw "jsonData cannot be null";} - - if (angular.isArray(jsonData)) { - _.each(jsonData, function (item) { - if (!item.key || !item.value){throw "jsonData array item must have both a key and a value property";} - }); - } - else if (!jsonData.key || !jsonData.value){throw "jsonData object must have both a key and a value property";} - - - $http({ - method: 'POST', - url: url, - //IMPORTANT!!! You might think this should be set to 'multipart/form-data' but this is not true because when we are sending up files - // the request needs to include a 'boundary' parameter which identifies the boundary name between parts in this multi-part request - // and setting the Content-type manually will not set this boundary parameter. For whatever reason, setting the Content-type to 'false' - // will force the request to automatically populate the headers properly including the boundary parameter. - headers: { 'Content-Type': false }, - transformRequest: function (data) { - var formData = new FormData(); - //add the json data - if (angular.isArray(data)) { - _.each(data, function (item) { - formData.append(item.key, !angular.isString(item.value) ? angular.toJson(item.value) : item.value); - }); - } - else { - formData.append(data.key, !angular.isString(data.value) ? angular.toJson(data.value) : data.value); - } - - //call the callback - if (transformCallback) { - transformCallback.apply(this, [data, formData]); - } - - return formData; - }, - data: jsonData - }). - success(function (data, status, headers, config) { - if (successCallback) { - successCallback.apply(this, [data, status, headers, config]); - } - }). - error(function (data, status, headers, config) { - if (failureCallback) { - failureCallback.apply(this, [data, status, headers, config]); - } - }); - } - }; -} -angular.module('umbraco.services').factory('umbRequestHelper', umbRequestHelper); - /** * @ngdoc service * @name umbraco.services.umbDataFormatter @@ -681,239 +410,3 @@ function iconHelper() { }; } angular.module('umbraco.services').factory('iconHelper', iconHelper); - -/** -* @ngdoc service -* @name umbraco.services.contentEditingHelper -* @description A helper service for content controllers when editing/creating/saving content. -**/ -function contentEditingHelper($location, $routeParams, notificationsService, serverValidationManager, dialogService) { - - return { - - /** - * @ngdoc function - * @name getAllProps - * @methodOf contentEditingHelper - * @function - * - * @description - * Returns all propertes contained for the content item (since the normal model has properties contained inside of tabs) - */ - getAllProps: function(content) { - var allProps = []; - - for (var i = 0; i < content.tabs.length; i++) { - for (var p = 0; p < content.tabs[i].properties.length; p++) { - allProps.push(content.tabs[i].properties[p]); - } - } - - return allProps; - }, - - /** - * @ngdoc function - * @name reBindChangedProperties - * @methodOf contentEditingHelper - * @function - * - * @description - * re-binds all changed property values to the origContent object from the newContent object and returns an array of changed properties. - */ - reBindChangedProperties: function(origContent, newContent) { - - var changed = []; - - //get a list of properties since they are contained in tabs - var allOrigProps = this.getAllProps(origContent); - var allNewProps = this.getAllProps(newContent); - - function getNewProp(alias) { - return _.find(allNewProps, function(item) { - return item.alias === alias; - }); - } - - for (var p in allOrigProps) { - var newProp = getNewProp(allOrigProps[p].alias); - if (!_.isEqual(allOrigProps[p].value, newProp.value)) { - //they have changed so set the origContent prop's value to the new value - allOrigProps[p].value = newProp.value; - changed.push(allOrigProps[p]); - } - } - - return changed; - }, - - /** - * @ngdoc function - * @name handleValidationErrors - * @methodOf contentEditingHelper - * @function - * - * @description - * A function to handle the validation (modelState) errors collection which will happen on a 403 error indicating validation errors - * It's worth noting that when a 403 occurs, the data is still saved just never published, though this depends on if the entity is a new - * entity and whether or not the data fulfils the absolute basic requirements like having a mandatory Name. - */ - handleValidationErrors: function (content, modelState) { - //get a list of properties since they are contained in tabs - var allProps = this.getAllProps(content); - - //find the content property for the current error, for use in the loop below - function findContentProp(props, propAlias) { - return _.find(props, function (item) { - return (item.alias === propAlias); - }); - } - - for (var e in modelState) { - //the alias in model state can be in dot notation which indicates - // * the first part is the content property alias - // * the second part is the field to which the valiation msg is associated with - //There will always be at least 2 parts since all model errors for properties are prefixed with "Properties" - var parts = e.split("."); - if (parts.length > 1) { - var propertyAlias = parts[1]; - - //find the content property for the current error - var contentProperty = findContentProp(allProps, propertyAlias); - - if (contentProperty) { - //if it contains 2 '.' then we will wire it up to a property's field - if (parts.length > 2) { - //add an error with a reference to the field for which the validation belongs too - serverValidationManager.addPropertyError(contentProperty, parts[2], modelState[e][0]); - } - else { - //add a generic error for the property, no reference to a specific field - serverValidationManager.addPropertyError(contentProperty, "", modelState[e][0]); - } - } - } - else { - //the parts are only 1, this means its not a property but a native content property - serverValidationManager.addFieldError(parts[0], modelState[e][0]); - } - - //add to notifications - notificationsService.error("Validation", modelState[e][0]); - } - }, - - /** - * @ngdoc function - * @name handleSaveError - * @methodOf contentEditingHelper - * @function - * - * @description - * A function to handle what happens when we have validation issues from the server side - */ - handleSaveError: function (err, scope) { - //When the status is a 403 status, we have validation errors. - //Otherwise the error is probably due to invalid data (i.e. someone mucking around with the ids or something). - //Or, some strange server error - if (err.status === 403) { - //now we need to look through all the validation errors - if (err.data && (err.data.modelState)) { - - this.handleValidationErrors(err.data, err.data.modelState); - - if (!this.redirectToCreatedContent(err.data.id, err.data.modelState)) { - //we are not redirecting because this is not new content, it is existing content. In this case - // we need to detect what properties have changed and re-bind them with the server data. Then we need - // to re-bind any server validation errors after the digest takes place. - this.reBindChangedProperties(scope.content, err.data); - serverValidationManager.executeAndClearAllSubscriptions(); - } - - //indicates we've handled the server result - return true; - } - else { - dialogService.ysodDialog(err); - } - } - else { - dialogService.ysodDialog(err); - } - - return false; - }, - - /** - * @ngdoc function - * @name handleSaveError - * @methodOf handleSuccessfulSave - * @function - * - * @description - * A function to handle when saving a content item is successful. This will rebind the values of the model that have changed - * ensure the notifications are displayed and that the appropriate events are fired. This will also check if we need to redirect - * when we're creating new content. - */ - handleSuccessfulSave: function (args) { - - if (!args) { - throw "args cannot be null"; - } - if (!args.scope) { - throw "args.scope cannot be null"; - } - if (!args.scope.content) { - throw "args.scope.content cannot be null"; - } - if (!args.newContent) { - throw "args.newContent cannot be null"; - } - - for (var i = 0; i < args.newContent.notifications.length;i++) { - notificationsService.showNotification(args.newContent.notifications[i]); - } - - args.scope.$broadcast("saved", { scope: args.scope }); - if (!this.redirectToCreatedContent(args.scope.content.id)) { - //we are not redirecting because this is not new content, it is existing content. In this case - // we need to detect what properties have changed and re-bind them with the server data - this.reBindChangedProperties(args.scope.content, args.newContent); - } - }, - - /** - * @ngdoc function - * @name redirectToCreatedContent - * @methodOf contentEditingHelper - * @function - * - * @description - * Changes the location to be editing the newly created content after create was successful. - * We need to decide if we need to redirect to edito mode or if we will remain in create mode. - * We will only need to maintain create mode if we have not fulfilled the basic requirements for creating an entity which is at least having a name. - */ - redirectToCreatedContent: function (id, modelState) { - - //only continue if we are currently in create mode and if there is no 'Name' modelstate errors - // since we need at least a name to create content. - if ($routeParams.create && (!modelState || !modelState["Name"])) { - - //need to change the location to not be in 'create' mode. Currently the route will be something like: - // /belle/#/content/edit/1234?doctype=newsArticle&create=true - // but we need to remove everything after the query so that it is just: - // /belle/#/content/edit/9876 (where 9876 is the new id) - - //clear the query strings - $location.search(null); - //change to new path - $location.path("/" + $routeParams.section + "/" + $routeParams.method + "/" + id); - //don't add a browser history for this - $location.replace(); - return true; - } - return false; - } - }; -} -angular.module('umbraco.services').factory('contentEditingHelper', contentEditingHelper); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js index 9bbc78d338..3f047288ca 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/contentedit.controller.js @@ -82,9 +82,7 @@ function ContentEditController($scope, $routeParams, $location, contentResource, .then(function (data) { contentEditingHelper.handleSuccessfulSave({ scope: $scope, - newContent: data, - notifyHeader: "Saved", - notifyMsg: "Content has been saved" + newContent: data }); }, function (err) { contentEditingHelper.handleSaveError(err, $scope); diff --git a/src/Umbraco.Web.UI/umbraco/lib/Umbraco/Extensions.js b/src/Umbraco.Web.UI/umbraco/lib/Umbraco/Extensions.js index 4f2494d3a7..e19438d3ef 100644 --- a/src/Umbraco.Web.UI/umbraco/lib/Umbraco/Extensions.js +++ b/src/Umbraco.Web.UI/umbraco/lib/Umbraco/Extensions.js @@ -3,16 +3,16 @@ //extensions to base classes such as String and extension methods for jquery. //NOTE: jquery must be loaded before this file. - //create guid object on the window (which makes it global) - if (window.Guid == null) { - window.Guid = { - generate: function () { - ///generates a new Guid - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - } + + + //create guid method on the String + if (String.CreateGuid == null) { + String.CreateGuid = function () { + ///generates a new Guid + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); }; } From 08a300fbe50f378ba82c90ccdc9cf964a252a761 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 22 Jul 2013 10:47:01 +0200 Subject: [PATCH 56/85] U4-2370 Style sheet property sorting broken --- .../umbraco/dialogs/sort.aspx.cs | 8 +++++--- .../umbraco/webservices/nodeSorter.asmx.cs | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs index f6b257ad90..2b104404b4 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs @@ -83,14 +83,16 @@ namespace umbraco.cms.presentation } } - // "hack for stylesheet" - // TODO: I can't see where this is being used at all..? + // hack for stylesheet, used to sort stylesheet properties if (app == Constants.Applications.Settings) { icon = "../images/umbraco/settingCss.gif"; var ss = new StyleSheet(parentId); foreach (var child in ss.Properties) - _nodes.Add(CreateNode(child.Id, child.sortOrder, child.Text, child.CreateDateTime, icon)); + { + var node = new CMSNode(child.Id); + _nodes.Add(CreateNode(child.Id, node.sortOrder, child.Text, child.CreateDateTime, icon)); + } } bindNodesToList(string.Empty); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs index 348f07529e..a5b2102640 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs @@ -92,6 +92,9 @@ namespace umbraco.presentation.webservices if (isMedia) SortMedia(ids); + + if (isContent == false && isMedia == false) + SortStylesheetProperties(ids); } private void SortMedia(string[] ids) @@ -116,6 +119,22 @@ namespace umbraco.presentation.webservices } } + private void SortStylesheetProperties(string[] ids) + { + try + { + for (var i = 0; i < ids.Length; i++) + { + var id = int.Parse(ids[i]); + new cms.businesslogic.CMSNode(id).sortOrder = i; + } + } + catch (Exception ex) + { + LogHelper.Error("Could not update stylesheet property sort order", ex); + } + } + private void SortContent(string[] ids, int parentId) { var contentService = base.ApplicationContext.Services.ContentService; From 398bc6d767026e288e0330a2344eebe6123ddef8 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 22 Jul 2013 12:15:54 +0200 Subject: [PATCH 57/85] Fix merge issue --- src/Umbraco.Web.UI/umbraco/config/lang/ko.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml index ce903aa4d0..a9c63d2f07 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml @@ -1,4 +1,4 @@ -h + The Umbraco community From 319ba5c79109ed1b6221fd5ed45ad2cc82eff302 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 22 Jul 2013 13:51:13 +0200 Subject: [PATCH 58/85] U4-2524 If tinyMCEImageHelper.DoResize fails, the src gets removed from the img tag --- .../tinymce/tinyMCEImageHelper.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs index 437e0da9fe..0bb52b4dd4 100644 --- a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs +++ b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs @@ -5,9 +5,7 @@ using System.Text.RegularExpressions; using System.Web; using Umbraco.Core.IO; using Umbraco.Core.Logging; -using umbraco.BusinessLogic; using umbraco.cms.businesslogic.Files; -using umbraco.IO; namespace umbraco.editorControls.tinymce { @@ -134,7 +132,21 @@ namespace umbraco.editorControls.tinymce if (fs.FileExists(orgPath)) { var uf = new UmbracoFile(orgPath); - newSrc = uf.Resize(newWidth, newHeight); + + try + { + newSrc = uf.Resize(newWidth, newHeight); + } + catch (Exception ex) + { + LogHelper.Error(string.Format("The file {0} could not be resized, reverting the image src attribute to the original source: {1}", orgPath, orgSrc), ex); + newSrc = orgSrc; + } + } + else + { + LogHelper.Warn(string.Format("The file {0} does not exist, reverting the image src attribute to the original source: {1}", orgPath, orgSrc)); + newSrc = orgSrc; } } From f30b4c818470d1f13a1c029bbb1f0235a8b7ca35 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 22 Jul 2013 13:55:10 +0200 Subject: [PATCH 59/85] Slight refactor of UmbracoFile --- .../businesslogic/Files/UmbracoFile.cs | 180 +++++++----------- 1 file changed, 69 insertions(+), 111 deletions(-) diff --git a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs index 475446921a..a37adad5b7 100644 --- a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs +++ b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; @@ -8,18 +7,11 @@ using System.Linq; using System.Web; using Umbraco.Core; using Umbraco.Core.IO; -using Encoder = System.Text.Encoder; namespace umbraco.cms.businesslogic.Files { public class UmbracoFile : IFile { - private readonly string _path; - private string _fileName; - private string _extension; - private string _url; - private long _length; - private readonly MediaFileSystem _fs; #region Constructors @@ -33,11 +25,11 @@ namespace umbraco.cms.businesslogic.Files { _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - _path = path; + Path = path; Initialize(); } - + #endregion #region Static Methods @@ -84,26 +76,19 @@ namespace umbraco.cms.businesslogic.Files private void Initialize() { - _fileName = _fs.GetFileName(_path); - _length = _fs.GetSize(_path); - _extension = _fs.GetExtension(_path) != null - ? _fs.GetExtension(_path).Substring(1).ToLowerInvariant() + Filename = _fs.GetFileName(Path); + Length = _fs.GetSize(Path); + Extension = _fs.GetExtension(Path) != null + ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() : ""; - _url = _fs.GetUrl(_path); + Url = _fs.GetUrl(Path); } #region IFile Members - public string Filename - { - get { return _fileName; } - } + public string Filename { get; private set; } - public string Extension - { - - get { return _extension; } - } + public string Extension { get; private set; } [Obsolete("LocalName is obsolete, please use Url instead", false)] public string LocalName @@ -111,43 +96,30 @@ namespace umbraco.cms.businesslogic.Files get { return Url; } } - public string Path - { - get { return _path; } - } + public string Path { get; private set; } - public string Url - { - get { return _url; } - } + public string Url { get; private set; } - public long Length - { - get { return _length; } - } + public long Length { get; private set; } public bool SupportsResizing { get { - if (("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", _extension))) - { - return true; - } - return false; + return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); } } public string GetFriendlyName() { - return _fileName.SplitPascalCasing().ToFirstUpperInvariant(); + return Filename.SplitPascalCasing().ToFirstUpperInvariant(); } public System.Tuple GetDimensions() { - throwNotAnImageException(); + EnsureFileSupportsResizing(); - var fs = _fs.OpenFile(_path); + var fs = _fs.OpenFile(Path); var image = Image.FromStream(fs); var fileWidth = image.Width; var fileHeight = image.Height; @@ -159,16 +131,16 @@ namespace umbraco.cms.businesslogic.Files public string Resize(int width, int height) { - throwNotAnImageException(); + EnsureFileSupportsResizing(); - var fileNameThumb = DoResize(width, height, 0, String.Empty); + var fileNameThumb = DoResize(width, height, 0, string.Empty); return _fs.GetUrl(fileNameThumb); } public string Resize(int maxWidthHeight, string fileNameAddition) { - throwNotAnImageException(); + EnsureFileSupportsResizing(); var fileNameThumb = DoResize(GetDimensions().Item1, GetDimensions().Item2, maxWidthHeight, fileNameAddition); @@ -177,53 +149,44 @@ namespace umbraco.cms.businesslogic.Files private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) { - var fs = _fs.OpenFile(_path); - var image = Image.FromStream(fs); - fs.Close(); + using (var fs = _fs.OpenFile(Path)) + { + using (var image = Image.FromStream(fs)) + { + var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); - string fileNameThumb = String.IsNullOrEmpty(fileNameAddition) ? - string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", _path.Substring(0, _path.LastIndexOf("."))) : - string.Format("{0}_{1}.jpg", _path.Substring(0, _path.LastIndexOf(".")), fileNameAddition); - - fileNameThumb = generateThumbnail( - image, - maxWidthHeight, - width, - height, - _path, - _extension, - fileNameThumb, - maxWidthHeight == 0 - ).FileName; - - image.Dispose(); - - return fileNameThumb; + var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); + + return thumbnail.FileName; + } + } } #endregion - private void throwNotAnImageException() + private void EnsureFileSupportsResizing() { - if (!SupportsResizing) - throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", _fileName)); + if (SupportsResizing == false) + throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); } - - private ResizedImage generateThumbnail(System.Drawing.Image image, int maxWidthHeight, int fileWidth, int fileHeight, string fullFilePath, string ext, string thumbnailFileName, bool useFixedDimensions) + private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) { // Generate thumbnail float f = 1; - if (!useFixedDimensions) + if (useFixedDimensions == false) { var fx = (float)image.Size.Width / (float)maxWidthHeight; var fy = (float)image.Size.Height / (float)maxWidthHeight; // must fit in thumbnail size - f = Math.Max(fx, fy); //if (f < 1) f = 1; + f = Math.Max(fx, fy); } - var widthTh = (int)Math.Round((float)fileWidth / f); int heightTh = (int)Math.Round((float)fileHeight / f); + var widthTh = (int)Math.Round((float)fileWidth / f); + var heightTh = (int)Math.Round((float)fileHeight / f); // fixes for empty width or height if (widthTh == 0) @@ -232,55 +195,50 @@ namespace umbraco.cms.businesslogic.Files heightTh = 1; // Create new image with best quality settings - var bp = new Bitmap(widthTh, heightTh); - var g = Graphics.FromImage(bp); - g.SmoothingMode = SmoothingMode.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; + using (var bp = new Bitmap(widthTh, heightTh)) + { + using (var g = Graphics.FromImage(bp)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; - // Copy the old image to the new and resized - var rect = new Rectangle(0, 0, widthTh, heightTh); - g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + // Copy the old image to the new and resized + var rect = new Rectangle(0, 0, widthTh, heightTh); + g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - // Copy metadata - var imageEncoders = ImageCodecInfo.GetImageEncoders(); - ImageCodecInfo codec = null; - if (Extension.ToLower() == "png" || Extension.ToLower() == "gif") - codec = imageEncoders.Single(t => t.MimeType.Equals("image/png")); - else - codec = imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + // Copy metadata + var imageEncoders = ImageCodecInfo.GetImageEncoders(); + var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" + ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) + : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); - // Set compresion ratio to 90% - var ep = new EncoderParameters(); - ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L); + // Set compresion ratio to 90% + var ep = new EncoderParameters(); + ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - // Save the new image using the dimensions of the image - string newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", - string.Format("{0}x{1}", widthTh, heightTh)); - var ms = new MemoryStream(); - bp.Save(ms, codec, ep); - ms.Seek(0, 0); + // Save the new image using the dimensions of the image + var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); + using (var ms = new MemoryStream()) + { + bp.Save(ms, codec, ep); + ms.Seek(0, 0); - _fs.AddFile(newFileName, ms); - - ms.Close(); - bp.Dispose(); - g.Dispose(); - - return new ResizedImage(widthTh, heightTh, newFileName); + _fs.AddFile(newFileName, ms); + } + return new ResizedImage(widthTh, heightTh, newFileName); + } + } } - - } internal class ResizedImage { public ResizedImage() { - } public ResizedImage(int width, int height, string fileName) From 775892ff5a279cc05751099388c54be009b16626 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 22 Jul 2013 16:23:16 +0200 Subject: [PATCH 60/85] U4-2514 Checkboxlist prevalues in packages broken --- src/Umbraco.Core/Models/PropertyExtensions.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Models/PropertyExtensions.cs b/src/Umbraco.Core/Models/PropertyExtensions.cs index d378b5f2ab..597e36fd88 100644 --- a/src/Umbraco.Core/Models/PropertyExtensions.cs +++ b/src/Umbraco.Core/Models/PropertyExtensions.cs @@ -1,7 +1,15 @@ using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; using System.Xml; using System.Xml.Linq; +using System.Xml.XPath; using Umbraco.Core.Configuration; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Services; +using umbraco.interfaces; namespace Umbraco.Core.Models { @@ -32,9 +40,16 @@ namespace Umbraco.Core.Models var dt = property.PropertyType.DataType(property.Id); if (dt != null && dt.Data != null) { - xmlNode.AppendChild(dt.Data.ToXMl(xd)); + if (dt.Id == new Guid(Constants.PropertyEditors.CheckBoxList)) + { + xmlNode.AppendChild(xd.CreateCDataSection(dt.Data.Value.ToString())); + } + else + { + xmlNode.AppendChild(dt.Data.ToXMl(xd)); + } } - + var element = xmlNode.GetXElement(); return element; } From 3da7682415f91753291681dc5a54c87cb11ea513 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 10:50:48 +1000 Subject: [PATCH 61/85] reverted change for U4-2514 as this change will cause other unwanted problems. Added logging for DefaultDataKeyValue instead of blindly swallowing an exception. --- src/Umbraco.Core/Models/PropertyExtensions.cs | 11 ++---- .../DefaultDataKeyValue.cs | 36 ++++++++++--------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Core/Models/PropertyExtensions.cs b/src/Umbraco.Core/Models/PropertyExtensions.cs index 597e36fd88..b03f078a9f 100644 --- a/src/Umbraco.Core/Models/PropertyExtensions.cs +++ b/src/Umbraco.Core/Models/PropertyExtensions.cs @@ -39,15 +39,8 @@ namespace Umbraco.Core.Models //SD: With the new null checks below, this shouldn't fail anymore. var dt = property.PropertyType.DataType(property.Id); if (dt != null && dt.Data != null) - { - if (dt.Id == new Guid(Constants.PropertyEditors.CheckBoxList)) - { - xmlNode.AppendChild(xd.CreateCDataSection(dt.Data.Value.ToString())); - } - else - { - xmlNode.AppendChild(dt.Data.ToXMl(xd)); - } + { + xmlNode.AppendChild(dt.Data.ToXMl(xd)); } var element = xmlNode.GetXElement(); diff --git a/src/umbraco.editorControls/DefaultDataKeyValue.cs b/src/umbraco.editorControls/DefaultDataKeyValue.cs index a08c51d7d5..26a32ffb18 100644 --- a/src/umbraco.editorControls/DefaultDataKeyValue.cs +++ b/src/umbraco.editorControls/DefaultDataKeyValue.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Logging; using umbraco.DataLayer; namespace umbraco.editorControls @@ -19,25 +20,28 @@ namespace umbraco.editorControls public override System.Xml.XmlNode ToXMl(System.Xml.XmlDocument d) { // Get the value from - string v = ""; + var v = ""; try { - // Don't query if there's nothing to query for.. - if (string.IsNullOrWhiteSpace(Value.ToString()) == false) - { - IRecordsReader dr = SqlHelper.ExecuteReader("Select [value] from cmsDataTypeprevalues where id in (" + SqlHelper.EscapeString(Value.ToString()) + ")"); + // Don't query if there's nothing to query for.. + if (string.IsNullOrWhiteSpace(Value.ToString()) == false) + { + var dr = SqlHelper.ExecuteReader("Select [value] from cmsDataTypeprevalues where id in (" + SqlHelper.EscapeString(Value.ToString()) + ")"); - while (dr.Read()) - { - if (v.Length == 0) - v += dr.GetString("value"); - else - v += "," + dr.GetString("value"); - } - dr.Close(); - } - } - catch {} + while (dr.Read()) + { + if (v.Length == 0) + v += dr.GetString("value"); + else + v += "," + dr.GetString("value"); + } + dr.Close(); + } + } + catch (Exception ex) + { + LogHelper.Error("An exception occurred converting the property data to XML", ex); + } return d.CreateCDataSection(v); } } From 8be54ba0cc3b71b6958fbda413dd888374902e83 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 11:46:18 +1000 Subject: [PATCH 62/85] Fixes: U4-1970 v6 API - need to implement caching for templates since we're doing a db lookup on a front-end request. This is a temporary fix until we implement the ApplicationCache properly but it still works by utilizing the existing RuntimeCacheProvider singleton. I've tweaked this provider as well to ensure we use the HttpRuntime.Cache when it is available (during a web session). We don't want to have a seperate caching bucket so that IIS can manage cache memory properly. Have ensured that the template cache is cleared when templates are updated/removed. --- .../Caching/RuntimeCacheProvider.cs | 102 +++++++++++++++--- .../Persistence/RepositoryFactory.cs | 2 +- src/Umbraco.Core/Services/ContentService.cs | 3 + .../Cache/TemplateCacheRefresher.cs | 6 ++ 4 files changed, 96 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index e79b61ed5d..6a53e8bc5c 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -1,9 +1,11 @@ using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; using System.Threading; +using System.Web; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Persistence.Caching @@ -11,6 +13,19 @@ namespace Umbraco.Core.Persistence.Caching /// /// The Runtime Cache provider looks up objects in the Runtime cache for fast retrival /// + /// + /// + /// If a web session is detected then the HttpRuntime.Cache will be used for the runtime cache, otherwise a custom + /// MemoryCache instance will be used. It is important to use the HttpRuntime.Cache when a web session is detected so + /// that the memory management of cache in IIS can be handled appopriately. + /// + /// When a web sessions is detected we will pre-fix all HttpRuntime.Cache entries so that when we clear it we are only + /// clearing items that have been inserted by this provider. + /// + /// NOTE: These changes are all temporary until we finalize the ApplicationCache implementation which will support static cache, runtime cache + /// and request based cache which will all live in one central location so it is easily managed. + /// + /// internal sealed class RuntimeCacheProvider : IRepositoryCacheProvider { #region Singleton @@ -21,19 +36,25 @@ namespace Umbraco.Core.Persistence.Caching private RuntimeCacheProvider() { + if (HttpContext.Current == null) + { + _memoryCache = new MemoryCache("in-memory"); + } } #endregion //TODO Save this in cache as well, so its not limited to a single server usage private readonly ConcurrentHashSet _keyTracker = new ConcurrentHashSet(); - private ObjectCache _memoryCache = new MemoryCache("in-memory"); + private ObjectCache _memoryCache; private static readonly ReaderWriterLockSlim ClearLock = new ReaderWriterLockSlim(); public IEntity GetById(Type type, Guid id) { var key = GetCompositeId(type, id); - var item = _memoryCache.Get(key); + var item = HttpContext.Current == null + ? _memoryCache.Get(key) + : HttpRuntime.Cache.Get(key); return item as IEntity; } @@ -41,7 +62,11 @@ namespace Umbraco.Core.Persistence.Caching { foreach (var guid in ids) { - yield return _memoryCache.Get(GetCompositeId(type, guid)) as IEntity; + var item = HttpContext.Current == null + ? _memoryCache.Get(GetCompositeId(type, guid)) + : HttpRuntime.Cache.Get(GetCompositeId(type, guid)); + + yield return item as IEntity; } } @@ -51,7 +76,11 @@ namespace Umbraco.Core.Persistence.Caching { if (key.StartsWith(type.Name)) { - yield return _memoryCache.Get(key) as IEntity; + var item = HttpContext.Current == null + ? _memoryCache.Get(key) + : HttpRuntime.Cache.Get(key); + + yield return item as IEntity; } } } @@ -59,21 +88,34 @@ namespace Umbraco.Core.Persistence.Caching public void Save(Type type, IEntity entity) { var key = GetCompositeId(type, entity.Id); - var exists = _memoryCache.GetCacheItem(key) != null; + _keyTracker.TryAdd(key); - if (exists) + + //NOTE: Before we were checking if it already exists but the MemoryCache.Set handles this implicitly and does + // an add or update, same goes for HttpRuntime.Cache.Insert. + + if (HttpContext.Current == null) { _memoryCache.Set(key, entity, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }); - return; } - - _memoryCache.Add(key, entity, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }); + else + { + HttpRuntime.Cache.Insert(key, entity, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5)); + } } public void Delete(Type type, IEntity entity) { var key = GetCompositeId(type, entity.Id); - _memoryCache.Remove(key); + if (HttpContext.Current == null) + { + _memoryCache.Remove(key); + } + else + { + HttpRuntime.Cache.Remove(key); + } + _keyTracker.Remove(key); } @@ -88,14 +130,21 @@ namespace Umbraco.Core.Persistence.Caching var keys = new string[_keyTracker.Count]; _keyTracker.CopyTo(keys, 0); var keysToRemove = new List(); - foreach (var key in keys.Where(x => x.StartsWith(string.Format("{0}-", type.Name)))) + foreach (var key in keys.Where(x => x.StartsWith(string.Format("{0}{1}-", CacheItemPrefix, type.Name)))) { _keyTracker.Remove(key); keysToRemove.Add(key); } foreach (var key in keysToRemove) { - _memoryCache.Remove(key); + if (HttpContext.Current == null) + { + _memoryCache.Remove(key); + } + else + { + HttpRuntime.Cache.Remove(key); + } } } } @@ -105,19 +154,40 @@ namespace Umbraco.Core.Persistence.Caching using (new WriteLock(ClearLock)) { _keyTracker.Clear(); - _memoryCache.DisposeIfDisposable(); - _memoryCache = new MemoryCache("in-memory"); + + if (HttpContext.Current == null) + { + _memoryCache.DisposeIfDisposable(); + _memoryCache = new MemoryCache("in-memory"); + } + else + { + foreach (DictionaryEntry c in HttpRuntime.Cache) + { + if (c.Key is string && ((string)c.Key).InvariantStartsWith(CacheItemPrefix)) + { + if (HttpRuntime.Cache[(string)c.Key] == null) return; + HttpRuntime.Cache.Remove((string)c.Key); + } + } + } } } + /// + /// We prefix all cache keys with this so that we know which ones this class has created when + /// using the HttpRuntime cache so that when we clear it we don't clear other entries we didn't create. + /// + private const string CacheItemPrefix = "umbrtmche_"; + private string GetCompositeId(Type type, Guid id) { - return string.Format("{0}-{1}", type.Name, id.ToString()); + return string.Format("{0}{1}-{2}", CacheItemPrefix, type.Name, id.ToString()); } private string GetCompositeId(Type type, int id) { - return string.Format("{0}-{1}", type.Name, id.ToGuid()); + return string.Format("{0}{1}-{2}", CacheItemPrefix, type.Name, id.ToGuid()); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 73c7b290f9..d8d4b1c7e2 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -118,7 +118,7 @@ namespace Umbraco.Core.Persistence public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) { - return new TemplateRepository(uow, NullCacheProvider.Current); + return new TemplateRepository(uow, RuntimeCacheProvider.Current); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index b3f8c9dec3..ed47bc76d6 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1122,6 +1122,9 @@ namespace Umbraco.Core.Services Audit.Add(AuditTypes.Copy, "Copy Content performed by user", content.WriterId, content.Id); + + //TODO: Don't think we need this here because cache should be cleared by the event listeners + // and the correct ICacheRefreshers!? RuntimeCacheProvider.Current.Clear(); return copy; diff --git a/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs b/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs index 0aec83104a..42026a7523 100644 --- a/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs @@ -1,6 +1,8 @@ using System; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Caching; using umbraco; using umbraco.interfaces; @@ -55,6 +57,10 @@ namespace Umbraco.Web.Cache ApplicationContext.Current.ApplicationCache.ClearCacheItem( string.Format("{0}{1}", CacheKeys.TemplateBusinessLogicCacheKey, id)); + + //need to clear the runtime cache for template instances + //NOTE: This is temp until we implement the correct ApplicationCache and then we can remove the RuntimeCache, etc... + RuntimeCacheProvider.Current.Clear(typeof(ITemplate)); } } From d657f2c3cb91ea5117475e79a42625be73584947 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 13:33:37 +1000 Subject: [PATCH 63/85] Gets the back office routing to /umbraco again. --- src/Umbraco.Core/UriExtensions.cs | 19 + src/Umbraco.Web.UI.Client/gruntFile.js | 9 +- src/Umbraco.Web.UI.Client/src/routes.js | 4 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - src/Umbraco.Web.UI/umbraco/Default.aspx | 55 -- .../umbraco/Views/Default.cshtml | 9 +- src/Umbraco.Web.UI/umbraco/index.html | 32 - src/Umbraco.Web.UI/umbraco/js/umbraco.app.js | 807 ------------------ src/Umbraco.Web/Mvc/BackOfficeArea.cs | 1 - src/Umbraco.Web/UmbracoModule.cs | 39 + .../umbraco/Default.aspx.cs | 7 +- 11 files changed, 78 insertions(+), 905 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco/Default.aspx delete mode 100644 src/Umbraco.Web.UI/umbraco/index.html delete mode 100644 src/Umbraco.Web.UI/umbraco/js/umbraco.app.js diff --git a/src/Umbraco.Core/UriExtensions.cs b/src/Umbraco.Core/UriExtensions.cs index 45088aa1bf..923caf995a 100644 --- a/src/Umbraco.Core/UriExtensions.cs +++ b/src/Umbraco.Core/UriExtensions.cs @@ -2,6 +2,8 @@ using System; using System.IO; using System.Linq; using System.Text; +using System.Web; +using Umbraco.Core.Configuration; namespace Umbraco.Core { @@ -10,6 +12,23 @@ namespace Umbraco.Core /// public static class UriExtensions { + /// + /// Checks if the uri is a request for the default back office page + /// + /// + /// + internal static bool IsDefaultBackOfficeRequest(this Uri url) + { + if (url.AbsolutePath.InvariantEquals(GlobalSettings.Path.TrimEnd("/")) + || url.AbsolutePath.InvariantEquals(GlobalSettings.Path.EnsureEndsWith('/')) + || url.AbsolutePath.InvariantEquals(GlobalSettings.Path.EnsureEndsWith('/') + "Default") + || url.AbsolutePath.InvariantEquals(GlobalSettings.Path.EnsureEndsWith('/') + "Default/")) + { + return true; + } + return false; + } + /// /// This is a performance tweak to check if this is a .css, .js or .ico, .jpg, .jpeg, .png, .gif file request since /// .Net will pass these requests through to the module when in integrated mode. diff --git a/src/Umbraco.Web.UI.Client/gruntFile.js b/src/Umbraco.Web.UI.Client/gruntFile.js index a118085506..418fe4c529 100644 --- a/src/Umbraco.Web.UI.Client/gruntFile.js +++ b/src/Umbraco.Web.UI.Client/gruntFile.js @@ -99,7 +99,14 @@ module.exports = function (grunt) { files: [{ dest: '<%= distdir %>/js', src : '*.js', expand: true, cwd: 'src/common/mocks/' }] }, vs: { - files: [{ dest: '<%= vsdir %>/', src : '**', expand: true, cwd: '<%= distdir %>/' }] + files: [ + //everything except the index.html root file! + //then we need to figure out how to not copy all the test stuff either!? + { dest: '<%= vsdir %>/assets', src: '**', expand: true, cwd: '<%= distdir %>/assets' }, + { dest: '<%= vsdir %>/js', src: '**', expand: true, cwd: '<%= distdir %>/js' }, + { dest: '<%= vsdir %>/lib', src: '**', expand: true, cwd: '<%= distdir %>/lib' }, + { dest: '<%= vsdir %>/views', src: '**', expand: true, cwd: '<%= distdir %>/views' } + ] }, packages: { files: [{ dest: '<%= vsdir %>/../App_Plugins', src : '**', expand: true, cwd: 'src/packages/' }] diff --git a/src/Umbraco.Web.UI.Client/src/routes.js b/src/Umbraco.Web.UI.Client/src/routes.js index b91bb3906b..bb5ee40cf8 100644 --- a/src/Umbraco.Web.UI.Client/src/routes.js +++ b/src/Umbraco.Web.UI.Client/src/routes.js @@ -1,7 +1,7 @@ app.config(function ($routeProvider) { $routeProvider - .when('/:section', { - templateUrl: function (rp) { + .when('/:section', { + templateUrl: function (rp) { if (rp.section === "default") { rp.section = "content"; diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 6e440d873b..e8236c813f 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2175,7 +2175,6 @@ - diff --git a/src/Umbraco.Web.UI/umbraco/Default.aspx b/src/Umbraco.Web.UI/umbraco/Default.aspx deleted file mode 100644 index 963ced80c2..0000000000 --- a/src/Umbraco.Web.UI/umbraco/Default.aspx +++ /dev/null @@ -1,55 +0,0 @@ -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> - -<%@ Page Language="c#" CodeBehind="Default.aspx.cs" AutoEventWireup="True" Inherits="umbraco._Default" %> - - - - - Start Umbraco - - - - - - -
- umbraco
-
-

umbraco <%=umbraco.ui.Text("dashboard", "openinnew")%>

- - -
-
- - <%=umbraco.ui.Text("dashboard", "restart")%> - umbraco   - <%=umbraco.ui.Text("dashboard", "browser")%>
- -
-
- - (<%=umbraco.ui.Text("dashboard", "nothinghappens")%>) -
-
- - <%=umbraco.ui.Text("dashboard", "visit")%> - umbraco.org -
- - diff --git a/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml b/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml index 4650a0eb27..5ffa797bd8 100644 --- a/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml +++ b/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml @@ -11,6 +11,7 @@ + @@ -33,15 +34,15 @@
- - + + @*Currently this needs to be loaded before anything*@ - + @*And finally we can load in our angular app*@ - + diff --git a/src/Umbraco.Web.UI/umbraco/index.html b/src/Umbraco.Web.UI/umbraco/index.html deleted file mode 100644 index 4dc83db4f3..0000000000 --- a/src/Umbraco.Web.UI/umbraco/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - Umbraco - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - diff --git a/src/Umbraco.Web.UI/umbraco/js/umbraco.app.js b/src/Umbraco.Web.UI/umbraco/js/umbraco.app.js deleted file mode 100644 index 33a752cd0f..0000000000 --- a/src/Umbraco.Web.UI/umbraco/js/umbraco.app.js +++ /dev/null @@ -1,807 +0,0 @@ -'use strict'; - -define(['angular', 'namespaceMgr'], function (angular) { - - // declare and return the app module - var app = angular.module('myApp', ['uModules.Content.Helpers']); - - Umbraco.Sys.registerNamespace("Umbraco.Content"); - - var contentHelpers = angular.module('uModules.Content.Helpers', []); - - //This directive is used to associate a field with a server-side validation response - // so that the validators in angular are updated based on server-side feedback. - app.directive('valServer', function () { - return { - require: 'ngModel', - restrict: "A", - link: function (scope, element, attr, ctrl) { - if (!scope.model || !scope.model.alias) - throw "valServer can only be used in the scope of a content property object"; - var parentErrors = scope.$parent.serverErrors; - if (!parentErrors) return; - - var fieldName = scope.$eval(attr.valServer); - - //subscribe to the changed event of the element. This is required because when we - // have a server error we actually invalidate the form which means it cannot be - // resubmitted. So once a field is changed that has a server error assigned to it - // we need to re-validate it for the server side validator so the user can resubmit - // the form. Of course normal client-side validators will continue to execute. - element.keydown(function () { - if (ctrl.$invalid) { - ctrl.$setValidity('valServer', true); - } - }); - element.change(function() { - if (ctrl.$invalid) { - ctrl.$setValidity('valServer', true); - } - }); - //TODO: DO we need to watch for other changes on the element ? - - //subscribe to the server validation changes - parentErrors.subscribe(scope.model, fieldName, function (isValid, propertyErrors, allErrors) { - if (!isValid) { - ctrl.$setValidity('valServer', false); - //assign an error msg property to the current validator - ctrl.errorMsg = propertyErrors[0].errorMsg; - } - else { - ctrl.$setValidity('valServer', true); - //reset the error message - ctrl.errorMsg = ""; - } - }, true); - } - }; - }); - - app.directive('valRegex', function () { - - /// - /// A custom directive to allow for matching a value against a regex string. - /// NOTE: there's already an ng-pattern but this requires that a regex expression is set, not a regex string - /// - - return { - require: 'ngModel', - restrict: "A", - link: function (scope, elm, attrs, ctrl) { - - var regex = new RegExp(scope.$eval(attrs.valRegex)); - - var patternValidator = function (viewValue) { - //NOTE: we don't validate on empty values, use required validator for that - if (!viewValue || regex.test(viewValue)) { - // it is valid - ctrl.$setValidity('valRegex', true); - //assign a message to the validator - ctrl.errorMsg = ""; - return viewValue; - } - else { - // it is invalid, return undefined (no model update) - ctrl.$setValidity('valRegex', false); - //assign a message to the validator - ctrl.errorMsg = "Value is invalid, it does not match the correct pattern"; - return undefined; - } - }; - - ctrl.$formatters.push(patternValidator); - ctrl.$parsers.push(patternValidator); - } - }; - }); - - app.directive('umbContentProperty', function () { - return { - replace: true, //replace the element with the template - restrict: "E", //restrict to element - template: "
", - link: function (scope, element, attr, ctrl) { - - scope.editorView = ""; - - //let's make a requireJs call to try and retrieve the associated js - // for this view - if (scope.model.view && scope.model.view != "") { - //get the js file which exists at ../Js/EditorName.js - var lastSlash = scope.model.view.lastIndexOf("/"); - var fullViewName = scope.model.view.substring(lastSlash + 1, scope.model.view.length); - var viewName = fullViewName.indexOf(".") > 0 - ? fullViewName.substring(0, fullViewName.indexOf(".")) - : fullViewName; - var jsPath = scope.model.view.substring(0, lastSlash + 1) + "../Js/" + viewName + ".js"; - require([jsPath], - function () { - //the script loaded so load the view - //NOTE: The use of $apply because we're operating outside of the angular scope with this callback. - scope.$apply(function () { - scope.editorView = scope.model.view; - }); - }, function (err) { - //an error occurred... most likely there is no JS file to load for this editor - //NOTE: The use of $apply because we're operating outside of the angular scope with this callback. - scope.$apply(function () { - scope.editorView = scope.model.view; - }); - }); - } - else { - scope.editorView = editor; - } - } - }; - }); - - ////This is a highly specialized directive used to load in a property editor. - //// It is similar to ngInclude, however ngInclude does not emit an event before it compiles the - //// output whereas before we compile the view after we've retreived it from http, we want to check - //// for an ngController attribute and if we find one, then we'll make a request to load in the JS. - //app.directive('umbContentProperty', ['$http', '$templateCache', '$anchorScroll', '$compile', - // function($http, $templateCache, $anchorScroll, $compile) { - // return { - // replace: true, //replace the element with the template - // restrict: "E", //restrict to element - // terminal: true, - // compile: function(element, attr) { - // var srcExp = attr.ngInclude || attr.src; - - // return function(scope, element) { - // var changeCounter = 0, - // childScope; - - // var clearContent = function() { - // if (childScope) { - // childScope.$destroy(); - // childScope = null; - // } - - // element.html(''); - // }; - - // scope.$watch(srcExp, function ngIncludeWatchAction(src) { - // var thisChangeId = ++changeCounter; - - // if (src) { - // $http.get(src, { cache: $templateCache }).success(function(response) { - // if (thisChangeId !== changeCounter) return; - - // if (childScope) childScope.$destroy(); - // childScope = scope.$new(); - - // element.html(response); - // $compile(element.contents())(childScope); - - // if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { - // $anchorScroll(); - // } - - // childScope.$emit('$includeContentLoaded'); - // scope.$eval(onloadExp); - // }).error(function() { - // if (thisChangeId === changeCounter) clearContent(); - // }); - // } - // else clearContent(); - // }); - // }; - // } - // }; - // }]); - - - //This directive is used to control the display of the property level validation message. - // We will listen for server side validation changes based on the parent scope's error collection - // and when an error is detected for this property we'll show the error message and then we need - // to emit the valBubble event so that any parent listening can update it's UI (like the validation summary) - app.directive('valPropertyMessage', function() { - return { - scope: true, // create a new scope for this directive - replace: true, //replace the element with the template - restrict: "E", //restrict to element - template: "
{{errorMsg}}
", - link: function(scope, element, attr, ctrl) { - - if (!scope.propertyForm) - throw "valPropertyMessage must exist within a form called propertyForm"; - - //flags for use in the below closures - var showValidation = false; - var hasError = false; - - //create properties on our custom scope so we can use it in our template - scope.errorMsg = ""; - - //listen for form validation - scope.$watch("$parent.propertyForm.$valid", function(isValid, oldValue) { - if (!isValid) { - //check if it's one of the properties that is invalid in the current content property - if (element.closest(".content-property").find(".ng-invalid").length > 0) { - hasError = true; - if (showValidation) { - //update the validation message - scope.errorMsg = scope.$parent.$parent.serverErrors.getError(scope.$parent.model, ''); - } - } - else { - hasError = false; - scope.errorMsg = ""; - } - } - else { - hasError = false; - scope.errorMsg = ""; - } - }); - - //add a watch to update our waitingOnValidation flag for use in the above closure - scope.$watch("$parent.$parent.ui.waitingOnValidation", function(isWaiting, oldValue) { - showValidation = isWaiting; - if (hasError && showValidation) { - //update the validation message - scope.errorMsg = scope.$parent.$parent.serverErrors.getError(scope.$parent.model, ''); - } - else { - scope.errorMsg = ""; - } - }); - - var parentErrors = scope.$parent.$parent.serverErrors; - if (!parentErrors) return; - //NOTE: we pass in "" in order to listen for all validation changes to the content property, not for - // validation changes to fields in the property this is because some server side validators may not - // return the field name for which the error belongs too, just the property for which it belongs. - parentErrors.subscribe(scope.model, "", function(isValid, propertyErrors, allErrors) { - hasError = !isValid; - if (hasError) { - //set the error message to the server message - scope.errorMsg = propertyErrors[0].errorMsg; - //now that we've used the server validation message, we need to remove it from the - //error collection... it is a 'one-time' usage so that when the field is invalidated - //again, the message we display is the client side message. - //NOTE: 'this' in the subscribe callback context is the validation manager object. - this.removeError(scope.model, ""); - //emit an event upwards - scope.$emit("valBubble", { - isValid: false, // it is INVALID - element: element, // the element that the validation applies to - scope: scope.$parent, // the parent scope since we've creaed a new one for this directive - ctrl: ctrl // the current controller - }); - } - else { - scope.errorMsg = ""; - //emit an event upwards - scope.$emit("valBubble", { - isValid: true, // it is VALID - element: element, // the element that the validation applies to - scope: scope.$parent, // the parent scope since we've creaed a new one for this directive - ctrl: ctrl // the current controller - }); - } - }, true); - - } - }; - }); - - //This directive is used for validation messages to associate them with a field that the message is for. - // It is referenced from valToggleMsg. - app.directive('valMsgFor', function () { - return { - restrict: "A", - link: function (scope, element, attr, ctrl) { - //This directive doesn't actually do anything though, it's referenced from valToggleMsg - } - }; - }); - - //This directive will show/hide an error based on: - // * is the value + the given validator invalid - // * AND, has the form been submitted ? - app.directive('valToggleMsg', function (u$AngularHelper) { - return { - restrict: "A", - link: function (scope, element, attr, ctrl) { - - if (!attr.valToggleMsg) - throw "valToggleMsg requires that a reference to a validator is specified"; - if (!attr.valMsgFor) - throw "valToggleMsg requires that the attribute valMsgFor exists on the element"; - - //create a flag for us to be able to reference in the below closures for watching. - var showValidation = false; - var hasError = false; - - var currentForm = u$AngularHelper.getCurrentForm(scope); - if (!currentForm || !currentForm.$name) - throw "valToggleMsg requires that a name is assigned to the ng-form containing the validated input"; - - //add a watch to the validator for the value (i.e. $parent.myForm.value.$error.required ) - scope.$watch(currentForm.$name + "." + attr.valMsgFor + ".$error." + attr.valToggleMsg, function (isInvalid, oldValue) { - hasError = isInvalid; - if (hasError && showValidation) { - element.show(); - } - else { - element.hide(); - } - }); - - //add a watch to update our waitingOnValidation flag for use in the above closure - scope.$watch("$parent.ui.waitingOnValidation", function (isWaiting, oldValue) { - showValidation = isWaiting; - if (hasError && showValidation) { - element.show(); - } - else { - element.hide(); - } - }); - } - }; - }); - - //This directive will bubble up a notification via an emit event (upwards) - // describing the state of the validation element. This is useful for - // parent elements to know about child element validation state. - app.directive('valBubble', function (u$AngularHelper) { - return { - require: 'ngModel', - restrict: "A", - link: function (scope, element, attr, ctrl) { - - if (!attr.name) { - throw "valBubble must be set on an input element that has a 'name' attribute"; - } - - var currentForm = u$AngularHelper.getCurrentForm(scope); - if (!currentForm || !currentForm.$name) - throw "valBubble requires that a name is assigned to the ng-form containing the validated input"; - - //watch the current form's validation for the current field name - scope.$watch(currentForm.$name + "." + ctrl.$name + ".$valid", function (isValid, lastValue) { - if (isValid != undefined) { - //emit an event upwards - scope.$emit("valBubble", { - isValid: isValid, // if the field is valid - element: element, // the element that the validation applies to - expression: this.exp, // the expression that was watched to check validity - scope: scope, // the current scope - ctrl: ctrl // the current controller - }); - } - }); - } - }; - }); - - //This directive will display a validation summary for the current form based on the - //content properties of the current content item. - app.directive('valSummary', function () { - return { - scope: true, // create a new scope for this directive - replace: true, // replace the html element with the template - restrict: "E", // restrict to an element - template: '
  • {{model}}
', - link: function (scope, element, attr, ctrl) { - - //create properties on our custom scope so we can use it in our template - scope.validationSummary = []; - - //create a flag for us to be able to reference in the below closures for watching. - var showValidation = false; - - //add a watch to update our waitingOnValidation flag for use in the below closures - scope.$watch("$parent.ui.waitingOnValidation", function (isWaiting, oldValue) { - showValidation = isWaiting; - if (scope.validationSummary.length > 0 && showValidation) { - element.show(); - } - else { - element.hide(); - } - }); - - //if we are to show field property based errors. - //this requires listening for bubbled events from valBubble directive. - - scope.$parent.$on("valBubble", function (evt, args) { - var msg = "The value assigned for the property " + args.scope.model.label + " is invalid"; - var exists = _.contains(scope.validationSummary, msg); - - //we need to check if the entire property is valid, even though the args says this field is valid there - // may be multiple values attached to a content property. The easiest way to do this is check the DOM - // just like we are doing for the property level validation message. - var propertyHasErrors = args.element.closest(".content-property").find(".ng-invalid").length > 0; - - if (args.isValid && exists && !propertyHasErrors) { - //it is valid but we have a val msg for it so we'll need to remove the message - scope.validationSummary = _.reject(scope.validationSummary, function (item) { - return item == msg; - }); - } - else if (!args.isValid && !exists) { - //it is invalid and we don't have a msg for it already - scope.validationSummary.push(msg); - } - - //show the summary if there are errors and the form has been submitted - if (showValidation && scope.validationSummary.length > 0) { - element.show(); - } - }); - //listen for form invalidation so we know when to hide it - scope.$watch("contentForm.$error", function (errors) { - //check if there is an error and hide the summary if not - var hasError = _.find(errors, function (err) { - return (err.length && err.length > 0); - }); - if (!hasError) { - element.hide(); - } - }, true); - } - }; - }); - - //A directive applied to a file input box so that outer scopes can listen for when a file is selected - app.directive('umbFileUpload', function () { - return { - scope: true, //create a new scope - link: function (scope, el, attrs) { - el.bind('change', function (event) { - var files = event.target.files; - //emit event upward - scope.$emit("filesSelected", { files: files }); - }); - } - }; - }); - - //A helper class for dealing with content - contentHelpers.factory('u$ContentHelper', function () { - return { - formatPostData: function (displayModel) { - /// formats the display model used to display the content to the model used to save the content - - //NOTE: the display model inherits from the save model so we can in theory just post up the display model but - // we don't want to post all of the data as it is unecessary. - - var saveModel = { - id: displayModel.id, - properties: [] - }; - for (var p in displayModel.properties) { - saveModel.properties.push({ - id: displayModel.properties[p].id, - value: displayModel.properties[p].value - }); - } - return saveModel; - } - }; - }); - - //This service is some helper methods for extending angular - contentHelpers.factory('u$AngularHelper', function() { - return { - getCurrentForm: function(scope) { - /// Returns the current form object applied to the scope or null if one is not found - //NOTE: There isn't a way in angular to get a reference to the current form object since the form object - // is just defined as a property of the scope when it is named but you'll always need to know the name which - // isn't very convenient. If we want to watch for validation changes we need to get a form reference. - // The way that we detect the form object is a bit hackerific in that we detect all of the required properties - // that exist on a form object. - - var form = null; - var requiredFormProps = ["$error", "$name", "$dirty", "$pristine", "$valid", "$invalid", "$addControl", "$removeControl", "$setValidity", "$setDirty"]; - for (var p in scope) { - if (_.isObject(scope[p]) && !_.isFunction(scope[p]) && !_.isArray(scope[p]) && p.substr(0, 1) != "$") { - var props = _.keys(scope[p]); - if (props.length < requiredFormProps.length) continue; - if (_.every(requiredFormProps, function(item) { - return _.contains(props, item); - })) { - form = scope[p]; - break; - } - } - } - return form; - } - }; - }); - - //This service is used to wire up all server-side valiation messages - // back into the UI in a consistent format. - contentHelpers.factory('u$ServerValidation', function () { - - return { - _callbacks: [], - subscribe: function (contentProperty, fieldName, callback) { - /// - /// Adds a callback method that is executed whenever validation changes for the field name + property specified. - /// This is generally used for server side validation in order to match up a server side validation error with - /// a particular field, otherwise we can only pinpoint that there is an error for a content property, not the - /// property's specific field. This is used with the val-server directive in which the directive specifies the - /// field alias to listen for. - /// - - this._callbacks.push({ propertyAlias: contentProperty.alias, fieldName: fieldName, callback: callback }); - }, - getCallbacks: function (contentProperty, fieldName) { - /// Gets all callbacks that has been registered using the subscribe method for the contentProperty + fieldName combo - var found = _.filter(this._callbacks, function (item) { - return (item.propertyAlias == contentProperty.alias && item.fieldName == fieldName); - }); - return found; - }, - addError: function (contentProperty, fieldName, errorMsg) { - /// Adds an error message for the content property - - if (!contentProperty) return; - //only add the item if it doesn't exist - if (!this.hasError(contentProperty)) { - this.items.push({ - propertyAlias: contentProperty.alias, - fieldName: fieldName, - errorMsg: errorMsg - }); - } - - - //find all errors for this item - var errorsForCallback = _.filter(this.items, function (item) { - return (item.propertyAlias == contentProperty.alias && item.fieldName == fieldName); - }); - //we should now call all of the call backs registered for this error - var callbacks = this.getCallbacks(contentProperty, fieldName); - //call each callback for this error - for (var cb in callbacks) { - callbacks[cb].callback.apply(this, [ - false, //pass in a value indicating it is invalid - errorsForCallback, //pass in the errors for this item - this.items]); //pass in all errors in total - } - }, - removeError: function (contentProperty, fieldName) { - /// Removes an error message for the content property - - if (!contentProperty) return; - //remove the item - this.items = _.reject(this.items, function(item) { - return (item.propertyAlias == contentProperty.alias && item.fieldName == fieldName); - }); - }, - reset: function() { - /// Clears all errors and notifies all callbacks that all server errros are now valid - used when submitting a form - this.items = []; - for (var cb in this._callbacks) { - this._callbacks[cb].callback.apply(this, [ - true, //pass in a value indicating it is VALID - [], //pass in empty collection - []]); //pass in empty collection - } - }, - getError: function (contentProperty, fieldName) { - /// - /// Gets the error message for the content property - /// - var err = _.find(this.items, function(item) { - return (item.propertyAlias == contentProperty.alias && item.fieldName == fieldName); - }); - //return generic property error message if the error doesn't exist - return err ? err : "Property has errors"; - }, - hasError: function (contentProperty, fieldName) { - var err = _.find(this.items, function (item) { - return (item.propertyAlias == contentProperty.alias && item.fieldName == fieldName); - }); - return err ? true : false; - }, - items: [] - }; - }); - - Umbraco.Content.ContentController = function ($scope, $element, $http, u$ContentHelper, u$ServerValidation) { - - //initialize the data model and methods - $scope.model = {}; - $scope.files = []; - $scope.addFiles = function(propertyId, files) { - //this will clear the files for the current property and then add the new ones for the current property - $scope.files = _.reject($scope.files, function(item) { - return item.id == propertyId; - }); - for (var i = 0; i < files.length; i++) { - //save the file object to the scope's files collection - $scope.files.push({ id: propertyId, file: files[i] }); - } - }; - //model for updating the UI - $scope.ui = { - working: false, - formFailed: false, - canSubmit: function () { - //NOTE: we're getting the form element for the current element so we're not hard coding - // the reference to the form name here. - //return $scope[$element.closest("form").attr("name")].$valid || !$scope.ui.working; - return !$scope.ui.working; - } - }; - //wire up validation manager - $scope.serverErrors = u$ServerValidation; - - //the url to get the content from - var getContentUrl = Umbraco.Sys.ServerVariables.contentEditorApiBaseUrl + "GetContent?id=" + 1166; - var saveContentUrl = Umbraco.Sys.ServerVariables.contentEditorApiBaseUrl + "PostSaveContent"; - - //go get the content from the server - $scope.ui.working = true; - $http.get(getContentUrl, $scope.valueToPost). - success(function (data, status, headers, config) { - //set the model to the value returned by the server - $scope.model = data; - $scope.ui.working = false; - }). - error(function (data, status, headers, config) { - alert("failed!"); - $scope.ui.working = false; - }); - - $scope.save = function () { - - //flag that is set informing the validation controls to be displayed if any are in error - $scope.ui.waitingOnValidation = true; - - //don't continue if the form is invalid - if ($scope.contentForm.$invalid) return; - - //reset all errors and listeners - $scope.serverErrors.reset(); - - $scope.ui.working = true; - - //broadcast an event downward - $scope.$broadcast("contentSaving", null); - - $http({ - method: 'POST', - url: saveContentUrl, - //IMPORTANT!!! You might think this should be set to 'multipart/form-data' but this is not true because when we are sending up files - // the request needs to include a 'boundary' parameter which identifies the boundary name between parts in this multi-part request - // and setting the Content-type manually will not set this boundary parameter. For whatever reason, setting the Content-type to 'false' - // will force the request to automatically populate the headers properly including the boundary parameter. - headers: { 'Content-Type': false }, - transformRequest: function (data) { - var formData = new FormData(); - //need to convert our json object to a string version of json - formData.append("contentItem", angular.toJson(u$ContentHelper.formatPostData(data.model))); - //now add all of the assigned files - for (var f in data.files) { - //each item has a property id and the file object, we'll ensure that the id is suffixed to the key - // so we know which property it belongs to on the server side - formData.append("file_" + data.files[f].id, data.files[f].file); - } - return formData; - }, - data: { model: $scope.model, files: $scope.files } - }). - success(function(data, status, headers, config) { - alert("success!"); - - //clear the files - $scope.files = []; - - //broadcast an event downward - $scope.$broadcast("contentSaved", null); - - //set the model to the value returned by the server - $scope.model = data; - $scope.ui.working = false; - $scope.ui.waitingOnValidation = false; - $scope.serverErrors.reset(); - }). - error(function(data, status, headers, config) { - //When the status is a 403 status, we have validation errors. - //Otherwise the error is probably due to invalid data (i.e. someone mucking around with the ids or something). - //Or, some strange server error - if (status == 403) { - //now we need to look through all the validation errors - if (data && data.ModelState) { - for (var e in data.ModelState) { - - //the alias in model state can be in dot notation which indicates - // * the first part is the content property alias - // * the second part is the field to which the valiation msg is associated with - var parts = e.split("."); - var propertyAlias = parts[0]; - - //find the content property for the current error - var contentProperty = _.find($scope.model.properties, function(item) { - return (item.alias == propertyAlias); - }); - if (contentProperty) { - //if it contains a '.' then we will wire it up to a property's field - if (parts.length > 1) { - //add an error with a reference to the field for which the validation belongs too - $scope.serverErrors.addError(contentProperty, parts[1], data.ModelState[e][0]); - } - else { - //add a generic error for the property, no reference to a specific field - $scope.serverErrors.addError(contentProperty, "", data.ModelState[e][0]); - } - } - } - - } - } - else { - alert("failed!"); - } - - $scope.ui.working = false; - $scope.ui.waitingOnValidation = true; - }); - - //$http.post(saveContentUrl, u$ContentHelper.formatPostData($scope.model)). - // success(function (data, status, headers, config) { - // alert("success!"); - // $scope.ui.working = false; - // $scope.ui.waitingOnValidation = false; - // $scope.serverErrors.reset(); - // }). - // error(function (data, status, headers, config) { - // //When the status is a 403 status, we have validation errors. - // //Otherwise the error is probably due to invalid data (i.e. someone mucking around with the ids or something). - // //Or, some strange server error - // if (status == 403) { - // //now we need to look through all the validation errors - // if (data && data.ModelState) { - // for (var e in data.ModelState) { - - // //the alias in model state can be in dot notation which indicates - // // * the first part is the content property alias - // // * the second part is the field to which the valiation msg is associated with - // var parts = e.split("."); - // var propertyAlias = parts[0]; - - // //find the content property for the current error - // var contentProperty = _.find($scope.model.properties, function(item) { - // return (item.alias == propertyAlias); - // }); - // if (contentProperty) { - // //if it contains a '.' then we will wire it up to a property's field - // if (parts.length > 1) { - // //add an error with a reference to the field for which the validation belongs too - // $scope.serverErrors.addError(contentProperty, parts[1], data.ModelState[e][0]); - // } - // else { - // //add a generic error for the property, no reference to a specific field - // $scope.serverErrors.addError(contentProperty, "", data.ModelState[e][0]); - // } - // } - // } - - // } - // } - // else { - // alert("failed!"); - // } - - // $scope.ui.working = false; - // $scope.ui.waitingOnValidation = true; - // }); - }; - - }; - - - //return the module - return app; - -}); \ No newline at end of file diff --git a/src/Umbraco.Web/Mvc/BackOfficeArea.cs b/src/Umbraco.Web/Mvc/BackOfficeArea.cs index b91cbba9b2..33d0629161 100644 --- a/src/Umbraco.Web/Mvc/BackOfficeArea.cs +++ b/src/Umbraco.Web/Mvc/BackOfficeArea.cs @@ -21,7 +21,6 @@ namespace Umbraco.Web.Mvc /// public override void RegisterArea(AreaRegistrationContext context) { - //Default back office route context.MapRoute( "Umbraco_back_office", GlobalSettings.UmbracoMvcArea + "/{action}/{id}", diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index c93b99d180..6b4668854a 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -63,6 +63,14 @@ namespace Umbraco.Web /// Processses the Umbraco Request ///
/// + /// + /// + /// This will check if we are trying to route to the default back office page (i.e. ~/Umbraco/ or ~/Umbraco or ~/Umbraco/Default ) + /// and ensure that the MVC handler executes for that. This is required because the route for /Umbraco will never execute because + /// files/folders exist there and we cannot set the RouteCollection.RouteExistingFiles = true since that will muck a lot of other things up. + /// So we handle it here and explicitly execute the MVC controller. + /// + /// void ProcessRequest(HttpContextBase httpContext) { // do not process if client-side request @@ -76,6 +84,13 @@ namespace Umbraco.Web var umbracoContext = UmbracoContext.Current; + //re-write for the default back office path + if (httpContext.Request.Url.IsDefaultBackOfficeRequest()) + { + RewriteToBackOfficeHandler(httpContext); + return; + } + // do not process but remap to handler if it is a base rest request if (BaseRest.BaseRestHandler.IsBaseRestRequest(umbracoContext.OriginalRequestUrl)) { @@ -345,6 +360,30 @@ namespace Umbraco.Web #endregion + /// + /// Rewrites to the default back office page. + /// + /// + private void RewriteToBackOfficeHandler(HttpContextBase context) + { + // GlobalSettings.Path has already been through IOHelper.ResolveUrl() so it begins with / and vdir (if any) + var rewritePath = GlobalSettings.Path.TrimEnd(new[] { '/' }) + "/Default"; + // rewrite the path to the path of the handler (i.e. /umbraco/RenderMvc) + context.RewritePath(rewritePath, "", "", false); + + //if it is MVC we need to do something special, we are not using TransferRequest as this will + //require us to rewrite the path with query strings and then reparse the query strings, this would + //also mean that we need to handle IIS 7 vs pre-IIS 7 differently. Instead we are just going to create + //an instance of the UrlRoutingModule and call it's PostResolveRequestCache method. This does: + // * Looks up the route based on the new rewritten URL + // * Creates the RequestContext with all route parameters and then executes the correct handler that matches the route + //we also cannot re-create this functionality because the setter for the HttpContext.Request.RequestContext is internal + //so really, this is pretty much the only way without using Server.TransferRequest and if we did that, we'd have to rethink + //a bunch of things! + var urlRouting = new UrlRoutingModule(); + urlRouting.PostResolveRequestCache(context); + } + /// /// Rewrites to the correct Umbraco handler, either WebForms or Mvc /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Default.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Default.aspx.cs index e3f11e6d80..78d6b82778 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Default.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Default.aspx.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; +using System.Web.Mvc; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; @@ -18,8 +19,10 @@ namespace umbraco { protected void Page_Load(object sender, System.EventArgs e) { - - Server.Transfer("umbraco.aspx"); + //var mvcHandler = new MvcHandler() + //Server.TransferRequest(); + //Server.Transfer("~/Umbraco/Default"); + //Server.Transfer("umbraco.aspx"); // Put user code to initialize the page here } From d9deae39efeecc2c04fa0a30dd7db9ae28c9f2af Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 13:46:59 +1000 Subject: [PATCH 64/85] fixed merge issue --- .../umbraco/webservices/legacyAjaxCalls.asmx.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs index 9510676701..ecb13f2599 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs @@ -67,10 +67,16 @@ namespace umbraco.presentation.webservices int intNodeId; if (nodeType == "memberGroup") { - presentation.create.dialogHandler_temp.Delete(nodeType, 0, alias); + LegacyDialogHandler.Delete( + new HttpContextWrapper(HttpContext.Current), + UmbracoUser, + nodeType, 0, nodeId); } - else if (int.TryParse(nodeId, out intNodeID) && nodeType != "member") // Fix for #26965 - numeric member login gets parsed as nodeId + else if (int.TryParse(nodeId, out intNodeId) && nodeType != "member") // Fix for #26965 - numeric member login gets parsed as nodeId { + LegacyDialogHandler.Delete( + new HttpContextWrapper(HttpContext.Current), + UmbracoUser, nodeType, intNodeId, alias); } else From 2e91c89c023b0fb23f9ef7f8ca57736498ae4f20 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 14:00:52 +1000 Subject: [PATCH 65/85] Fixes null check for changes to RuntimeCacheProvider --- .../Caching/RuntimeCacheProvider.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index 6a53e8bc5c..809d1b88f5 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -25,6 +25,10 @@ namespace Umbraco.Core.Persistence.Caching /// NOTE: These changes are all temporary until we finalize the ApplicationCache implementation which will support static cache, runtime cache /// and request based cache which will all live in one central location so it is easily managed. /// + /// Also note that we don't always keep checking if HttpContext.Current == null and instead check for _memoryCache != null. This is because + /// when there are async requests being made even in the context of a web request, the HttpContext.Current will be null but the HttpRuntime.Cache will + /// always be available. + /// /// internal sealed class RuntimeCacheProvider : IRepositoryCacheProvider { @@ -52,7 +56,7 @@ namespace Umbraco.Core.Persistence.Caching public IEntity GetById(Type type, Guid id) { var key = GetCompositeId(type, id); - var item = HttpContext.Current == null + var item = _memoryCache != null ? _memoryCache.Get(key) : HttpRuntime.Cache.Get(key); return item as IEntity; @@ -62,7 +66,7 @@ namespace Umbraco.Core.Persistence.Caching { foreach (var guid in ids) { - var item = HttpContext.Current == null + var item = _memoryCache != null ? _memoryCache.Get(GetCompositeId(type, guid)) : HttpRuntime.Cache.Get(GetCompositeId(type, guid)); @@ -76,7 +80,7 @@ namespace Umbraco.Core.Persistence.Caching { if (key.StartsWith(type.Name)) { - var item = HttpContext.Current == null + var item = _memoryCache != null ? _memoryCache.Get(key) : HttpRuntime.Cache.Get(key); @@ -94,7 +98,7 @@ namespace Umbraco.Core.Persistence.Caching //NOTE: Before we were checking if it already exists but the MemoryCache.Set handles this implicitly and does // an add or update, same goes for HttpRuntime.Cache.Insert. - if (HttpContext.Current == null) + if (_memoryCache != null) { _memoryCache.Set(key, entity, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }); } @@ -107,7 +111,7 @@ namespace Umbraco.Core.Persistence.Caching public void Delete(Type type, IEntity entity) { var key = GetCompositeId(type, entity.Id); - if (HttpContext.Current == null) + if (_memoryCache != null) { _memoryCache.Remove(key); } @@ -137,7 +141,7 @@ namespace Umbraco.Core.Persistence.Caching } foreach (var key in keysToRemove) { - if (HttpContext.Current == null) + if (_memoryCache != null) { _memoryCache.Remove(key); } @@ -155,7 +159,7 @@ namespace Umbraco.Core.Persistence.Caching { _keyTracker.Clear(); - if (HttpContext.Current == null) + if (_memoryCache != null) { _memoryCache.DisposeIfDisposable(); _memoryCache = new MemoryCache("in-memory"); From dadb98176d6836ee69871020f2d1d34c0c013d62 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 14:01:41 +1000 Subject: [PATCH 66/85] starts fixing up upload prop editor to be the same as the 6.x < one so that it is 100% compatible --- .../src/views/propertyeditors/fileupload/fileupload.html | 7 ++----- .../umbraco/readonlyvalue/readonlyvalue.html | 3 --- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html index 1bd79dadb3..1257abfa70 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html @@ -2,11 +2,8 @@
- -
-
    -
  • {{file.file.name}}
  • -
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html deleted file mode 100644 index 738adb1ff6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html +++ /dev/null @@ -1,3 +0,0 @@ -

- {{model.value|json}} -

\ No newline at end of file From 53891a69afe366668a80bb5f0761ea0d6b1bd70f Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 16:43:08 +1000 Subject: [PATCH 67/85] Fixed up the media uploader property editor so that it doesn't store any json, this leaves it as fully backwards compatible with 6.x < but also still allows us to upload multiple images if we want. --- .../common/mocks/umbraco.servervariables.js | 3 +- .../src/common/services/util.service.js | 23 ++++----- .../src/less/modals.less | 17 ++++--- .../fileupload/fileupload.controller.js | 20 +++----- .../fileupload/fileupload.html | 10 ++-- .../common/services/umb-image-helper.spec.js | 38 ++++++++++++++ src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- .../Editors/BackOfficeController.cs | 3 +- .../PropertyEditors/FileUploadValueEditor.cs | 50 +++++++------------ 9 files changed, 96 insertions(+), 70 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/test/unit/common/services/umb-image-helper.spec.js diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js index bd8c505a3d..2a51738bbd 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js @@ -15,7 +15,8 @@ Umbraco.Sys.ServerVariables = { "legacyTreeJs": "/belle/lib/yepnope/empty.js", }, umbracoSettings: { - "umbracoPath": "/umbraco" + "umbracoPath": "/umbraco", + "imageFileTypes": "jpeg,jpg,gif,bmp,png,tiff,tif" }, isDebuggingEnabled: true }; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index b3713da0f6..51e3d9b748 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -208,15 +208,16 @@ function umbImageHelper() { return item.alias === 'umbracoFile'; }); var imageVal; - //Legacy images will be saved as a string, not an array so we will convert the legacy values - // to our required structure. - if (imageProp.value.startsWith('[')) { - imageVal = options.scope.$eval(imageProp.value); - } - else { - imageVal = [{ file: imageProp.value, isImage: this.detectIfImageByExtension(imageProp.value) }]; - } + //our default images might store one or many images (as csv) + var split = imageProp.value.split(','); + var self = this; + imageVal = _.map(split, function(item) { + return { file: item, isImage: self.detectIfImageByExtension(item) }; + }); + + //for now we'll just return the first image in the collection. + //TODO: we should enable returning many to be displayed in the picker if the uploader supports many. if (imageVal.length && imageVal.length > 0 && imageVal[0].isImage) { return imageVal[0].file; } @@ -242,10 +243,8 @@ function umbImageHelper() { }, detectIfImageByExtension: function(imagePath) { var lowered = imagePath; - if (lowered.endsWith(".jpg") || lowered.endsWith(".gif") || lowered.endsWith(".jpeg") || lowered.endsWith(".png")) { - return true; - } - return false; + var ext = lowered.substr(lowered.lastIndexOf(".") + 1); + return ("," + Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes + ",").indexOf("," + ext + ",") !== -1; } }; } diff --git a/src/Umbraco.Web.UI.Client/src/less/modals.less b/src/Umbraco.Web.UI.Client/src/less/modals.less index 152702b4d0..07149a27a5 100644 --- a/src/Umbraco.Web.UI.Client/src/less/modals.less +++ b/src/Umbraco.Web.UI.Client/src/less/modals.less @@ -136,9 +136,9 @@ border:none; } -.umb-modal .thumbnails > li:nth-child(2) { +/*.umb-modal .thumbnails > li:nth-child(2) { margin: 0 0 20px 0 -} +}*/ .umb-modal .thumbnails > li { margin: 0 20px 20px 0; @@ -146,7 +146,7 @@ } .umb-modal .thumbnail img { - height: 120px + /*height: 100px;*/ } .umb-modal .thumbnails .selected img, .umb-modal .thumbnails img:hover { @@ -154,8 +154,8 @@ } .umb-modal .thumbnails > li.folder { - width: 120px; - height: 120px; + width: 100px; + /*height: 100px;*/ display: block; background: @grayLighter; text-align: center; @@ -165,12 +165,13 @@ .umb-modal .thumbnails > li.folder .icon-folder-close { color: @grayLight; display: block; - font-size: 96px + font-size: 96px; + width:100px; } .umb-modal .thumbnails > li.folder a { - width: 120px; - height: 120px; + width: 100px; + height: 100px; display: block } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js index 550336d28f..51b51de12d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js @@ -20,28 +20,24 @@ function fileUploadController($scope, $element, $compile, umbImageHelper) { //clear the current files $scope.files = []; + //create the property to show the list of files currently saved if ($scope.model.value != "") { - //for legacy data, this will not be an array, just a string so convert to an array - if (!$scope.model.value.startsWith('[')) { - - //check if it ends with a common image extensions - var isImage = umbImageHelper.detectIfImageByExtension($scope.model.value); - $scope.model.value = "[{\"file\": \"" + $scope.model.value + "\",\"isImage\":" + isImage + "}]"; - } - - $scope.persistedFiles = angular.fromJson($scope.model.value); + var images = $scope.model.value.split(","); + + $scope.persistedFiles = _.map(images, function (item) { + return { file: item, isImage: umbImageHelper.detectIfImageByExtension(item) }; + }); } else { $scope.persistedFiles = []; } - + _.each($scope.persistedFiles, function (file) { file.thumbnail = umbImageHelper.getThumbnailFromPath(file.file); }); - - + $scope.clearFiles = false; //listen for clear files changes to set our model to be sent up to the server diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html index 1257abfa70..9cbbf816af 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html @@ -2,12 +2,14 @@
- -
+ +
+
    +
  • {{file.file.name}}
  • +
-
-

Current files

+
  • diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-image-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-image-helper.spec.js new file mode 100644 index 0000000000..55325397ac --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-image-helper.spec.js @@ -0,0 +1,38 @@ +describe('icon helper tests', function () { + var umbImageHelper; + + beforeEach(module('umbraco.services')); + beforeEach(module('umbraco.mocks')); + + beforeEach(inject(function ($injector) { + umbImageHelper = $injector.get('umbImageHelper'); + })); + + describe('basic utility methods return correct values', function () { + + it('detects an image based file', function () { + + var image1 = "a-jpeg.jpg"; + var image2 = "a-png.png"; + var image3 = "thisisagif.blah.gif"; + var doc1 = "anormaldocument.doc"; + + expect(umbImageHelper.detectIfImageByExtension(image1)).toBe(true); + expect(umbImageHelper.detectIfImageByExtension(image2)).toBe(true); + expect(umbImageHelper.detectIfImageByExtension(image3)).toBe(true); + expect(umbImageHelper.detectIfImageByExtension(doc1)).toBe(false); + }); + + it('gets a thumbnail path', function () { + + var image1 = "a-jpeg.jpg"; + var image2 = "a-png.png"; + var image3 = "thisisagif.blah.gif"; + + expect(umbImageHelper.getThumbnailFromPath(image1)).toBe("a-jpeg_thumb.jpg"); + expect(umbImageHelper.getThumbnailFromPath(image2)).toBe("a-png_thumb.jpg"); + expect(umbImageHelper.getThumbnailFromPath(image3)).toBe("thisisagif.blah_thumb.jpg"); + }); + + }); +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 66d25afd0a..9a8e3f7012 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2599,7 +2599,7 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True 6130 / - http://localhost:6130 + http://localhost:6230 False False diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 7383d2b806..486b5f4035 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -66,7 +66,8 @@ namespace Umbraco.Web.Editors { "umbracoSettings", new Dictionary { - {"umbracoPath", GlobalSettings.Path} + {"umbracoPath", GlobalSettings.Path}, + {"imageFileTypes", UmbracoSettings.ImageFileTypes}, } }, { "isDebuggingEnabled", HttpContext.IsDebuggingEnabled } diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs index fbdcfec45c..f1a0983e71 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs @@ -6,6 +6,7 @@ using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core.IO; +using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Models.Editors; using Umbraco.Core.PropertyEditors; @@ -45,32 +46,30 @@ namespace Umbraco.Web.PropertyEditors //check the editorValue value to see if we need to clear the files or not var clear = false; if (editorValue.Value.IsNullOrWhiteSpace() == false) - { - var parsed = JObject.Parse(editorValue.Value); - clear = parsed["clearFiles"].Value(); - } - - //parse the current value - var currentPersistedValues = new JArray(); - if (currentValue != null) { try { - currentPersistedValues = JArray.Parse(currentValue.ToString()); + var parsed = JObject.Parse(editorValue.Value); + clear = parsed["clearFiles"].Value(); } catch (JsonReaderException) { - //if we cannot parse, we'll ignore the error and start again, there must be a bad value stored for some reason + clear = false; } } - var newValue = new JArray(); + var currentPersistedValues = new string[] {}; + if (currentValue != null) + { + currentPersistedValues = currentValue.ToString().Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); + } + + var newValue = new List(); if (clear) { //TODO: Need to delete our old files! - - return newValue.ToString(Formatting.None); + return ""; } //check for any files @@ -87,8 +86,8 @@ namespace Umbraco.Web.PropertyEditors { var file = filesAsArray[i]; - var currentPersistedFile = currentPersistedValues.Count >= (i + 1) - ? currentPersistedValues[i]["file"].ToString() + var currentPersistedFile = currentPersistedValues.Length >= (i + 1) + ? currentPersistedValues[i] : ""; var name = IOHelper.SafeFileName(file.FileName.Substring(file.FileName.LastIndexOf(IOHelper.DirSepChar) + 1, file.FileName.Length - file.FileName.LastIndexOf(IOHelper.DirSepChar) - 1).ToLower()); @@ -110,18 +109,8 @@ namespace Umbraco.Web.PropertyEditors { var umbracoFile = UmbracoFile.Save(fileStream, fileName); - //create json to be saved - var forPersisting = JObject.FromObject(new - { - file = umbracoFile.Url, - isImage = false - }); - - if (umbracoFile.SupportsResizing) { - forPersisting["isImage"] = true; - // make default thumbnail umbracoFile.Resize(100, "thumb"); @@ -137,23 +126,22 @@ namespace Umbraco.Web.PropertyEditors } } } - - //add this to the persisted values - newValue.Add(forPersisting); + newValue.Add(umbracoFile.Url); } //now remove the temp file - File.Delete(file.TempFilePath); + File.Delete(file.TempFilePath); } - + //TODO: We need to remove any files that were previously persisted but are no longer persisted. FOr example, if we // uploaded 5 files before and then only uploaded 3, then the last two should be deleted. - return newValue.ToString(Formatting.None); + return string.Join(",", newValue); } } //if we've made it here, we had no files to save and we were not clearing anything so just persist the same value we had before return currentValue; } + } } \ No newline at end of file From 739a6c47a45e7f8a1cdeac117190cf06d1d3c2b3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 17:49:54 +1000 Subject: [PATCH 68/85] Obsoletes UmbracoFile with new UmbracoMediaFile in the Core assembly and wraps the legacy class to use the new one. Improves performance of UmbracoMediaFile by ensuring any IO is lazy loaded and then saved to a local property so it doesn't need to re-read the file for things like length/size. --- src/Umbraco.Core/IO/ResizedImage.cs | 20 ++ src/Umbraco.Core/IO/UmbracoMediaFile.cs | 253 ++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 + src/umbraco.cms/businesslogic/Files/IFile.cs | 1 + .../Files/NotAnImageException.cs | 1 + .../businesslogic/Files/UmbracoFile.cs | 202 +++----------- .../businesslogic/datatype/FileHandlerData.cs | 8 +- 7 files changed, 321 insertions(+), 166 deletions(-) create mode 100644 src/Umbraco.Core/IO/ResizedImage.cs create mode 100644 src/Umbraco.Core/IO/UmbracoMediaFile.cs diff --git a/src/Umbraco.Core/IO/ResizedImage.cs b/src/Umbraco.Core/IO/ResizedImage.cs new file mode 100644 index 0000000000..bd96dcfb26 --- /dev/null +++ b/src/Umbraco.Core/IO/ResizedImage.cs @@ -0,0 +1,20 @@ +namespace Umbraco.Core.IO +{ + internal class ResizedImage + { + public ResizedImage() + { + } + + public ResizedImage(int width, int height, string fileName) + { + Width = width; + Height = height; + FileName = fileName; + } + + public int Width { get; set; } + public int Height { get; set; } + public string FileName { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs new file mode 100644 index 0000000000..e657d9507a --- /dev/null +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using System.Web; +using Umbraco.Core.Configuration; + +namespace Umbraco.Core.IO +{ + public class UmbracoMediaFile + { + private readonly MediaFileSystem _fs; + + #region Constructors + + public UmbracoMediaFile() + { + _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + } + + public UmbracoMediaFile(string path) + { + _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + + Path = path; + + Initialize(); + } + + #endregion + + #region Static Methods + + //MB: Do we really need all these overloads? looking through the code, only one of them is actually used + + public static UmbracoMediaFile Save(HttpPostedFile file, string path) + { + return Save(file.InputStream, path); + } + + public static UmbracoMediaFile Save(HttpPostedFileBase file, string path) + { + return Save(file.InputStream, path); + } + + public static UmbracoMediaFile Save(Stream inputStream, string path) + { + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + fs.AddFile(path, inputStream); + + return new UmbracoMediaFile(path); + } + + public static UmbracoMediaFile Save(byte[] file, string relativePath) + { + return Save(new MemoryStream(file), relativePath); + } + + public static UmbracoMediaFile Save(HttpPostedFile file) + { + var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); + return Save(file, tempDir); + } + + //filebase overload... + public static UmbracoMediaFile Save(HttpPostedFileBase file) + { + var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); + return Save(file, tempDir); + } + + #endregion + + private long? _length; + private Size? _size; + + /// + /// Initialized values that don't require opening the file. + /// + private void Initialize() + { + Filename = _fs.GetFileName(Path); + Extension = _fs.GetExtension(Path) != null + ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() + : ""; + Url = _fs.GetUrl(Path); + } + + public string Filename { get; private set; } + + public string Extension { get; private set; } + + public string Path { get; private set; } + + public string Url { get; private set; } + + /// + /// Get the length of the file in bytes + /// + /// + /// We are lazy loading this, don't go opening the file on ctor like we were doing. + /// + public long Length + { + get + { + if (_length == null) + { + _length = _fs.GetSize(Path); + } + return _length.Value; + } + } + + public bool SupportsResizing + { + get + { + return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); + } + } + + public string GetFriendlyName() + { + return Filename.SplitPascalCasing().ToFirstUpperInvariant(); + } + + public Size GetDimensions() + { + if (_size == null) + { + EnsureFileSupportsResizing(); + + var fs = _fs.OpenFile(Path); + var image = Image.FromStream(fs); + var fileWidth = image.Width; + var fileHeight = image.Height; + fs.Close(); + image.Dispose(); + + _size = new Size(fileWidth, fileHeight); + } + return _size.Value; + } + + public string Resize(int width, int height) + { + EnsureFileSupportsResizing(); + + var fileNameThumb = DoResize(width, height, 0, string.Empty); + + return _fs.GetUrl(fileNameThumb); + } + + public string Resize(int maxWidthHeight, string fileNameAddition) + { + EnsureFileSupportsResizing(); + + var fileNameThumb = DoResize(GetDimensions().Width, GetDimensions().Height, maxWidthHeight, fileNameAddition); + + return _fs.GetUrl(fileNameThumb); + } + + private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) + { + using (var fs = _fs.OpenFile(Path)) + { + using (var image = Image.FromStream(fs)) + { + var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); + + var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); + + return thumbnail.FileName; + } + } + } + + private void EnsureFileSupportsResizing() + { + if (SupportsResizing == false) + throw new InvalidOperationException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); + } + + private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) + { + // Generate thumbnail + float f = 1; + if (useFixedDimensions == false) + { + var fx = (float)image.Size.Width / (float)maxWidthHeight; + var fy = (float)image.Size.Height / (float)maxWidthHeight; + + // must fit in thumbnail size + f = Math.Max(fx, fy); + } + + var widthTh = (int)Math.Round((float)fileWidth / f); + var heightTh = (int)Math.Round((float)fileHeight / f); + + // fixes for empty width or height + if (widthTh == 0) + widthTh = 1; + if (heightTh == 0) + heightTh = 1; + + // Create new image with best quality settings + using (var bp = new Bitmap(widthTh, heightTh)) + { + using (var g = Graphics.FromImage(bp)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; + + // Copy the old image to the new and resized + var rect = new Rectangle(0, 0, widthTh, heightTh); + g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + + // Copy metadata + var imageEncoders = ImageCodecInfo.GetImageEncoders(); + + var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" + ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) + : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + + // Set compresion ratio to 90% + var ep = new EncoderParameters(); + ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); + + // Save the new image using the dimensions of the image + var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); + using (var ms = new MemoryStream()) + { + bp.Save(ms, codec, ep); + ms.Seek(0, 0); + + _fs.AddFile(newFileName, ms); + } + + return new ResizedImage(widthTh, heightTh, newFileName); + } + } + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 5600a8da26..137a2bfbe5 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -173,6 +173,8 @@ + + diff --git a/src/umbraco.cms/businesslogic/Files/IFile.cs b/src/umbraco.cms/businesslogic/Files/IFile.cs index ccf858fb02..5f018b688f 100644 --- a/src/umbraco.cms/businesslogic/Files/IFile.cs +++ b/src/umbraco.cms/businesslogic/Files/IFile.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.Files { + [Obsolete("This is no longer used ane will be removed from the codebase in the future")] public interface IFile { string Filename { get; } diff --git a/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs b/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs index 2d0ff67635..7ea71e2426 100644 --- a/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs +++ b/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.Files { + [Obsolete("This is no longer used ane will be removed from the codebase in the future")] public class NotAnImageException : Exception { public NotAnImageException() diff --git a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs index a37adad5b7..5822e8c72c 100644 --- a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs +++ b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs @@ -10,24 +10,26 @@ using Umbraco.Core.IO; namespace umbraco.cms.businesslogic.Files { + [Obsolete("Use Umbraco.Core.IO.UmbracoMediaFile instead")] public class UmbracoFile : IFile { - private readonly MediaFileSystem _fs; - + private readonly UmbracoMediaFile _mediaFile; + #region Constructors public UmbracoFile() { - _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + _mediaFile = new UmbracoMediaFile(); } public UmbracoFile(string path) { - _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + _mediaFile = new UmbracoMediaFile(path); + } - Path = path; - - Initialize(); + internal UmbracoFile(UmbracoMediaFile mediaFile) + { + _mediaFile = mediaFile; } #endregion @@ -38,57 +40,46 @@ namespace umbraco.cms.businesslogic.Files public static UmbracoFile Save(HttpPostedFile file, string path) { - return Save(file.InputStream, path); + return new UmbracoFile(UmbracoMediaFile.Save(file.InputStream, path)); } public static UmbracoFile Save(HttpPostedFileBase file, string path) { - return Save(file.InputStream, path); + return new UmbracoFile(UmbracoMediaFile.Save(file.InputStream, path)); } public static UmbracoFile Save(Stream inputStream, string path) { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - fs.AddFile(path, inputStream); - - return new UmbracoFile(path); + return new UmbracoFile(UmbracoMediaFile.Save(inputStream, path)); } public static UmbracoFile Save(byte[] file, string relativePath) { - return Save(new MemoryStream(file), relativePath); + return new UmbracoFile(UmbracoMediaFile.Save(new MemoryStream(file), relativePath)); } public static UmbracoFile Save(HttpPostedFile file) { - var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); - return Save(file, tempDir); + return new UmbracoFile(UmbracoMediaFile.Save(file)); } //filebase overload... public static UmbracoFile Save(HttpPostedFileBase file) { - var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); - return Save(file, tempDir); + return new UmbracoFile(UmbracoMediaFile.Save(file)); } #endregion - - private void Initialize() + + public string Filename { - Filename = _fs.GetFileName(Path); - Length = _fs.GetSize(Path); - Extension = _fs.GetExtension(Path) != null - ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() - : ""; - Url = _fs.GetUrl(Path); + get { return _mediaFile.Filename; } } - #region IFile Members - - public string Filename { get; private set; } - - public string Extension { get; private set; } + public string Extension + { + get { return _mediaFile.Extension; } + } [Obsolete("LocalName is obsolete, please use Url instead", false)] public string LocalName @@ -96,160 +87,47 @@ namespace umbraco.cms.businesslogic.Files get { return Url; } } - public string Path { get; private set; } + public string Path + { + get { return _mediaFile.Path; } + } - public string Url { get; private set; } + public string Url + { + get { return _mediaFile.Url; } + } - public long Length { get; private set; } + public long Length + { + get { return _mediaFile.Length; } + } public bool SupportsResizing { - get - { - return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); - } + get { return _mediaFile.SupportsResizing; } } public string GetFriendlyName() { - return Filename.SplitPascalCasing().ToFirstUpperInvariant(); + return _mediaFile.GetFriendlyName(); } public System.Tuple GetDimensions() { - EnsureFileSupportsResizing(); - - var fs = _fs.OpenFile(Path); - var image = Image.FromStream(fs); - var fileWidth = image.Width; - var fileHeight = image.Height; - fs.Close(); - image.Dispose(); - - return new System.Tuple(fileWidth, fileHeight); + var size = _mediaFile.GetDimensions(); + return new System.Tuple(size.Width, size.Height); } public string Resize(int width, int height) { - EnsureFileSupportsResizing(); - - var fileNameThumb = DoResize(width, height, 0, string.Empty); - - return _fs.GetUrl(fileNameThumb); + return _mediaFile.Resize(width, height); } public string Resize(int maxWidthHeight, string fileNameAddition) { - EnsureFileSupportsResizing(); - - var fileNameThumb = DoResize(GetDimensions().Item1, GetDimensions().Item2, maxWidthHeight, fileNameAddition); - - return _fs.GetUrl(fileNameThumb); + return _mediaFile.Resize(maxWidthHeight, fileNameAddition); } - private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) - { - using (var fs = _fs.OpenFile(Path)) - { - using (var image = Image.FromStream(fs)) - { - var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) - : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); - - var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); - - return thumbnail.FileName; - } - } - } - - #endregion - - private void EnsureFileSupportsResizing() - { - if (SupportsResizing == false) - throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); - } - - private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) - { - // Generate thumbnail - float f = 1; - if (useFixedDimensions == false) - { - var fx = (float)image.Size.Width / (float)maxWidthHeight; - var fy = (float)image.Size.Height / (float)maxWidthHeight; - - // must fit in thumbnail size - f = Math.Max(fx, fy); - } - - var widthTh = (int)Math.Round((float)fileWidth / f); - var heightTh = (int)Math.Round((float)fileHeight / f); - - // fixes for empty width or height - if (widthTh == 0) - widthTh = 1; - if (heightTh == 0) - heightTh = 1; - - // Create new image with best quality settings - using (var bp = new Bitmap(widthTh, heightTh)) - { - using (var g = Graphics.FromImage(bp)) - { - g.SmoothingMode = SmoothingMode.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; - - // Copy the old image to the new and resized - var rect = new Rectangle(0, 0, widthTh, heightTh); - g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - - // Copy metadata - var imageEncoders = ImageCodecInfo.GetImageEncoders(); - - var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" - ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) - : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); - - // Set compresion ratio to 90% - var ep = new EncoderParameters(); - ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - - // Save the new image using the dimensions of the image - var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); - using (var ms = new MemoryStream()) - { - bp.Save(ms, codec, ep); - ms.Seek(0, 0); - - _fs.AddFile(newFileName, ms); - } - - return new ResizedImage(widthTh, heightTh, newFileName); - } - } - } } - internal class ResizedImage - { - public ResizedImage() - { - } - - public ResizedImage(int width, int height, string fileName) - { - Width = width; - Height = height; - FileName = fileName; - } - - public int Width { get; set; } - public int Height { get; set; } - public string FileName { get; set; } - } } diff --git a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs index 4a8786a8fd..53a7d14f24 100644 --- a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs +++ b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs @@ -169,12 +169,12 @@ namespace umbraco.cms.businesslogic.datatype object propertyValue) { XmlNode propertyNode = uploadFieldConfigNode.SelectSingleNode(propertyAlias); - if (propertyNode != null && !String.IsNullOrEmpty(propertyNode.FirstChild.Value)) + if (propertyNode != null && !string.IsNullOrEmpty(propertyNode.FirstChild.Value)) { - if (content.getProperty(propertyNode.FirstChild.Value) != null) + var prop = content.getProperty(propertyNode.FirstChild.Value); + if (prop != null) { - content.getProperty(propertyNode.FirstChild.Value) - .Value = propertyValue; + prop.Value = propertyValue; } } } From a1206b25b72fecd755a7267b8e21c5b6bb5242c9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 17:51:37 +1000 Subject: [PATCH 69/85] Adds media service events to fill in all of the image properties in the uploadField property editor... at least this logic isn't completely hacked into the FileHandlerData anymore! --- .../FileUploadPropertyEditor.cs | 77 ++++++++++++++++++- .../PropertyEditors/FileUploadValueEditor.cs | 2 +- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index 4a9de55d75..8f4a8c1ebe 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -1,11 +1,29 @@ -using Umbraco.Core; +using System.Xml; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; namespace Umbraco.Web.PropertyEditors { [PropertyEditor(Constants.PropertyEditors.UploadField, "File upload", "fileupload")] public class FileUploadPropertyEditor : PropertyEditor { + /// + /// We're going to bind to the MediaService Saving event so that we can populate the umbracoFile size, type, etc... label fields + /// if we find any attached to the current media item. + /// + /// + /// I think this kind of logic belongs on this property editor, I guess it could exist elsewhere but it all has to do with the upload field. + /// + static FileUploadPropertyEditor() + { + MediaService.Saving += MediaServiceSaving; + MediaService.Creating += MediaServiceCreating; + } + /// /// Creates our custom value editor /// @@ -21,5 +39,62 @@ namespace Umbraco.Web.PropertyEditors View = baseEditor.View }; } + + + static void MediaServiceCreating(IMediaService sender, Core.Events.NewEventArgs e) + { + AutoFillProperties(e.Entity); + } + + static void MediaServiceSaving(IMediaService sender, Core.Events.SaveEventArgs e) + { + foreach (var m in e.SavedEntities) + { + AutoFillProperties(m); + } + } + + static void AutoFillProperties(IContentBase model) + { + if (UmbracoSettings.ImageAutoFillImageProperties != null) + { + foreach (var p in model.Properties) + { + var uploadFieldConfigNode = + UmbracoSettings.ImageAutoFillImageProperties.SelectSingleNode( + string.Format("uploadField [@alias = \"{0}\"]", p.Alias)); + + if (uploadFieldConfigNode != null && p.Value != null && p.Value is string && ((string)p.Value).IsNullOrWhiteSpace() == false) + { + var umbracoFile = new UmbracoMediaFile(IOHelper.MapPath((string)p.Value)); + FillProperties(uploadFieldConfigNode, model, umbracoFile); + } + } + } + } + + private static void FillProperties(XmlNode uploadFieldConfigNode, IContentBase content, UmbracoMediaFile um) + { + // only add dimensions to web images + UpdateContentProperty(uploadFieldConfigNode, content, "widthFieldAlias", um.SupportsResizing ? um.GetDimensions().Width.ToString() : string.Empty); + UpdateContentProperty(uploadFieldConfigNode, content, "heightFieldAlias", um.SupportsResizing ? um.GetDimensions().Height.ToString() : string.Empty); + + UpdateContentProperty(uploadFieldConfigNode, content, "lengthFieldAlias", um.Length); + UpdateContentProperty(uploadFieldConfigNode, content, "extensionFieldAlias", um.Extension); + } + + private static void UpdateContentProperty(XmlNode uploadFieldConfigNode, IContentBase content, string configPropertyAlias, object propertyValue) + { + var propertyNode = uploadFieldConfigNode.SelectSingleNode(configPropertyAlias); + if (propertyNode != null && string.IsNullOrEmpty(propertyNode.FirstChild.Value) == false) + { + var property = content.Properties[propertyNode.FirstChild.Value]; + if (property != null) + { + property.Value = propertyValue; + } + } + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs index f1a0983e71..73630b7f41 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadValueEditor.cs @@ -107,7 +107,7 @@ namespace Umbraco.Web.PropertyEditors using (var fileStream = File.OpenRead(file.TempFilePath)) { - var umbracoFile = UmbracoFile.Save(fileStream, fileName); + var umbracoFile = UmbracoMediaFile.Save(fileStream, fileName); if (umbracoFile.SupportsResizing) { From 4dbec9264f6eac256e15707aa53df494d536d3e6 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 17:53:56 +1000 Subject: [PATCH 70/85] obsoletes all of the old "DataType" classes since they won't be used anymore. --- src/umbraco.cms/businesslogic/datatype/AbstractDataEditor.cs | 1 + .../businesslogic/datatype/AbstractDataEditorControl.cs | 1 + src/umbraco.cms/businesslogic/datatype/BaseDataType.cs | 1 + src/umbraco.cms/businesslogic/datatype/DataEditorSetting.cs | 1 + src/umbraco.cms/businesslogic/datatype/DataEditorSettingType.cs | 1 + .../businesslogic/datatype/DataEditorSettingValidationResult.cs | 1 + .../businesslogic/datatype/DataEditorSettingsStorage.cs | 1 + src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs | 1 + src/umbraco.cms/businesslogic/datatype/DefaultData.cs | 1 + src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs | 2 ++ src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs | 1 + .../businesslogic/datatype/IDataEditorSettingType.cs | 1 + src/umbraco.cms/businesslogic/datatype/PreValue.cs | 1 + src/umbraco.cms/businesslogic/datatype/PreValues.cs | 1 + 14 files changed, 15 insertions(+) diff --git a/src/umbraco.cms/businesslogic/datatype/AbstractDataEditor.cs b/src/umbraco.cms/businesslogic/datatype/AbstractDataEditor.cs index accdc2f4ac..30860f50c8 100644 --- a/src/umbraco.cms/businesslogic/datatype/AbstractDataEditor.cs +++ b/src/umbraco.cms/businesslogic/datatype/AbstractDataEditor.cs @@ -12,6 +12,7 @@ /// /// Made by NH in flight SK 925 on his way to MIX09 /// + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public abstract class AbstractDataEditor : BaseDataType, IDataType { /// diff --git a/src/umbraco.cms/businesslogic/datatype/AbstractDataEditorControl.cs b/src/umbraco.cms/businesslogic/datatype/AbstractDataEditorControl.cs index dd89c3a366..78e4ab9a41 100644 --- a/src/umbraco.cms/businesslogic/datatype/AbstractDataEditorControl.cs +++ b/src/umbraco.cms/businesslogic/datatype/AbstractDataEditorControl.cs @@ -10,6 +10,7 @@ namespace umbraco.cms.businesslogic.datatype /// Base class that defines the methods, properties and events for all datatype controls. /// [ValidationProperty("Value")] + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class AbstractDataEditorControl : WebControl, INamingContainer, IDataEditor { /// diff --git a/src/umbraco.cms/businesslogic/datatype/BaseDataType.cs b/src/umbraco.cms/businesslogic/datatype/BaseDataType.cs index ae92b0d646..ccfd0ddf69 100644 --- a/src/umbraco.cms/businesslogic/datatype/BaseDataType.cs +++ b/src/umbraco.cms/businesslogic/datatype/BaseDataType.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public abstract class BaseDataType { private int _datatypedefinitionid; diff --git a/src/umbraco.cms/businesslogic/datatype/DataEditorSetting.cs b/src/umbraco.cms/businesslogic/datatype/DataEditorSetting.cs index 13cf7ab942..f200d805d5 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataEditorSetting.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataEditorSetting.cs @@ -6,6 +6,7 @@ using System.Reflection; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] [System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = false)] public class DataEditorSetting: System.Attribute { diff --git a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingType.cs b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingType.cs index fd164168d8..e1d518aa22 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingType.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingType.cs @@ -6,6 +6,7 @@ using System.Text.RegularExpressions; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public abstract class DataEditorSettingType : ProviderBase, IDataEditorSettingType { public virtual string Value { get; set; } diff --git a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingValidationResult.cs b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingValidationResult.cs index a5d55d01c9..1abb523540 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingValidationResult.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingValidationResult.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class DataEditorSettingValidationResult { public String ErrorMessage { get; set; } diff --git a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingsStorage.cs b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingsStorage.cs index 85e8cd2e3c..c71282f998 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataEditorSettingsStorage.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataEditorSettingsStorage.cs @@ -7,6 +7,7 @@ using umbraco.DataLayer; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class DataEditorSettingsStorage { private ISqlHelper sqlHelper; diff --git a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs index 9bae792f5d..89656fb95b 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs @@ -19,6 +19,7 @@ namespace umbraco.cms.businesslogic.datatype /// are used amongst other for enabling shared prevalues. /// /// + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class DataTypeDefinition : CMSNode { #region Private fields diff --git a/src/umbraco.cms/businesslogic/datatype/DefaultData.cs b/src/umbraco.cms/businesslogic/datatype/DefaultData.cs index d72212aa5f..8c09d6db0c 100644 --- a/src/umbraco.cms/businesslogic/datatype/DefaultData.cs +++ b/src/umbraco.cms/businesslogic/datatype/DefaultData.cs @@ -14,6 +14,7 @@ namespace umbraco.cms.businesslogic.datatype /// /// Default implementation of the IData interface that stores data inside the Umbraco database. /// + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class DefaultData : IData, IDataWithPreview { private int _propertyId; diff --git a/src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs b/src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs index ac3f9409fb..b235ec0610 100644 --- a/src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs +++ b/src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs @@ -9,6 +9,8 @@ using System.Collections.Generic; namespace umbraco.cms.businesslogic.datatype { + + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class DefaultPreValueEditor : PlaceHolder, interfaces.IDataPrevalue { // UI controls diff --git a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs index 53a7d14f24..98d25cc18d 100644 --- a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs +++ b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs @@ -10,6 +10,7 @@ using umbraco.cms.businesslogic.Files; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class FileHandlerData : DefaultData { private readonly string _thumbnailSizes; diff --git a/src/umbraco.cms/businesslogic/datatype/IDataEditorSettingType.cs b/src/umbraco.cms/businesslogic/datatype/IDataEditorSettingType.cs index ef046f38ad..2b6b4a82b0 100644 --- a/src/umbraco.cms/businesslogic/datatype/IDataEditorSettingType.cs +++ b/src/umbraco.cms/businesslogic/datatype/IDataEditorSettingType.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.datatype { + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public interface IDataEditorSettingType { string Value { get; set; } diff --git a/src/umbraco.cms/businesslogic/datatype/PreValue.cs b/src/umbraco.cms/businesslogic/datatype/PreValue.cs index 94c92627c3..db65b9ce6f 100644 --- a/src/umbraco.cms/businesslogic/datatype/PreValue.cs +++ b/src/umbraco.cms/businesslogic/datatype/PreValue.cs @@ -14,6 +14,7 @@ namespace umbraco.cms.businesslogic.datatype /// A simple class for storing predefined values on a datatype. /// A prevalue contains a value, a unique key and sort order. /// + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class PreValue { private static ISqlHelper SqlHelper diff --git a/src/umbraco.cms/businesslogic/datatype/PreValues.cs b/src/umbraco.cms/businesslogic/datatype/PreValues.cs index 02a3cdd92e..457554e92a 100644 --- a/src/umbraco.cms/businesslogic/datatype/PreValues.cs +++ b/src/umbraco.cms/businesslogic/datatype/PreValues.cs @@ -14,6 +14,7 @@ namespace umbraco.cms.businesslogic.datatype /// /// Any data type in umbraco can have PreValues, which is a simple Key/Value collection of items attached to a specific instance of the data type. /// + [Obsolete("This class is no longer used and will be removed from the codebase in the future.")] public class PreValues { private static ISqlHelper SqlHelper From d1eb8fd9eb4715e4ab3798047224cd4321094ff0 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 17:59:44 +1000 Subject: [PATCH 71/85] Obsoletes UmbracoFile with new UmbracoMediaFile in the Core assembly and wraps the legacy class to use the new one. Improves performance of UmbracoMediaFile by ensuring any IO is lazy loaded and then saved to a local property so it doesn't need to re-read the file for things like length/size. Conflicts: src/Umbraco.Core/Umbraco.Core.csproj --- src/Umbraco.Core/IO/ResizedImage.cs | 20 ++ src/Umbraco.Core/IO/UmbracoMediaFile.cs | 253 ++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 + src/umbraco.cms/businesslogic/Files/IFile.cs | 1 + .../Files/NotAnImageException.cs | 1 + .../businesslogic/Files/UmbracoFile.cs | 202 +++----------- .../businesslogic/datatype/FileHandlerData.cs | 8 +- 7 files changed, 321 insertions(+), 166 deletions(-) create mode 100644 src/Umbraco.Core/IO/ResizedImage.cs create mode 100644 src/Umbraco.Core/IO/UmbracoMediaFile.cs diff --git a/src/Umbraco.Core/IO/ResizedImage.cs b/src/Umbraco.Core/IO/ResizedImage.cs new file mode 100644 index 0000000000..bd96dcfb26 --- /dev/null +++ b/src/Umbraco.Core/IO/ResizedImage.cs @@ -0,0 +1,20 @@ +namespace Umbraco.Core.IO +{ + internal class ResizedImage + { + public ResizedImage() + { + } + + public ResizedImage(int width, int height, string fileName) + { + Width = width; + Height = height; + FileName = fileName; + } + + public int Width { get; set; } + public int Height { get; set; } + public string FileName { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs new file mode 100644 index 0000000000..e657d9507a --- /dev/null +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using System.Web; +using Umbraco.Core.Configuration; + +namespace Umbraco.Core.IO +{ + public class UmbracoMediaFile + { + private readonly MediaFileSystem _fs; + + #region Constructors + + public UmbracoMediaFile() + { + _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + } + + public UmbracoMediaFile(string path) + { + _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + + Path = path; + + Initialize(); + } + + #endregion + + #region Static Methods + + //MB: Do we really need all these overloads? looking through the code, only one of them is actually used + + public static UmbracoMediaFile Save(HttpPostedFile file, string path) + { + return Save(file.InputStream, path); + } + + public static UmbracoMediaFile Save(HttpPostedFileBase file, string path) + { + return Save(file.InputStream, path); + } + + public static UmbracoMediaFile Save(Stream inputStream, string path) + { + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + fs.AddFile(path, inputStream); + + return new UmbracoMediaFile(path); + } + + public static UmbracoMediaFile Save(byte[] file, string relativePath) + { + return Save(new MemoryStream(file), relativePath); + } + + public static UmbracoMediaFile Save(HttpPostedFile file) + { + var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); + return Save(file, tempDir); + } + + //filebase overload... + public static UmbracoMediaFile Save(HttpPostedFileBase file) + { + var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); + return Save(file, tempDir); + } + + #endregion + + private long? _length; + private Size? _size; + + /// + /// Initialized values that don't require opening the file. + /// + private void Initialize() + { + Filename = _fs.GetFileName(Path); + Extension = _fs.GetExtension(Path) != null + ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() + : ""; + Url = _fs.GetUrl(Path); + } + + public string Filename { get; private set; } + + public string Extension { get; private set; } + + public string Path { get; private set; } + + public string Url { get; private set; } + + /// + /// Get the length of the file in bytes + /// + /// + /// We are lazy loading this, don't go opening the file on ctor like we were doing. + /// + public long Length + { + get + { + if (_length == null) + { + _length = _fs.GetSize(Path); + } + return _length.Value; + } + } + + public bool SupportsResizing + { + get + { + return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); + } + } + + public string GetFriendlyName() + { + return Filename.SplitPascalCasing().ToFirstUpperInvariant(); + } + + public Size GetDimensions() + { + if (_size == null) + { + EnsureFileSupportsResizing(); + + var fs = _fs.OpenFile(Path); + var image = Image.FromStream(fs); + var fileWidth = image.Width; + var fileHeight = image.Height; + fs.Close(); + image.Dispose(); + + _size = new Size(fileWidth, fileHeight); + } + return _size.Value; + } + + public string Resize(int width, int height) + { + EnsureFileSupportsResizing(); + + var fileNameThumb = DoResize(width, height, 0, string.Empty); + + return _fs.GetUrl(fileNameThumb); + } + + public string Resize(int maxWidthHeight, string fileNameAddition) + { + EnsureFileSupportsResizing(); + + var fileNameThumb = DoResize(GetDimensions().Width, GetDimensions().Height, maxWidthHeight, fileNameAddition); + + return _fs.GetUrl(fileNameThumb); + } + + private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) + { + using (var fs = _fs.OpenFile(Path)) + { + using (var image = Image.FromStream(fs)) + { + var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); + + var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); + + return thumbnail.FileName; + } + } + } + + private void EnsureFileSupportsResizing() + { + if (SupportsResizing == false) + throw new InvalidOperationException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); + } + + private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) + { + // Generate thumbnail + float f = 1; + if (useFixedDimensions == false) + { + var fx = (float)image.Size.Width / (float)maxWidthHeight; + var fy = (float)image.Size.Height / (float)maxWidthHeight; + + // must fit in thumbnail size + f = Math.Max(fx, fy); + } + + var widthTh = (int)Math.Round((float)fileWidth / f); + var heightTh = (int)Math.Round((float)fileHeight / f); + + // fixes for empty width or height + if (widthTh == 0) + widthTh = 1; + if (heightTh == 0) + heightTh = 1; + + // Create new image with best quality settings + using (var bp = new Bitmap(widthTh, heightTh)) + { + using (var g = Graphics.FromImage(bp)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; + + // Copy the old image to the new and resized + var rect = new Rectangle(0, 0, widthTh, heightTh); + g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + + // Copy metadata + var imageEncoders = ImageCodecInfo.GetImageEncoders(); + + var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" + ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) + : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + + // Set compresion ratio to 90% + var ep = new EncoderParameters(); + ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); + + // Save the new image using the dimensions of the image + var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); + using (var ms = new MemoryStream()) + { + bp.Save(ms, codec, ep); + ms.Seek(0, 0); + + _fs.AddFile(newFileName, ms); + } + + return new ResizedImage(widthTh, heightTh, newFileName); + } + } + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1c8fff3334..d2a5e33a28 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -164,6 +164,8 @@ + + diff --git a/src/umbraco.cms/businesslogic/Files/IFile.cs b/src/umbraco.cms/businesslogic/Files/IFile.cs index ccf858fb02..5f018b688f 100644 --- a/src/umbraco.cms/businesslogic/Files/IFile.cs +++ b/src/umbraco.cms/businesslogic/Files/IFile.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.Files { + [Obsolete("This is no longer used ane will be removed from the codebase in the future")] public interface IFile { string Filename { get; } diff --git a/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs b/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs index 2d0ff67635..7ea71e2426 100644 --- a/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs +++ b/src/umbraco.cms/businesslogic/Files/NotAnImageException.cs @@ -5,6 +5,7 @@ using System.Text; namespace umbraco.cms.businesslogic.Files { + [Obsolete("This is no longer used ane will be removed from the codebase in the future")] public class NotAnImageException : Exception { public NotAnImageException() diff --git a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs index a37adad5b7..5822e8c72c 100644 --- a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs +++ b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs @@ -10,24 +10,26 @@ using Umbraco.Core.IO; namespace umbraco.cms.businesslogic.Files { + [Obsolete("Use Umbraco.Core.IO.UmbracoMediaFile instead")] public class UmbracoFile : IFile { - private readonly MediaFileSystem _fs; - + private readonly UmbracoMediaFile _mediaFile; + #region Constructors public UmbracoFile() { - _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + _mediaFile = new UmbracoMediaFile(); } public UmbracoFile(string path) { - _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + _mediaFile = new UmbracoMediaFile(path); + } - Path = path; - - Initialize(); + internal UmbracoFile(UmbracoMediaFile mediaFile) + { + _mediaFile = mediaFile; } #endregion @@ -38,57 +40,46 @@ namespace umbraco.cms.businesslogic.Files public static UmbracoFile Save(HttpPostedFile file, string path) { - return Save(file.InputStream, path); + return new UmbracoFile(UmbracoMediaFile.Save(file.InputStream, path)); } public static UmbracoFile Save(HttpPostedFileBase file, string path) { - return Save(file.InputStream, path); + return new UmbracoFile(UmbracoMediaFile.Save(file.InputStream, path)); } public static UmbracoFile Save(Stream inputStream, string path) { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - fs.AddFile(path, inputStream); - - return new UmbracoFile(path); + return new UmbracoFile(UmbracoMediaFile.Save(inputStream, path)); } public static UmbracoFile Save(byte[] file, string relativePath) { - return Save(new MemoryStream(file), relativePath); + return new UmbracoFile(UmbracoMediaFile.Save(new MemoryStream(file), relativePath)); } public static UmbracoFile Save(HttpPostedFile file) { - var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); - return Save(file, tempDir); + return new UmbracoFile(UmbracoMediaFile.Save(file)); } //filebase overload... public static UmbracoFile Save(HttpPostedFileBase file) { - var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString()); - return Save(file, tempDir); + return new UmbracoFile(UmbracoMediaFile.Save(file)); } #endregion - - private void Initialize() + + public string Filename { - Filename = _fs.GetFileName(Path); - Length = _fs.GetSize(Path); - Extension = _fs.GetExtension(Path) != null - ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() - : ""; - Url = _fs.GetUrl(Path); + get { return _mediaFile.Filename; } } - #region IFile Members - - public string Filename { get; private set; } - - public string Extension { get; private set; } + public string Extension + { + get { return _mediaFile.Extension; } + } [Obsolete("LocalName is obsolete, please use Url instead", false)] public string LocalName @@ -96,160 +87,47 @@ namespace umbraco.cms.businesslogic.Files get { return Url; } } - public string Path { get; private set; } + public string Path + { + get { return _mediaFile.Path; } + } - public string Url { get; private set; } + public string Url + { + get { return _mediaFile.Url; } + } - public long Length { get; private set; } + public long Length + { + get { return _mediaFile.Length; } + } public bool SupportsResizing { - get - { - return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); - } + get { return _mediaFile.SupportsResizing; } } public string GetFriendlyName() { - return Filename.SplitPascalCasing().ToFirstUpperInvariant(); + return _mediaFile.GetFriendlyName(); } public System.Tuple GetDimensions() { - EnsureFileSupportsResizing(); - - var fs = _fs.OpenFile(Path); - var image = Image.FromStream(fs); - var fileWidth = image.Width; - var fileHeight = image.Height; - fs.Close(); - image.Dispose(); - - return new System.Tuple(fileWidth, fileHeight); + var size = _mediaFile.GetDimensions(); + return new System.Tuple(size.Width, size.Height); } public string Resize(int width, int height) { - EnsureFileSupportsResizing(); - - var fileNameThumb = DoResize(width, height, 0, string.Empty); - - return _fs.GetUrl(fileNameThumb); + return _mediaFile.Resize(width, height); } public string Resize(int maxWidthHeight, string fileNameAddition) { - EnsureFileSupportsResizing(); - - var fileNameThumb = DoResize(GetDimensions().Item1, GetDimensions().Item2, maxWidthHeight, fileNameAddition); - - return _fs.GetUrl(fileNameThumb); + return _mediaFile.Resize(maxWidthHeight, fileNameAddition); } - private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) - { - using (var fs = _fs.OpenFile(Path)) - { - using (var image = Image.FromStream(fs)) - { - var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) - : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); - - var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); - - return thumbnail.FileName; - } - } - } - - #endregion - - private void EnsureFileSupportsResizing() - { - if (SupportsResizing == false) - throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); - } - - private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) - { - // Generate thumbnail - float f = 1; - if (useFixedDimensions == false) - { - var fx = (float)image.Size.Width / (float)maxWidthHeight; - var fy = (float)image.Size.Height / (float)maxWidthHeight; - - // must fit in thumbnail size - f = Math.Max(fx, fy); - } - - var widthTh = (int)Math.Round((float)fileWidth / f); - var heightTh = (int)Math.Round((float)fileHeight / f); - - // fixes for empty width or height - if (widthTh == 0) - widthTh = 1; - if (heightTh == 0) - heightTh = 1; - - // Create new image with best quality settings - using (var bp = new Bitmap(widthTh, heightTh)) - { - using (var g = Graphics.FromImage(bp)) - { - g.SmoothingMode = SmoothingMode.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; - - // Copy the old image to the new and resized - var rect = new Rectangle(0, 0, widthTh, heightTh); - g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - - // Copy metadata - var imageEncoders = ImageCodecInfo.GetImageEncoders(); - - var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" - ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) - : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); - - // Set compresion ratio to 90% - var ep = new EncoderParameters(); - ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - - // Save the new image using the dimensions of the image - var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); - using (var ms = new MemoryStream()) - { - bp.Save(ms, codec, ep); - ms.Seek(0, 0); - - _fs.AddFile(newFileName, ms); - } - - return new ResizedImage(widthTh, heightTh, newFileName); - } - } - } } - internal class ResizedImage - { - public ResizedImage() - { - } - - public ResizedImage(int width, int height, string fileName) - { - Width = width; - Height = height; - FileName = fileName; - } - - public int Width { get; set; } - public int Height { get; set; } - public string FileName { get; set; } - } } diff --git a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs index 4a8786a8fd..53a7d14f24 100644 --- a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs +++ b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs @@ -169,12 +169,12 @@ namespace umbraco.cms.businesslogic.datatype object propertyValue) { XmlNode propertyNode = uploadFieldConfigNode.SelectSingleNode(propertyAlias); - if (propertyNode != null && !String.IsNullOrEmpty(propertyNode.FirstChild.Value)) + if (propertyNode != null && !string.IsNullOrEmpty(propertyNode.FirstChild.Value)) { - if (content.getProperty(propertyNode.FirstChild.Value) != null) + var prop = content.getProperty(propertyNode.FirstChild.Value); + if (prop != null) { - content.getProperty(propertyNode.FirstChild.Value) - .Value = propertyValue; + prop.Value = propertyValue; } } } From e7ed08b26009b915bc6e74bc7103483294bf5bd4 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 18:03:35 +1000 Subject: [PATCH 72/85] Fixes auto fill props when multiple files. --- .../PropertyEditors/FileUploadPropertyEditor.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index 8f4a8c1ebe..b242d36148 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -1,4 +1,6 @@ -using System.Xml; +using System; +using System.Linq; +using System.Xml; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; @@ -66,8 +68,13 @@ namespace Umbraco.Web.PropertyEditors if (uploadFieldConfigNode != null && p.Value != null && p.Value is string && ((string)p.Value).IsNullOrWhiteSpace() == false) { - var umbracoFile = new UmbracoMediaFile(IOHelper.MapPath((string)p.Value)); - FillProperties(uploadFieldConfigNode, model, umbracoFile); + //there might be multiple, we can only process the first one! + var split = ((string) p.Value).Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); + if (split.Any()) + { + var umbracoFile = new UmbracoMediaFile(IOHelper.MapPath(split[0])); + FillProperties(uploadFieldConfigNode, model, umbracoFile); + } } } } From 5dc43e99faf2e728ab0f26d217d9d1da4180421e Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 23 Jul 2013 18:55:31 +1000 Subject: [PATCH 73/85] Got media controllers working just like content, have tried to share as much code as possible between them. Can probably do a bit better but there's minimal code replication. --- src/Umbraco.Core/Services/ContentService.cs | 1 + .../src/views/media/edit.html | 19 +-- .../src/views/media/mediaedit.controller.js | 40 ++++-- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 2 +- .../umbraco/config/lang/en_us.xml | 2 +- src/Umbraco.Web/Editors/ContentController.cs | 133 ++++++++++++------ src/Umbraco.Web/Editors/MediaController.cs | 69 ++++----- .../ContentEditing/ContentItemDisplay.cs | 27 +--- .../ContentEditing/ContentItemDisplayBase.cs | 33 +++++ .../Models/ContentEditing/IErrorModel.cs | 17 +++ .../Models/ContentEditing/MediaItemDisplay.cs | 2 +- .../ContentEditing/TabbedContentItem.cs | 3 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 + 13 files changed, 216 insertions(+), 134 deletions(-) create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/IErrorModel.cs diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 8929922320..78a1ff4ccf 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1055,6 +1055,7 @@ namespace Umbraco.Core.Services uow.Commit(); //Special case for the Upload DataType + //TODO: Should we handle this with events? var uploadDataTypeId = new Guid(Constants.PropertyEditors.UploadField); if (content.Properties.Any(x => x.PropertyType.DataTypeId == uploadDataTypeId)) { diff --git a/src/Umbraco.Web.UI.Client/src/views/media/edit.html b/src/Umbraco.Web.UI.Client/src/views/media/edit.html index 8ff21f8015..dc4fe83b0c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/edit.html @@ -6,23 +6,12 @@
    + + + Save -
    - Publish - - - - - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/media/mediaedit.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/mediaedit.controller.js index 3fa3120372..76f9eaa52e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/mediaedit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/mediaedit.controller.js @@ -1,4 +1,4 @@ -function mediaEditController($scope, $routeParams, mediaResource, notificationsService) { +function mediaEditController($scope, $routeParams, mediaResource, notificationsService, angularHelper, serverValidationManager, contentEditingHelper) { if ($routeParams.create) { @@ -13,6 +13,13 @@ function mediaEditController($scope, $routeParams, mediaResource, notificationsS .then(function (data) { $scope.contentLoaded = true; $scope.content = data; + + //in one particular special case, after we've created a new item we redirect back to the edit + // route but there might be server validation errors in the collection which we need to display + // after the redirect, so we will bind all subscriptions which will show the server validation errors + // if there are any and then clear them so the collection no longer persists them. + serverValidationManager.executeAndClearAllSubscriptions(); + }); } @@ -28,22 +35,27 @@ function mediaEditController($scope, $routeParams, mediaResource, notificationsS } }; - //TODO: Clean this up and share this code with the content editor - $scope.saveAndPublish = function (cnt) { - mediaResource.saveMedia(cnt, $routeParams.create, $scope.files) - .then(function (data) { - $scope.content = data; - notificationsService.success("Published", "Media has been saved and published"); - }); - }; + //ensure there is a form object assigned. + var currentForm = angularHelper.getRequiredCurrentForm($scope); + + $scope.save = function (cnt) { + + $scope.$broadcast("saving", { scope: $scope }); + + //don't continue if the form is invalid + if (currentForm.$invalid) return; + + serverValidationManager.reset(); - //TODO: Clean this up and share this code with the content editor - $scope.save = function (cnt) { mediaResource.saveMedia(cnt, $routeParams.create, $scope.files) .then(function (data) { - $scope.content = data; - notificationsService.success("Saved", "Media has been saved"); - }); + contentEditingHelper.handleSuccessfulSave({ + scope: $scope, + newContent: data + }); + }, function (err) { + contentEditingHelper.handleSaveError(err, $scope); + }); }; } diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 8923314534..b5eda0d3c8 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -777,7 +777,7 @@ To manage your website, simply open the umbraco back office and start adding con Sent For Approval Changes have been sent for approval Media saved - + Media saved without any errors Member saved Stylesheet Property Saved Stylesheet saved diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index e56017416b..0cdd9893bf 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -763,7 +763,7 @@ To manage your website, simply open the umbraco back office and start adding con Sent For Approval Changes have been sent for approval Media saved - + Media saved without any errors Member saved Stylesheet Property Saved Stylesheet saved diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index be8cff37e7..55b3edc9fc 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -22,11 +22,94 @@ using umbraco; namespace Umbraco.Web.Editors { + public abstract class ContentControllerBase : UmbracoAuthorizedJsonController + { + /// + /// Constructor + /// + protected ContentControllerBase() + : this(UmbracoContext.Current) + { + } + + /// + /// Constructor + /// + /// + protected ContentControllerBase(UmbracoContext umbracoContext) + : base(umbracoContext) + { + } + + protected void HandleContentNotFound(int id) + { + ModelState.AddModelError("id", string.Format("content with id: {0} was not found", id)); + var errorResponse = Request.CreateErrorResponse( + HttpStatusCode.NotFound, + ModelState); + throw new HttpResponseException(errorResponse); + } + + protected void UpdateName(ContentItemSave contentItem) + where TPersisted : IContentBase + { + //Don't update the name if it is empty + if (!contentItem.Name.IsNullOrWhiteSpace()) + { + contentItem.PersistedContent.Name = contentItem.Name; + } + } + + protected void MapPropertyValues(ContentItemSave contentItem) + where TPersisted : IContentBase + { + //Map the property values + foreach (var p in contentItem.ContentDto.Properties) + { + //get the dbo property + var dboProperty = contentItem.PersistedContent.Properties[p.Alias]; + + //create the property data to send to the property editor + var d = new Dictionary(); + //add the files if any + var files = contentItem.UploadedFiles.Where(x => x.PropertyId == p.Id).ToArray(); + if (files.Any()) + { + d.Add("files", files); + } + var data = new ContentPropertyData(p.Value, d); + + //get the deserialized value from the property editor + if (p.PropertyEditor == null) + { + LogHelper.Warn("No property editor found for property " + p.Alias); + } + else + { + dboProperty.Value = p.PropertyEditor.ValueEditor.DeserializeValue(data, dboProperty.Value); + } + } + } + + protected void HandleInvalidModelState(ContentItemDisplayBase display) + where TPersisted : IContentBase + where T : ContentPropertyBasic + { + //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 + if (!ModelState.IsValid) + { + display.Errors = ModelState.ToErrorDictionary(); + throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, display)); + } + } + + } + /// /// The API controller used for editing content /// [PluginController("UmbracoApi")] - public class ContentController : UmbracoAuthorizedJsonController + public class ContentController : ContentControllerBase { private readonly ContentModelMapper _contentModelMapper; @@ -66,11 +149,7 @@ namespace Umbraco.Web.Editors var foundContent = Services.ContentService.GetById(id); if (foundContent == null) { - ModelState.AddModelError("id", string.Format("content with id: {0} was not found", id)); - var errorResponse = Request.CreateErrorResponse( - HttpStatusCode.NotFound, - ModelState); - throw new HttpResponseException(errorResponse); + HandleContentNotFound(id); } return _contentModelMapper.ToContentItemDisplay(foundContent); } @@ -107,43 +186,14 @@ namespace Umbraco.Web.Editors // * and validated // * any file attachments have been saved to their temporary location for us to use // * we have a reference to the DTO object and the persisted object - - //Don't update the name if it is empty - if (!contentItem.Name.IsNullOrWhiteSpace()) - { - contentItem.PersistedContent.Name = contentItem.Name; - } + + UpdateName(contentItem); //TODO: We need to support 'send to publish' //TODO: We'll need to save the new template, publishat, etc... values here - //Map the property values - foreach (var p in contentItem.ContentDto.Properties) - { - //get the dbo property - var dboProperty = contentItem.PersistedContent.Properties[p.Alias]; - - //create the property data to send to the property editor - var d = new Dictionary(); - //add the files if any - var files = contentItem.UploadedFiles.Where(x => x.PropertyId == p.Id).ToArray(); - if (files.Any()) - { - d.Add("files", files); - } - var data = new ContentPropertyData(p.Value, d); - - //get the deserialized value from the property editor - if (p.PropertyEditor == null) - { - LogHelper.Warn("No property editor found for property " + p.Alias); - } - else - { - dboProperty.Value = p.PropertyEditor.ValueEditor.DeserializeValue(data, dboProperty.Value); - } - } + MapPropertyValues(contentItem); //We need to manually check the validation results here because: // * We still need to save the entity even if there are validation value errors @@ -191,12 +241,9 @@ namespace Umbraco.Web.Editors //return the updated model var display = _contentModelMapper.ToContentItemDisplay(contentItem.PersistedContent); + //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 - if (!ModelState.IsValid) - { - display.Errors = ModelState.ToErrorDictionary(); - throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, display)); - } + HandleInvalidModelState(display); //put the correct msgs in switch (contentItem.Action) diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 5e9dc789e7..7ea0df7f7e 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -4,6 +4,7 @@ using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.ModelBinding; +using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; @@ -14,6 +15,7 @@ using Umbraco.Web.WebApi; using System.Linq; using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; +using umbraco; namespace Umbraco.Web.Editors { @@ -30,7 +32,7 @@ namespace Umbraco.Web.Editors //} [PluginController("UmbracoApi")] - public class MediaController : UmbracoAuthorizedJsonController + public class MediaController : ContentControllerBase { private readonly MediaModelMapper _mediaModelMapper; @@ -67,7 +69,7 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - var emptyContent = new Umbraco.Core.Models.Media("Empty", parentId, contentType); + var emptyContent = new Core.Models.Media("Empty", parentId, contentType); return _mediaModelMapper.ToMediaItemDisplay(emptyContent); } @@ -81,11 +83,7 @@ namespace Umbraco.Web.Editors var foundContent = Services.MediaService.GetById(id); if (foundContent == null) { - ModelState.AddModelError("id", string.Format("media with id: {0} was not found", id)); - var errorResponse = Request.CreateErrorResponse( - HttpStatusCode.NotFound, - ModelState); - throw new HttpResponseException(errorResponse); + HandleContentNotFound(id); } return _mediaModelMapper.ToMediaItemDisplay(foundContent); } @@ -123,35 +121,26 @@ namespace Umbraco.Web.Editors // * any file attachments have been saved to their temporary location for us to use // * we have a reference to the DTO object and the persisted object - //Now, we just need to save the data + UpdateName(contentItem); - contentItem.PersistedContent.Name = contentItem.Name; - //TODO: We'll need to save the new template, publishat, etc... values here + MapPropertyValues(contentItem); - //Save the property values (for properties that have a valid editor ... not legacy) - foreach (var p in contentItem.ContentDto.Properties.Where(x => x.PropertyEditor != null)) + //We need to manually check the validation results here because: + // * We still need to save the entity even if there are validation value errors + // * Depending on if the entity is new, and if there are non property validation errors (i.e. the name is null) + // then we cannot continue saving, we can only display errors + // * If there are validation errors and they were attempting to publish, we can only save, NOT publish and display + // a message indicating this + if (!ModelState.IsValid) { - //get the dbo property - var dboProperty = contentItem.PersistedContent.Properties[p.Alias]; - - //create the property data to send to the property editor - var d = new Dictionary(); - //add the files if any - var files = contentItem.UploadedFiles.Where(x => x.PropertyId == p.Id).ToArray(); - if (files.Any()) + if (ValidationHelper.ModelHasRequiredForPersistenceErrors(contentItem) + && (contentItem.Action == ContentSaveAction.SaveNew)) { - d.Add("files", files); - } - var data = new ContentPropertyData(p.Value, d); - - //get the deserialized value from the property editor - if (p.PropertyEditor == null) - { - LogHelper.Warn("No property editor found for property " + p.Alias); - } - else - { - dboProperty.Value = p.PropertyEditor.ValueEditor.DeserializeValue(data, dboProperty.Value); + //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! + // add the modelstate to the outgoing object and throw a 403 + var forDisplay = _mediaModelMapper.ToMediaItemDisplay(contentItem.PersistedContent); + forDisplay.Errors = ModelState.ToErrorDictionary(); + throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, forDisplay)); } } @@ -159,7 +148,21 @@ namespace Umbraco.Web.Editors Services.MediaService.Save(contentItem.PersistedContent); //return the updated model - return _mediaModelMapper.ToMediaItemDisplay(contentItem.PersistedContent); + var display = _mediaModelMapper.ToMediaItemDisplay(contentItem.PersistedContent); + + //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 + HandleInvalidModelState(display); + + //put the correct msgs in + switch (contentItem.Action) + { + case ContentSaveAction.Save: + case ContentSaveAction.SaveNew: + display.AddSuccessNotification(ui.Text("speechBubbles", "editMediaSaved"), ui.Text("speechBubbles", "editMediaSavedText")); + break; + } + + return display; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index 4e4f403760..e08540b242 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; @@ -13,33 +12,11 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be displayed in the back office /// [DataContract(Name = "content", Namespace = "")] - public class ContentItemDisplay : TabbedContentItem, INotificationModel + public class ContentItemDisplay : ContentItemDisplayBase { - public ContentItemDisplay() - { - Notifications = new List(); - } - [DataMember(Name = "publishDate")] public DateTime? PublishDate { get; set; } - - /// - /// This is used for validation of a content item. - /// - /// - /// A content item can be invalid but still be saved. This occurs when there's property validation errors, we will - /// still save the item but it cannot be published. So we need a way of returning validation errors as well as the - /// updated model. - /// - [DataMember(Name = "modelState")] - public IDictionary Errors { get; set; } - - /// - /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. - /// - [DataMember(Name = "notifications")] - public List Notifications { get; private set; } - + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs new file mode 100644 index 0000000000..c696aeb675 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; +using Umbraco.Core.Models; + +namespace Umbraco.Web.Models.ContentEditing +{ + public abstract class ContentItemDisplayBase : TabbedContentItem, INotificationModel, IErrorModel + where T : ContentPropertyBasic + where TPersisted : IContentBase + { + protected ContentItemDisplayBase() + { + Notifications = new List(); + } + + /// + /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. + /// + [DataMember(Name = "notifications")] + public List Notifications { get; private set; } + + /// + /// This is used for validation of a content item. + /// + /// + /// A content item can be invalid but still be saved. This occurs when there's property validation errors, we will + /// still save the item but it cannot be published. So we need a way of returning validation errors as well as the + /// updated model. + /// + [DataMember(Name = "modelState")] + public IDictionary Errors { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/IErrorModel.cs b/src/Umbraco.Web/Models/ContentEditing/IErrorModel.cs new file mode 100644 index 0000000000..b56ae528b4 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/IErrorModel.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace Umbraco.Web.Models.ContentEditing +{ + public interface IErrorModel + { + /// + /// This is used for validation of a content item. + /// + /// + /// A content item can be invalid but still be saved. This occurs when there's property validation errors, we will + /// still save the item but it cannot be published. So we need a way of returning validation errors as well as the + /// updated model. + /// + IDictionary Errors { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs index 956194034b..d72fd84c33 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs @@ -8,7 +8,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be displayed in the back office /// [DataContract(Name = "content", Namespace = "")] - public class MediaItemDisplay : TabbedContentItem + public class MediaItemDisplay : ContentItemDisplayBase { } diff --git a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs index 6e1411f62e..b18118d8c2 100644 --- a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs +++ b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs @@ -8,7 +8,8 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { public abstract class TabbedContentItem : ContentItemBasic - where T : ContentPropertyBasic where TPersisted : IContentBase + where T : ContentPropertyBasic + where TPersisted : IContentBase { protected TabbedContentItem() { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 40a697e1a9..6332d13afe 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -305,8 +305,10 @@ + + From e634dba4ea2fb2e3c53be4b49283ecedf8873c0b Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 23 Jul 2013 13:16:18 +0200 Subject: [PATCH 74/85] 2nd attempt: U4-2514 Checkboxlist prevalues in packages broken --- src/Umbraco.Core/Services/PackagingService.cs | 26 +++++- .../DefaultDataKeyValue.cs | 81 ++++++++++--------- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index b0aa76b929..b53cedfd0c 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -9,6 +9,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; @@ -286,7 +287,7 @@ namespace Umbraco.Core.Services var properties = from property in element.Elements() where property.Attribute("isDoc") == null select property; - + IContent content = parent == null ? new Content(nodeName, parentId, contentType) { @@ -303,12 +304,33 @@ namespace Umbraco.Core.Services { string propertyTypeAlias = isLegacySchema ? property.Attribute("alias").Value : property.Name.LocalName; if (content.HasProperty(propertyTypeAlias)) - content.SetValue(propertyTypeAlias, property.Value); + { + var propertyValue = property.Value; + + var propertyType = contentType.PropertyTypes.FirstOrDefault(pt => pt.Alias == propertyTypeAlias); + if (propertyType != null && propertyType.DataTypeId == new Guid(Constants.PropertyEditors.CheckBoxList)) + { + var database = ApplicationContext.Current.DatabaseContext.Database; + var dtos = database.Fetch("WHERE datatypeNo" + "deId = @Id", new { Id = propertyType.DataTypeDefinitionId }); + + var propertyValueList = new List(); + foreach (var preValue in propertyValue.Split(',')) + { + propertyValueList.Add(dtos.Single(x => x.Value == preValue).Id.ToString(CultureInfo.InvariantCulture)); + } + + propertyValue = string.Join(",", propertyValueList.ToArray()); + } + + content.SetValue(propertyTypeAlias, propertyValue); + } } return content; } + + #endregion #region ContentTypes diff --git a/src/umbraco.editorControls/DefaultDataKeyValue.cs b/src/umbraco.editorControls/DefaultDataKeyValue.cs index 26a32ffb18..1a326d0e9d 100644 --- a/src/umbraco.editorControls/DefaultDataKeyValue.cs +++ b/src/umbraco.editorControls/DefaultDataKeyValue.cs @@ -1,48 +1,49 @@ using System; +using System.Linq; using Umbraco.Core.Logging; -using umbraco.DataLayer; namespace umbraco.editorControls { - /// - /// Summary description for cms.businesslogic.datatype.DefaultDataKeyValue. - /// + /// + /// Summary description for cms.businesslogic.datatype.DefaultDataKeyValue. + /// public class DefaultDataKeyValue : cms.businesslogic.datatype.DefaultData - { - public DefaultDataKeyValue(cms.businesslogic.datatype.BaseDataType DataType) : base(DataType) - {} - /// - /// Ov - /// - /// - /// - - public override System.Xml.XmlNode ToXMl(System.Xml.XmlDocument d) - { - // Get the value from - var v = ""; - try - { - // Don't query if there's nothing to query for.. - if (string.IsNullOrWhiteSpace(Value.ToString()) == false) - { - var dr = SqlHelper.ExecuteReader("Select [value] from cmsDataTypeprevalues where id in (" + SqlHelper.EscapeString(Value.ToString()) + ")"); + { + public DefaultDataKeyValue(cms.businesslogic.datatype.BaseDataType DataType) + : base(DataType) + { } - while (dr.Read()) - { - if (v.Length == 0) - v += dr.GetString("value"); - else - v += "," + dr.GetString("value"); - } - dr.Close(); - } - } - catch (Exception ex) - { - LogHelper.Error("An exception occurred converting the property data to XML", ex); - } - return d.CreateCDataSection(v); - } - } + /// + /// Gets the values of from cmsDataTypePreValues table by id and puts them into a CDATA section + /// + /// + /// + public override System.Xml.XmlNode ToXMl(System.Xml.XmlDocument xmlDocument) + { + var value = string.Empty; + try + { + // Don't query if there's nothing to query for.. + if (string.IsNullOrWhiteSpace(Value.ToString()) == false) + { + var dr = SqlHelper.ExecuteReader(string.Format("Select [value] from cmsDataTypeprevalues where id in ({0})", SqlHelper.EscapeString(Value.ToString()))); + + while (dr.Read()) + { + value += value.Length == 0 + ? dr.GetString("value") + : string.Format(",{0}", dr.GetString("value")); + } + + dr.Close(); + } + } + catch (Exception ex) + { + LogHelper.Error("An exception occurred converting the property data to XML", ex); + } + + return xmlDocument.CreateCDataSection(value); + } + } } From a1037ce43caa81a0cd4ac6a83908245bea5061ad Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 23 Jul 2013 15:38:26 +0200 Subject: [PATCH 75/85] Fixes U4-2187 - Enable support for MySQL on Linux --- src/Umbraco.Core/DatabaseContext.cs | 12 ++++++------ .../Persistence/SqlSyntax/MySqlSyntaxProvider.cs | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 214636153a..4f52f61683 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -407,8 +407,8 @@ namespace Umbraco.Core if (supportsCaseInsensitiveQueries == false) { message = "

     

    The database you're trying to use does not support case insensitive queries.
    We currently do not support these types of databases.

    " + - "

    You can fix this by changing the following two settings in your my.ini file in your MySQL installation directory:

    " + - "
    lower_case_table_names=1\nlower_case_file_system=1

    " + + "

    You can fix this by changing the following setting in your my.ini file in your MySQL installation directory:

    " + + "
    lower_case_table_names=1

    " + "

    Note: Make sure to check with your hosting provider if they support case insensitive queries as well.

    " + "

    For more technical information on case sensitivity in MySQL, have a look at " + "the documentation on the subject

    "; @@ -418,8 +418,8 @@ namespace Umbraco.Core else if (supportsCaseInsensitiveQueries == null) { message = "

     

    Warning! Could not check if your database type supports case insensitive queries.
    We currently do not support these databases that do not support case insensitive queries.

    " + - "

    You can check this by looking for the following two settings in your my.ini file in your MySQL installation directory:

    " + - "
    lower_case_table_names=1\nlower_case_file_system=1

    " + + "

    You can check this by looking for the following setting in your my.ini file in your MySQL installation directory:

    " + + "
    lower_case_table_names=1

    " + "

    Note: Make sure to check with your hosting provider if they support case insensitive queries as well.

    " + "

    For more technical information on case sensitivity in MySQL, have a look at " + "the documentation on the subject

    "; @@ -432,8 +432,8 @@ namespace Umbraco.Core "

    Note: You're using MySQL and the database instance you're connecting to seems to support case insensitive queries.

    " + "

    However, your hosting provider may not support this option. Umbraco does not currently support MySQL installs that do not support case insensitive queries

    " + "

    Make sure to check with your hosting provider if they support case insensitive queries as well.

    " + - "

    They can check this by looking for the following two settings in the my.ini file in their MySQL installation directory:

    " + - "
    lower_case_table_names=1\nlower_case_file_system=1

    " + + "

    They can check this by looking for the following setting in the my.ini file in their MySQL installation directory:

    " + + "
    lower_case_table_names=1

    " + "

    For more technical information on case sensitivity in MySQL, have a look at " + "the documentation on the subject

    "; } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs index 389650d606..52ea11e572 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs @@ -317,11 +317,10 @@ namespace Umbraco.Core.Persistence.SqlSyntax { db.OpenSharedConnection(); // Need 4 @ signs as it is regarded as a parameter, @@ escapes it once, @@@@ escapes it twice - var lowerCaseFileSystem = db.Fetch("SELECT @@@@Global.lower_case_file_system"); var lowerCaseTableNames = db.Fetch("SELECT @@@@Global.lower_case_table_names"); - if(lowerCaseFileSystem.Any() && lowerCaseTableNames.Any()) - supportsCaseInsensitiveQueries = lowerCaseFileSystem.First() == 1 && lowerCaseTableNames.First() == 1; + if(lowerCaseTableNames.Any()) + supportsCaseInsensitiveQueries = lowerCaseTableNames.First() == 1; } catch(Exception ex) { From ca1fe5ff2a6e021eed10e397cb19ccbecdaa2488 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 23 Jul 2013 16:13:20 +0200 Subject: [PATCH 76/85] Unit test for: U4-2514 Checkboxlist prevalues in packages broken --- .../CheckboxList-Content-Package.xml | 76 +++++++++++++++++++ .../Importing/ImportResources.Designer.cs | 30 +++++++- .../Services/Importing/ImportResources.resx | 3 + .../Services/Importing/PackageImportTests.cs | 41 +++++++++- src/Umbraco.Tests/Umbraco.Tests.csproj | 3 + 5 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Tests/Services/Importing/CheckboxList-Content-Package.xml diff --git a/src/Umbraco.Tests/Services/Importing/CheckboxList-Content-Package.xml b/src/Umbraco.Tests/Services/Importing/CheckboxList-Content-Package.xml new file mode 100644 index 0000000000..a0f4448393 --- /dev/null +++ b/src/Umbraco.Tests/Services/Importing/CheckboxList-Content-Package.xml @@ -0,0 +1,76 @@ + + + + + + CheckboxListTest + 1 + MIT license + 1 + + 3 + 0 + 0 + + + + 1 + 1 + + + + + + + + + + + + + + NewType + NewType + .sprTreeFolder + folder.png + + + True + + + + NewType + + + + + testList + testList + b4471851-82b6-4c75-afa4-39fa9c6a75e9 + 8dacee1a-1bbd-46c0-b07f-8ffd49fcca7c + + + False + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs b/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs index f4874b86f2..9b0017ff5e 100644 --- a/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs +++ b/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18033 +// Runtime Version:4.0.30319.18213 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -60,6 +60,34 @@ namespace Umbraco.Tests.Services.Importing { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-8" standalone="no"?> + ///<umbPackage> + /// <files /> + /// <info> + /// <package> + /// <name>CheckboxListTest</name> + /// <version>1</version> + /// <license url="http://www.opensource.org/licenses/mit-license.php">MIT license</license> + /// <url>1</url> + /// <requirements> + /// <major>3</major> + /// <minor>0</minor> + /// <patch>0</patch> + /// </requirements> + /// </package> + /// <author> + /// <name>1</name> + /// <website>1</website> + /// </author> + /// <r [rest of string was truncated]";. + /// + internal static string CheckboxList_Content_Package { + get { + return ResourceManager.GetString("CheckboxList_Content_Package", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-8" standalone="no"?> ///<umbPackage> diff --git a/src/Umbraco.Tests/Services/Importing/ImportResources.resx b/src/Umbraco.Tests/Services/Importing/ImportResources.resx index b717a9600d..26f4589221 100644 --- a/src/Umbraco.Tests/Services/Importing/ImportResources.resx +++ b/src/Umbraco.Tests/Services/Importing/ImportResources.resx @@ -139,4 +139,7 @@ templateonly-updated-package.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + checkboxlist-content-package.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs index 1fbfa01067..fa11f2aa78 100644 --- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs +++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs @@ -1,6 +1,9 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Xml.Linq; using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using umbraco.editorControls.MultiNodeTreePicker; namespace Umbraco.Tests.Services.Importing { @@ -213,6 +216,42 @@ namespace Umbraco.Tests.Services.Importing Assert.That(contents.Count(), Is.EqualTo(numberOfDocs)); } + [Test] + public void PackagingService_Can_Import_CheckboxList_Content_Package_Xml() + { + // Arrange + string strXml = ImportResources.CheckboxList_Content_Package; + var xml = XElement.Parse(strXml); + var dataTypeElement = xml.Descendants("DataTypes").First(); + var docTypesElement = xml.Descendants("DocumentTypes").First(); + var element = xml.Descendants("DocumentSet").First(); + var packagingService = ServiceContext.PackagingService; + + // Act + var dataTypeDefinitions = packagingService.ImportDataTypeDefinitions(dataTypeElement); + var contentTypes = packagingService.ImportContentTypes(docTypesElement); + var contents = packagingService.ImportContent(element); + var numberOfDocs = (from doc in element.Descendants() + where (string) doc.Attribute("isDoc") == "" + select doc).Count(); + + var database = ApplicationContext.DatabaseContext.Database; + var dtos = database.Fetch("WHERE datatypeNodeId = @Id", new { dataTypeDefinitions.First().Id }); + int preValueId; + int.TryParse(contents.First().GetValue("testList"), out preValueId); + var preValueKey = dtos.SingleOrDefault(x => x.Id == preValueId); + + // Assert + Assert.That(dataTypeDefinitions, Is.Not.Null); + Assert.That(dataTypeDefinitions.Any(), Is.True); + Assert.That(contents, Is.Not.Null); + Assert.That(contentTypes.Any(), Is.True); + Assert.That(contents.Any(), Is.True); + Assert.That(contents.Count(), Is.EqualTo(numberOfDocs)); + Assert.That(preValueKey, Is.Not.Null); + Assert.That(preValueKey.Value, Is.EqualTo("test3")); + } + [Test] public void PackagingService_Can_Import_Templates_Package_Xml_With_Invalid_Master() { diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 37b33cf460..d9b9b857b1 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -506,6 +506,9 @@ + + Designer + From 80394f08fb741d7790f969f44dac211539e83982 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 09:36:01 +1000 Subject: [PATCH 77/85] Fixed runtime cache provider issues & unit tests. --- src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index 809d1b88f5..06a624a771 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -78,7 +78,7 @@ namespace Umbraco.Core.Persistence.Caching { foreach (var key in _keyTracker) { - if (key.StartsWith(type.Name)) + if (key.StartsWith(string.Format("{0}{1}-", CacheItemPrefix, type.Name))) { var item = _memoryCache != null ? _memoryCache.Get(key) From 8b2d1b8eaba5db6abff2b9e7688f5d8ff43ae5fe Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 10:11:05 +1000 Subject: [PATCH 78/85] Fixed Template model class to not have it's own NodePath property which was always null since it wasn't mapped (and there was no point in it). --- src/Umbraco.Core/Models/Template.cs | 18 +----------------- .../Persistence/Factories/TemplateFactory.cs | 4 ++-- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 1941e19d40..c032e290b1 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -20,7 +20,6 @@ namespace Umbraco.Core.Models private int _level; private int _sortOrder; private int _parentId; - private string _nodePath; private int _masterTemplateId; private string _masterTemplateAlias; @@ -28,7 +27,6 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo NodePathSelector = ExpressionHelper.GetPropertyInfo(x => x.NodePath); //private static readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateId); private static readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateAlias); @@ -104,21 +102,7 @@ namespace Umbraco.Core.Models }, _parentId, ParentIdSelector); } } - - [DataMember] - internal string NodePath - { - get { return _nodePath; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _nodePath = value; - return _nodePath; - }, _nodePath, NodePathSelector); - } - } - + [DataMember] internal Lazy MasterTemplateId { get; set; } diff --git a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs index ae2c2831f8..a62e9d3c00 100644 --- a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs @@ -37,7 +37,7 @@ namespace Umbraco.Core.Persistence.Factories Level = dto.NodeDto.Level, ParentId = dto.NodeDto.ParentId, SortOrder = dto.NodeDto.SortOrder, - NodePath = dto.NodeDto.Path + Path = dto.NodeDto.Path }; if(dto.Master.HasValue) @@ -83,7 +83,7 @@ namespace Umbraco.Core.Persistence.Factories Level = short.Parse(entity.Level.ToString(CultureInfo.InvariantCulture)), NodeObjectType = _nodeObjectTypeId, ParentId = entity.ParentId, - Path = entity.NodePath, + Path = entity.Path, SortOrder = entity.SortOrder, Text = entity.Name, Trashed = false, From 7164f23a98c7851e690b31fbbe2f547bcff816b9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 11:31:31 +1000 Subject: [PATCH 79/85] Fixes up validation styling and the validation summary close button display. --- .../umbraco/controls/ContentControl.cs | 35 +++++++++++-------- src/umbraco.controls/TabPage.cs | 4 ++- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs index 121cffdb9b..589682a18c 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs @@ -545,16 +545,19 @@ namespace umbraco.controls { try { - RequiredFieldValidator rq = new RequiredFieldValidator(); - rq.ControlToValidate = dt.DataEditor.Editor.ID; - Control component = dt.DataEditor.Editor; // holder.FindControl(rq.ControlToValidate); - ValidationPropertyAttribute attribute = - (ValidationPropertyAttribute) - TypeDescriptor.GetAttributes(component)[typeof(ValidationPropertyAttribute)]; + var rq = new RequiredFieldValidator + { + ControlToValidate = dt.DataEditor.Editor.ID, + CssClass = "error" + }; + rq.Style.Add(HtmlTextWriterStyle.Display, "block"); + rq.Style.Add(HtmlTextWriterStyle.Padding, "2px"); + var component = dt.DataEditor.Editor; // holder.FindControl(rq.ControlToValidate); + var attribute = (ValidationPropertyAttribute)TypeDescriptor.GetAttributes(component)[typeof(ValidationPropertyAttribute)]; PropertyDescriptor pd = null; if (attribute != null) { - pd = TypeDescriptor.GetProperties(component, (Attribute[])null)[attribute.Name]; + pd = TypeDescriptor.GetProperties(component, null)[attribute.Name]; } if (pd != null) { @@ -578,17 +581,19 @@ namespace umbraco.controls { try { - RegularExpressionValidator rv = new RegularExpressionValidator(); - rv.ControlToValidate = dt.DataEditor.Editor.ID; - - Control component = dt.DataEditor.Editor; // holder.FindControl(rq.ControlToValidate); - ValidationPropertyAttribute attribute = - (ValidationPropertyAttribute) - TypeDescriptor.GetAttributes(component)[typeof(ValidationPropertyAttribute)]; + var rv = new RegularExpressionValidator + { + ControlToValidate = dt.DataEditor.Editor.ID, + CssClass = "error" + }; + rv.Style.Add(HtmlTextWriterStyle.Display, "block"); + rv.Style.Add(HtmlTextWriterStyle.Padding, "2px"); + var component = dt.DataEditor.Editor; // holder.FindControl(rq.ControlToValidate); + var attribute = (ValidationPropertyAttribute)TypeDescriptor.GetAttributes(component)[typeof(ValidationPropertyAttribute)]; PropertyDescriptor pd = null; if (attribute != null) { - pd = TypeDescriptor.GetProperties(component, (Attribute[])null)[attribute.Name]; + pd = TypeDescriptor.GetProperties(component, null)[attribute.Name]; } if (pd != null) { diff --git a/src/umbraco.controls/TabPage.cs b/src/umbraco.controls/TabPage.cs index 3cf43b78ab..9ac1fb0c2e 100644 --- a/src/umbraco.controls/TabPage.cs +++ b/src/umbraco.controls/TabPage.cs @@ -18,6 +18,7 @@ namespace umbraco.uicontrols { private bool _hasMenu = true; private readonly ScrollingMenu _menu = new ScrollingMenu(); protected LiteralControl ErrorHeaderControl = new LiteralControl(); + private LiteralControl _closeButtonControl = new LiteralControl(); private readonly ValidationSummary _vs = new ValidationSummary(); private readonly Control _tempErr = new Control(); @@ -61,7 +62,7 @@ namespace umbraco.uicontrols { // Add error pane _tempErr.Visible = false; _tempErr.ID = String.Format("{0}_errorPaneContainer", this.ID); - _tempErr.Controls.Add(new LiteralControl("

    ")); + _tempErr.Controls.Add(_closeButtonControl); _tempErr.Controls.Add(ErrorHeaderControl); _tempErr.Controls.Add(new LiteralControl("

    ")); _tempErr.Controls.Add(_vs); @@ -84,6 +85,7 @@ namespace umbraco.uicontrols { protected override void Render(HtmlTextWriter writer) { + _closeButtonControl.Text = "

    "; ErrorHeaderControl.Text = ErrorHeader; CreateChildControls(); writer.WriteLine("
    "); From 4d39ce1202d6d119e751a55f9bf297327a755025 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 11:44:26 +1000 Subject: [PATCH 80/85] Fixes Allow At Root styling --- .../umbraco/controls/ContentTypeControlNew.ascx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx b/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx index 43eb7fb9a1..90496509a9 100644 --- a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx +++ b/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx @@ -79,9 +79,8 @@ - -
    - Only Content Types with this checked can be created at the root level of Content and Media trees + +
    From 7f4abb48935f0529d8ca03ce3c8b9bdeb58f6884 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 12:54:10 +1000 Subject: [PATCH 81/85] Fixed editContent.aspx to let the business logic handle the property validation when trying to publish and show the correct status message result (if it was not publishable). Adds the invalid properties collection to the PublishStatus so those can be shown too. --- src/Umbraco.Core/Models/ContentBase.cs | 13 ++- src/Umbraco.Core/Publishing/PublishStatus.cs | 7 +- src/Umbraco.Core/Services/ContentService.cs | 2 + src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 2 +- .../umbraco/config/lang/en_us.xml | 2 +- .../WebServices/BulkPublishController.cs | 6 +- .../umbraco/dialogs/publish.aspx.cs | 1 + .../umbraco/editContent.aspx.cs | 101 ++++++++++-------- src/umbraco.cms/businesslogic/web/Document.cs | 26 +++-- 9 files changed, 102 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 4c00831cae..6414ea2116 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -27,6 +27,7 @@ namespace Umbraco.Core.Models private bool _trashed; private int _contentTypeId; private PropertyCollection _properties; + private readonly List _lastInvalidProperties = new List(); /// /// Protected constructor for ContentBase (Base for Content and Media) @@ -421,7 +422,17 @@ namespace Umbraco.Core.Models /// True if content is valid otherwise false public virtual bool IsValid() { - return Properties.Any(property => !property.IsValid()) == false; + _lastInvalidProperties.Clear(); + _lastInvalidProperties.AddRange(Properties.Where(property => property.IsValid() == false)); + return _lastInvalidProperties.Any() == false; + } + + /// + /// Returns a collection of the result of the last validation process, this collection contains all invalid properties. + /// + internal IEnumerable LastInvalidProperties + { + get { return _lastInvalidProperties; } } public abstract void ChangeTrashedState(bool isTrashed, int parentId = -20); diff --git a/src/Umbraco.Core/Publishing/PublishStatus.cs b/src/Umbraco.Core/Publishing/PublishStatus.cs index 6bbaa59783..415b758965 100644 --- a/src/Umbraco.Core/Publishing/PublishStatus.cs +++ b/src/Umbraco.Core/Publishing/PublishStatus.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Umbraco.Core.Models; namespace Umbraco.Core.Publishing @@ -10,6 +11,11 @@ namespace Umbraco.Core.Publishing public IContent ContentItem { get; private set; } public PublishStatusType StatusType { get; internal set; } + /// + /// Gets sets the invalid properties if the status failed due to validation. + /// + public IEnumerable InvalidProperties { get; set; } + public PublishStatus(IContent content, PublishStatusType statusType) { ContentItem = content; @@ -24,6 +30,5 @@ namespace Umbraco.Core.Publishing { } - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index ed47bc76d6..94aa0f9140 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1552,6 +1552,8 @@ namespace Umbraco.Core.Services publishStatus.StatusType = CheckAndLogIsPublishable(content); //Content contains invalid property values and can therefore not be published - fire event? publishStatus.StatusType = CheckAndLogIsValid(content); + //set the invalid properties (if there are any) + publishStatus.InvalidProperties = ((ContentBase) content).LastInvalidProperties; //if we're still successful, then publish using the strategy if (publishStatus.StatusType == PublishStatusType.Success) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 8923314534..b1eb029426 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -670,7 +670,7 @@ To manage your website, simply open the umbraco back office and start adding con diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index e56017416b..af7156b776 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -656,7 +656,7 @@ To manage your website, simply open the umbraco back office and start adding con diff --git a/src/Umbraco.Web/WebServices/BulkPublishController.cs b/src/Umbraco.Web/WebServices/BulkPublishController.cs index 74fdf75919..2c18a6df2c 100644 --- a/src/Umbraco.Web/WebServices/BulkPublishController.cs +++ b/src/Umbraco.Web/WebServices/BulkPublishController.cs @@ -93,7 +93,11 @@ namespace Umbraco.Web.WebServices string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), UmbracoUser); case PublishStatusType.FailedContentInvalid: return ui.Text("publish", "contentPublishedFailedInvalid", - string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), UmbracoUser); + new []{ + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + string.Join(",", status.InvalidProperties.Select(x => x.Alias)) + }, + UmbracoUser); default: return status.StatusType.ToString(); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/publish.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/publish.aspx.cs index dfb7507073..255c61cbe8 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/publish.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/publish.aspx.cs @@ -14,6 +14,7 @@ namespace umbraco.dialogs /// /// Summary description for publish. /// + [Obsolete("This is no longer used whatsoever and will be removed from the codebase")] public partial class publish : UmbracoEnsuredPage { protected Literal total; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs index 5cbd2b87ef..ab8579db27 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs @@ -4,6 +4,7 @@ using System.Web.UI.WebControls; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Caching; using Umbraco.Core.IO; +using Umbraco.Core.Publishing; using Umbraco.Core.Services; using umbraco.BusinessLogic.Actions; using umbraco.uicontrols.DatePicker; @@ -290,65 +291,73 @@ namespace umbraco.cms.presentation { //update UI and set document properties PerformSaveLogic(); + + //the business logic here will check to see if the doc can actually be published and will return the + // appropriate result so we can display the correct error messages (or success). + var savePublishResult = _document.SaveAndPublishWithResult(UmbracoUser); - //the page is not valid, we'll still need to save the document and persist it - if (!Page.IsValid) - { - ClientTools.ShowSpeechBubble( - speechBubbleIcon.save, ui.Text("speechBubbles", "editContentSavedHeader", null), - ui.Text("speechBubbles", "editContentSavedText", null)); - _document.Save(); - return; - } + ShowMessageForStatus(savePublishResult.Result); - //If the document is at a level deeper than the root but it's ancestor's path is not published, - //it means that we cannot actually publish this document because one of it's parent's is not published. - //So, we still need to save the document but we'll show a different notification. - if (_document.Level > 1 && !Services.ContentService.IsPublishable(_document.Content)) + if (savePublishResult.Success) { - ClientTools.ShowSpeechBubble( - speechBubbleIcon.warning, ui.Text("publish"), - ui.Text("speechBubbles", "editContentPublishedFailedByParent")); - _document.Save(); - return; - } - - if (_document.SaveAndPublish(UmbracoUser)) - { - //library.UpdateDocumentCache(_document.Id); - - ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editContentPublishedHeader", null), ui.Text("speechBubbles", "editContentPublishedText", null)); - _littPublishStatus.Text = string.Format("{0}: {1}
    ", ui.Text("content", "lastPublished", UmbracoUser), _document.VersionDate.ToString()); if (UmbracoUser.GetPermissions(_document.Path).IndexOf("U") > -1) + { _unPublish.Visible = true; + } _documentHasPublishedVersion = _document.Content.HasPublishedVersion(); - - //if (previouslyPublished == false) - //{ - // var descendants = ((ContentService)ApplicationContext.Current.Services.ContentService) - // .GetPublishedDescendants(_document.Content).ToList(); - - // if (descendants.Any()) - // { - // foreach (var descendant in descendants) - // { - // library.UpdateDocumentCache(descendant.Id); - // } - // library.RefreshContent(); - // } - //} } - else - { - ClientTools.ShowSpeechBubble(speechBubbleIcon.warning, ui.Text("publish"), ui.Text("speechBubbles", "contentPublishedFailedByEvent")); - } - + ClientTools.SyncTree(_document.Path, true); } + private void ShowMessageForStatus(PublishStatus status) + { + switch (status.StatusType) + { + case PublishStatusType.Success: + case PublishStatusType.SuccessAlreadyPublished: + ClientTools.ShowSpeechBubble( + speechBubbleIcon.save, + ui.Text("speechBubbles", "editContentPublishedHeader", UmbracoUser), + ui.Text("speechBubbles", "editContentPublishedText", UmbracoUser)); + break; + case PublishStatusType.FailedPathNotPublished: + ClientTools.ShowSpeechBubble( + speechBubbleIcon.warning, + ui.Text("publish"), + ui.Text("publish", "contentPublishedFailedByParent", + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + UmbracoUser).Trim()); + break; + case PublishStatusType.FailedCancelledByEvent: + ClientTools.ShowSpeechBubble( + speechBubbleIcon.warning, + ui.Text("publish"), + ui.Text("speechBubbles", "contentPublishedFailedByEvent")); + break; + case PublishStatusType.FailedHasExpired: + case PublishStatusType.FailedAwaitingRelease: + case PublishStatusType.FailedIsTrashed: + case PublishStatusType.FailedContentInvalid: + ClientTools.ShowSpeechBubble( + speechBubbleIcon.warning, + ui.Text("publish"), + ui.Text("publish", "contentPublishedFailedInvalid", + new[] + { + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + string.Join(",", status.InvalidProperties.Select(x => x.Alias)) + }, + UmbracoUser).Trim()); + break; + default: + throw new IndexOutOfRangeException(); + } + } + protected void UnPublishDo(object sender, EventArgs e) { _document.UnPublish(); diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 2df9e19f37..724ca09b34 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -1027,11 +1027,12 @@ namespace umbraco.cms.businesslogic.web } /// - /// Saves and publishes a document + /// Do not use! only used internally in order to get the published status until we upgrade everything to use the new API /// - /// The usercontext under which the action are performed + /// /// - public bool SaveAndPublish(User u) + [Obsolete("Do not use! only used internally in order to get the published status until we upgrade everything to use the new API")] + internal Attempt SaveAndPublishWithResult(User u) { foreach (var property in GenericProperties) { @@ -1065,13 +1066,24 @@ namespace umbraco.cms.businesslogic.web //Now we need to fire the After publish event FireAfterPublish(publishArgs); - return result.Success; + return result; } - - return false; + + return Attempt.False; } - return false; + return Attempt.False; + } + + /// + /// Saves and publishes a document + /// + /// The usercontext under which the action are performed + /// + public bool SaveAndPublish(User u) + { + var result = SaveAndPublishWithResult(u); + return result.Success; } [Obsolete("Obsolete, Use Umbraco.Core.Services.ContentService.HasPublishedVersion()", false)] From ffff9efaa820aeafe2abb7f4e85e58b783c350ed Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 13:06:25 +1000 Subject: [PATCH 82/85] Fixes: U4-2535 The actions/publish.aspx page does not publish correctly and show the correct publish result --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 2 +- .../umbraco/config/lang/en_us.xml | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 4 +- .../umbraco/actions/publish.aspx.cs | 42 ++++++++++++++++++- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index b1eb029426..4acaa7b2a6 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -670,7 +670,7 @@ To manage your website, simply open the umbraco back office and start adding con diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index af7156b776..430669c5d1 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -656,7 +656,7 @@ To manage your website, simply open the umbraco back office and start adding con diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index a41c89da66..38370e7832 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1826,7 +1826,9 @@ - + + ASPXCodeBehind + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/actions/publish.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/actions/publish.aspx.cs index 9b964cb166..928ac680a6 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/actions/publish.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/actions/publish.aspx.cs @@ -2,12 +2,14 @@ using System; using System.Data; using System.Configuration; using System.Collections; +using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; +using Umbraco.Core.Publishing; using umbraco.cms.businesslogic.web; using Umbraco.Core; @@ -39,9 +41,45 @@ namespace umbraco.presentation.actions deleteMessage.Text = ui.Text("editContentPublishedHeader"); confirm.Visible = false; - d.SaveAndPublish(UmbracoUser); + + var result = d.SaveAndPublishWithResult(UmbracoUser); + if (result.Success) + { + deleted.Text = ui.Text("editContentPublishedHeader") + " ('" + d.Text + "') " + ui.Text("editContentPublishedText") + "

    " + ui.Text("view") + " " + d.Text + ""; + } + else + { + deleted.Text = "

    " + GetMessageForStatus(result.Result) + "
    "; + } - deleted.Text = ui.Text("editContentPublishedHeader") + " ('" + d.Text + "') " + ui.Text("editContentPublishedText") + "

    " + ui.Text("view") + " " + d.Text + ""; + } + + private string GetMessageForStatus(PublishStatus status) + { + switch (status.StatusType) + { + case PublishStatusType.Success: + case PublishStatusType.SuccessAlreadyPublished: + return ui.Text("speechBubbles", "editContentPublishedText", UmbracoUser); + case PublishStatusType.FailedPathNotPublished: + return ui.Text("publish", "contentPublishedFailedByParent", + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + UmbracoUser).Trim(); + case PublishStatusType.FailedCancelledByEvent: + return ui.Text("speechBubbles", "contentPublishedFailedByEvent"); + case PublishStatusType.FailedHasExpired: + case PublishStatusType.FailedAwaitingRelease: + case PublishStatusType.FailedIsTrashed: + case PublishStatusType.FailedContentInvalid: + return ui.Text("publish", "contentPublishedFailedInvalid", + new[] + { + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + string.Join(",", status.InvalidProperties.Select(x => x.Alias)) + }, UmbracoUser); + default: + throw new IndexOutOfRangeException(); + } } } } From 7d6736907f9db29f50d1f66bb9d16761e2e79809 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 24 Jul 2013 14:59:49 +1000 Subject: [PATCH 83/85] adds correct messaging for when publishing fails even after validation might fail --- src/Umbraco.Web/Editors/ContentController.cs | 153 ++++++------------ .../Editors/ContentControllerBase.cs | 99 ++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 3 files changed, 147 insertions(+), 106 deletions(-) create mode 100644 src/Umbraco.Web/Editors/ContentControllerBase.cs diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 55b3edc9fc..372b0671ae 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -6,10 +6,9 @@ using System.Net.Http; using System.Web.Http; using System.Web.Http.ModelBinding; using Umbraco.Core; -using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.Editors; using Umbraco.Core.Models.Membership; +using Umbraco.Core.Publishing; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; @@ -22,89 +21,6 @@ using umbraco; namespace Umbraco.Web.Editors { - public abstract class ContentControllerBase : UmbracoAuthorizedJsonController - { - ///

    - /// Constructor - /// - protected ContentControllerBase() - : this(UmbracoContext.Current) - { - } - - /// - /// Constructor - /// - /// - protected ContentControllerBase(UmbracoContext umbracoContext) - : base(umbracoContext) - { - } - - protected void HandleContentNotFound(int id) - { - ModelState.AddModelError("id", string.Format("content with id: {0} was not found", id)); - var errorResponse = Request.CreateErrorResponse( - HttpStatusCode.NotFound, - ModelState); - throw new HttpResponseException(errorResponse); - } - - protected void UpdateName(ContentItemSave contentItem) - where TPersisted : IContentBase - { - //Don't update the name if it is empty - if (!contentItem.Name.IsNullOrWhiteSpace()) - { - contentItem.PersistedContent.Name = contentItem.Name; - } - } - - protected void MapPropertyValues(ContentItemSave contentItem) - where TPersisted : IContentBase - { - //Map the property values - foreach (var p in contentItem.ContentDto.Properties) - { - //get the dbo property - var dboProperty = contentItem.PersistedContent.Properties[p.Alias]; - - //create the property data to send to the property editor - var d = new Dictionary(); - //add the files if any - var files = contentItem.UploadedFiles.Where(x => x.PropertyId == p.Id).ToArray(); - if (files.Any()) - { - d.Add("files", files); - } - var data = new ContentPropertyData(p.Value, d); - - //get the deserialized value from the property editor - if (p.PropertyEditor == null) - { - LogHelper.Warn("No property editor found for property " + p.Alias); - } - else - { - dboProperty.Value = p.PropertyEditor.ValueEditor.DeserializeValue(data, dboProperty.Value); - } - } - } - - protected void HandleInvalidModelState(ContentItemDisplayBase display) - where TPersisted : IContentBase - where T : ContentPropertyBasic - { - //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 - if (!ModelState.IsValid) - { - display.Errors = ModelState.ToErrorDictionary(); - throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, display)); - } - } - - } - /// /// The API controller used for editing content /// @@ -226,7 +142,9 @@ namespace Umbraco.Web.Editors } } - bool isPublishSuccess = false; + //initialize this to successful + var publishStatus = new Attempt(true, null); + if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) { //save the item @@ -235,7 +153,7 @@ namespace Umbraco.Web.Editors else { //publish the item and check if it worked, if not we will show a diff msg below - isPublishSuccess = Services.ContentService.SaveAndPublish(contentItem.PersistedContent); + publishStatus = ((ContentService)Services.ContentService).SaveAndPublishInternal(contentItem.PersistedContent); } @@ -254,30 +172,53 @@ namespace Umbraco.Web.Editors break; case ContentSaveAction.Publish: case ContentSaveAction.PublishNew: - - //If the document is at a level deeper than the root but it's ancestor's path is not published, - //it means that we cannot actually publish this document because one of it's parent's is not published. - //So, we still need to save the document but we'll show a different notification. - if (contentItem.PersistedContent.Level > 1 && !Services.ContentService.IsPublishable(contentItem.PersistedContent)) - { - display.AddWarningNotification(ui.Text("publish"), ui.Text("speechBubbles", "editContentPublishedFailedByParent")); - } - else - { - if (isPublishSuccess) - { - display.AddSuccessNotification(ui.Text("speechBubbles", "editContentPublishedHeader"), ui.Text("speechBubbles", "editContentPublishedText")); - } - else - { - display.AddWarningNotification(ui.Text("publish"), ui.Text("speechBubbles", "contentPublishedFailedByEvent")); - } - } + ShowMessageForStatus(publishStatus.Result, display); break; } return display; } + private void ShowMessageForStatus(PublishStatus status, ContentItemDisplay display) + { + switch (status.StatusType) + { + case PublishStatusType.Success: + case PublishStatusType.SuccessAlreadyPublished: + display.AddSuccessNotification( + ui.Text("speechBubbles", "editContentPublishedHeader", UmbracoUser), + ui.Text("speechBubbles", "editContentPublishedText", UmbracoUser)); + break; + case PublishStatusType.FailedPathNotPublished: + display.AddWarningNotification( + ui.Text("publish"), + ui.Text("publish", "contentPublishedFailedByParent", + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + UmbracoUser).Trim()); + break; + case PublishStatusType.FailedCancelledByEvent: + display.AddWarningNotification( + ui.Text("publish"), + ui.Text("speechBubbles", "contentPublishedFailedByEvent")); + break; + case PublishStatusType.FailedHasExpired: + case PublishStatusType.FailedAwaitingRelease: + case PublishStatusType.FailedIsTrashed: + case PublishStatusType.FailedContentInvalid: + display.AddWarningNotification( + ui.Text("publish"), + ui.Text("publish", "contentPublishedFailedInvalid", + new[] + { + string.Format("{0} ({1})", status.ContentItem.Name, status.ContentItem.Id), + string.Join(",", status.InvalidProperties.Select(x => x.Alias)) + }, + UmbracoUser).Trim()); + break; + default: + throw new IndexOutOfRangeException(); + } + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs new file mode 100644 index 0000000000..12da55b2ee --- /dev/null +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; +using Umbraco.Core; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Editors +{ + /// + /// An abstract base controller used for media/content (and probably members) to try to reduce code replication. + /// + public abstract class ContentControllerBase : UmbracoAuthorizedJsonController + { + /// + /// Constructor + /// + protected ContentControllerBase() + : this(UmbracoContext.Current) + { + } + + /// + /// Constructor + /// + /// + protected ContentControllerBase(UmbracoContext umbracoContext) + : base(umbracoContext) + { + } + + protected void HandleContentNotFound(int id) + { + ModelState.AddModelError("id", string.Format("content with id: {0} was not found", id)); + var errorResponse = Request.CreateErrorResponse( + HttpStatusCode.NotFound, + ModelState); + throw new HttpResponseException(errorResponse); + } + + protected void UpdateName(ContentItemSave contentItem) + where TPersisted : IContentBase + { + //Don't update the name if it is empty + if (!contentItem.Name.IsNullOrWhiteSpace()) + { + contentItem.PersistedContent.Name = contentItem.Name; + } + } + + protected void MapPropertyValues(ContentItemSave contentItem) + where TPersisted : IContentBase + { + //Map the property values + foreach (var p in contentItem.ContentDto.Properties) + { + //get the dbo property + var dboProperty = contentItem.PersistedContent.Properties[p.Alias]; + + //create the property data to send to the property editor + var d = new Dictionary(); + //add the files if any + var files = contentItem.UploadedFiles.Where(x => x.PropertyId == p.Id).ToArray(); + if (files.Any()) + { + d.Add("files", files); + } + var data = new ContentPropertyData(p.Value, d); + + //get the deserialized value from the property editor + if (p.PropertyEditor == null) + { + LogHelper.Warn("No property editor found for property " + p.Alias); + } + else + { + dboProperty.Value = p.PropertyEditor.ValueEditor.DeserializeValue(data, dboProperty.Value); + } + } + } + + protected void HandleInvalidModelState(ContentItemDisplayBase display) + where TPersisted : IContentBase + where T : ContentPropertyBasic + { + //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 + if (!ModelState.IsValid) + { + display.Errors = ModelState.ToErrorDictionary(); + throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, display)); + } + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 1abb5c1ac7..fd44567e6f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -298,6 +298,7 @@ + From 4b8fed9f069b02ee427ed7855df4f59237ef887a Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 25 Jul 2013 15:31:26 +1000 Subject: [PATCH 84/85] Started converting content model mapping over to use AutoMapper to fix the composite tabs/properties. New unit tests for the mapping as well. --- src/Umbraco.Core/CoreBootManager.cs | 2 +- src/Umbraco.Core/Models/ContentExtensions.cs | 7 +- .../Models/Mapping/IMapperConfiguration.cs | 2 +- .../Models/Mapping/MapperConfiguration.cs | 2 +- src/Umbraco.Core/Models/PropertyGroup.cs | 2 + .../Mapping/ContentWebModelMappingTests.cs | 118 ++++++- .../TestHelpers/BaseUmbracoApplicationTest.cs | 2 +- src/Umbraco.Web/Editors/ContentController.cs | 11 +- .../ContentEditing/ContentPropertyBasic.cs | 7 + .../Models/Mapping/BaseContentModelMapper.cs | 28 +- .../Models/Mapping/ContentModelMapper.cs | 85 +++-- .../Models/Mapping/ContentTypeModelMapper.cs | 22 -- .../Models/Mapping/MediaModelMapper.cs | 10 - .../Models/Mapping/MediaTypeModelMapper.cs | 28 ++ .../Models/Mapping/NewContentMapper.cs | 314 ++++++++++++++++++ .../Models/Mapping/SectionModelMapper.cs | 3 +- .../Models/Mapping/UserModelMapper.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 + .../WebApi/Binders/ContentItemBinder.cs | 11 +- .../WebApi/Binders/MediaItemBinder.cs | 3 +- .../ApplicationRegistrar.cs | 2 +- .../ApplicationTreeRegistrar.cs | 2 +- 22 files changed, 548 insertions(+), 117 deletions(-) create mode 100644 src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs create mode 100644 src/Umbraco.Web/Models/Mapping/NewContentMapper.cs diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 9f5fb22966..92195c9271 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -126,7 +126,7 @@ namespace Umbraco.Core { foreach (var m in ApplicationEventsResolver.Current.ApplicationEventHandlers.OfType()) { - m.ConfigureMappings(configuration); + m.ConfigureMappings(configuration, ApplicationContext); } }); } diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index 860acdd852..1ca6ff4b7c 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -158,7 +158,9 @@ namespace Umbraco.Core.Models public static IEnumerable GetNonGroupedProperties(this IContentBase content) { var propertyIdsInTabs = content.PropertyGroups.SelectMany(pg => pg.PropertyTypes).Select(pt => pt.Id); - return content.Properties.Where(property => propertyIdsInTabs.Contains(property.PropertyTypeId) == false); + return content.Properties + .Where(property => propertyIdsInTabs.Contains(property.PropertyTypeId) == false) + .OrderBy(x => x.PropertyType.SortOrder); } /// @@ -173,7 +175,8 @@ namespace Umbraco.Core.Models return content.Properties .Where(property => propertyGroup.PropertyTypes .Select(propertyType => propertyType.Id) - .Contains(property.PropertyTypeId)); + .Contains(property.PropertyTypeId)) + .OrderBy(x => x.PropertyType.SortOrder); } /// diff --git a/src/Umbraco.Core/Models/Mapping/IMapperConfiguration.cs b/src/Umbraco.Core/Models/Mapping/IMapperConfiguration.cs index 0ca76417de..8ea7c46d64 100644 --- a/src/Umbraco.Core/Models/Mapping/IMapperConfiguration.cs +++ b/src/Umbraco.Core/Models/Mapping/IMapperConfiguration.cs @@ -17,6 +17,6 @@ namespace Umbraco.Core.Models.Mapping /// internal interface IMapperConfiguration : IApplicationEventHandler { - void ConfigureMappings(IConfiguration config); + void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext); } } diff --git a/src/Umbraco.Core/Models/Mapping/MapperConfiguration.cs b/src/Umbraco.Core/Models/Mapping/MapperConfiguration.cs index 8bde82d13f..fcc3410f46 100644 --- a/src/Umbraco.Core/Models/Mapping/MapperConfiguration.cs +++ b/src/Umbraco.Core/Models/Mapping/MapperConfiguration.cs @@ -10,6 +10,6 @@ namespace Umbraco.Core.Models.Mapping /// internal abstract class MapperConfiguration : ApplicationEventHandler, IMapperConfiguration { - public abstract void ConfigureMappings(IConfiguration config); + public abstract void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index 044ecd164e..94ed57569a 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Specialized; +using System.Diagnostics; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.EntityBase; @@ -12,6 +13,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] + [DebuggerDisplay("Id: {Id}, Name: {Name}")] public class PropertyGroup : Entity, IEquatable { private string _name; diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index 5c3c25e28b..e9e8121860 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -3,12 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; +using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; namespace Umbraco.Tests.Models.Mapping @@ -22,6 +24,11 @@ namespace Umbraco.Tests.Models.Mapping } + protected override DatabaseBehavior DatabaseTestBehavior + { + get { return DatabaseBehavior.NewSchemaPerFixture; } + } + protected override void FreezeResolution() { PropertyEditorResolver.Current = new PropertyEditorResolver( @@ -30,6 +37,113 @@ namespace Umbraco.Tests.Models.Mapping base.FreezeResolution(); } + [Test] + public void To_Media_Item_Simple() + { + var contentType = MockedContentTypes.CreateImageMediaType(); + var content = MockedMedia.CreateMediaImage(contentType, -1); + + var result = Mapper.Map>(content); + + AssertBasics(result, content); + + foreach (var p in content.Properties) + { + AssertBasicProperty(result, p); + } + } + + [Test] + public void To_Content_Item_Simple() + { + var contentType = MockedContentTypes.CreateSimpleContentType(); + var content = MockedContent.CreateSimpleContent(contentType); + + var result = Mapper.Map>(content); + + AssertBasics(result, content); + + foreach (var p in content.Properties) + { + AssertBasicProperty(result, p); + } + } + + [Test] + public void To_Content_Item_Dto() + { + var contentType = MockedContentTypes.CreateSimpleContentType(); + var content = MockedContent.CreateSimpleContent(contentType); + + var result = Mapper.Map>(content); + + AssertContentItem(result, content); + } + + [Test] + public void To_Media_Item_Dto() + { + var contentType = MockedContentTypes.CreateImageMediaType(); + var content = MockedMedia.CreateMediaImage(contentType, -1); + + var result = Mapper.Map>(content); + + AssertContentItem(result, content); + } + + #region Assertions + private void AssertBasics(ContentItemBasic result, TPersisted content) + where T : ContentPropertyBasic + where TPersisted : IContentBase + { + Assert.AreEqual(content.Id, result.Id); + Assert.AreEqual(0, result.Owner.UserId); + Assert.AreEqual("admin", result.Owner.Name); + Assert.AreEqual(content.ParentId, result.ParentId); + Assert.AreEqual(content.UpdateDate, result.UpdateDate); + Assert.AreEqual(content.CreateDate, result.CreateDate); + Assert.AreEqual(content.Name, result.Name); + Assert.AreEqual(content.Properties.Count(), result.Properties.Count()); + } + + private void AssertBasicProperty(ContentItemBasic result, Property p) + where T : ContentPropertyBasic + where TPersisted : IContentBase + { + var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); + Assert.IsNotNull(pDto); + Assert.AreEqual(p.Alias, pDto.Alias); + Assert.AreEqual(p.Id, pDto.Id); + Assert.AreEqual(p.Value, pDto.Value); + } + + private void AssertProperty(ContentItemBasic result, Property p) + where TPersisted : IContentBase + { + AssertBasicProperty(result, p); + + var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); + Assert.IsNotNull(pDto); + Assert.AreEqual(p.PropertyType.Mandatory, pDto.IsRequired); + Assert.AreEqual(p.PropertyType.ValidationRegExp, pDto.ValidationRegExp); + Assert.AreEqual(p.PropertyType.Description, pDto.Description); + Assert.AreEqual(p.PropertyType.Name, pDto.Label); + Assert.AreEqual(ApplicationContext.Services.DataTypeService.GetDataTypeDefinitionById(p.PropertyType.DataTypeDefinitionId), pDto.DataType); + Assert.AreEqual(PropertyEditorResolver.Current.GetById(p.PropertyType.DataTypeId), pDto.PropertyEditor); + } + + private void AssertContentItem(ContentItemBasic result, T content) + where T : IContentBase + { + AssertBasics(result, content); + + foreach (var p in content.Properties) + { + AssertProperty(result, p); + } + } + #endregion + [Test] public void To_Display_Model() { @@ -38,7 +152,7 @@ namespace Umbraco.Tests.Models.Mapping var mapper = new ContentModelMapper(ApplicationContext, new UserModelMapper()); - var result = mapper.ToContentItemDisplay(content); + var result = Mapper.Map(content); Assert.AreEqual(content.Name, result.Name); Assert.AreEqual(content.Id, result.Id); @@ -77,7 +191,7 @@ namespace Umbraco.Tests.Models.Mapping var mapper = new ContentModelMapper(ApplicationContext, new UserModelMapper()); - var result = mapper.ToContentItemDisplay(content); + var result = Mapper.Map(content); Assert.AreEqual(content.Name, result.Name); Assert.AreEqual(content.Id, result.Id); diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs index 60fa93fd85..677a425fa9 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs @@ -56,7 +56,7 @@ namespace Umbraco.Tests.TestHelpers var mappers = PluginManager.Current.FindAndCreateInstances(); foreach (var mapper in mappers) { - mapper.ConfigureMappings(configuration); + mapper.ConfigureMappings(configuration, ApplicationContext); } }); } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 372b0671ae..900fab5090 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.ModelBinding; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; @@ -52,7 +53,7 @@ namespace Umbraco.Web.Editors { var foundContent = ((ContentService) Services.ContentService).GetByIds(ids); - return foundContent.Select(x => _contentModelMapper.ToContentItemDisplay(x)); + return foundContent.Select(Mapper.Map); } /// @@ -67,7 +68,7 @@ namespace Umbraco.Web.Editors { HandleContentNotFound(id); } - return _contentModelMapper.ToContentItemDisplay(foundContent); + return Mapper.Map(foundContent); } /// @@ -85,7 +86,7 @@ namespace Umbraco.Web.Editors } var emptyContent = new Content("", parentId, contentType); - return _contentModelMapper.ToContentItemDisplay(emptyContent); + return Mapper.Map(emptyContent); } /// @@ -124,7 +125,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw a 403 - var forDisplay = _contentModelMapper.ToContentItemDisplay(contentItem.PersistedContent); + var forDisplay = Mapper.Map(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, forDisplay)); @@ -158,7 +159,7 @@ namespace Umbraco.Web.Editors //return the updated model - var display = _contentModelMapper.ToContentItemDisplay(contentItem.PersistedContent); + var display = Mapper.Map(contentItem.PersistedContent); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs index 237d75939c..ba5c98d89e 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyBasic.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; +using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.Models.ContentEditing { @@ -20,5 +21,11 @@ namespace Umbraco.Web.Models.ContentEditing [Required(AllowEmptyStrings = false)] public string Alias { get; set; } + /// + /// Used internally during model mapping + /// + [IgnoreDataMember] + internal PropertyEditor PropertyEditor { get; set; } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/BaseContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/BaseContentModelMapper.cs index ed3a13e204..7b938642bb 100644 --- a/src/Umbraco.Web/Models/Mapping/BaseContentModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/BaseContentModelMapper.cs @@ -20,20 +20,20 @@ namespace Umbraco.Web.Models.Mapping UserMapper = userMapper; } - protected ContentItemDto ToContentItemDtoBase(IContentBase content) - where TPersisted : IContentBase - { - return CreateContent, ContentPropertyDto, TPersisted>(content, null, (propertyDto, originalProperty, propEditor) => - { - propertyDto.IsRequired = originalProperty.PropertyType.Mandatory; - propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp; - propertyDto.Alias = originalProperty.Alias; - propertyDto.Description = originalProperty.PropertyType.Description; - propertyDto.Label = originalProperty.PropertyType.Name; - propertyDto.DataType = ApplicationContext.Services.DataTypeService.GetDataTypeDefinitionById(originalProperty.PropertyType.DataTypeDefinitionId); - propertyDto.PropertyEditor = PropertyEditorResolver.Current.GetById(originalProperty.PropertyType.DataTypeId); - }); - } + //protected ContentItemDto ToContentItemDtoBase(IContentBase content) + // where TPersisted : IContentBase + //{ + // return CreateContent, ContentPropertyDto, TPersisted>(content, null, (propertyDto, originalProperty, propEditor) => + // { + // propertyDto.IsRequired = originalProperty.PropertyType.Mandatory; + // propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp; + // propertyDto.Alias = originalProperty.Alias; + // propertyDto.Description = originalProperty.PropertyType.Description; + // propertyDto.Label = originalProperty.PropertyType.Name; + // propertyDto.DataType = ApplicationContext.Services.DataTypeService.GetDataTypeDefinitionById(originalProperty.PropertyType.DataTypeDefinitionId); + // propertyDto.PropertyEditor = PropertyEditorResolver.Current.GetById(originalProperty.PropertyType.DataTypeId); + // }); + //} protected ContentItemBasic ToContentItemSimpleBase(IContentBase content) where TPersisted : IContentBase diff --git a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs index eb3cda0ed2..efd7dd2c22 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs @@ -15,59 +15,50 @@ namespace Umbraco.Web.Models.Mapping { } - public ContentItemDto ToContentItemDto(IContent content) - { - var result = base.ToContentItemDtoBase(content); - //NOTE: we don't need this for the dto and it's an extra lookup - //result.ContentTypeAlias = content.ContentType.Alias; - //result.Icon = content.ContentType.Icon; - //result.Updator = userMapper.ToUserBasic(content.GetWriterProfile()); - return result; - } - public ContentItemBasic ToContentItemSimple(IContent content) - { - var result = base.ToContentItemSimpleBase(content); - result.ContentTypeAlias = content.ContentType.Alias; - result.Icon = content.ContentType.Icon; - result.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); - return result; - } + //public ContentItemBasic ToContentItemSimple(IContent content) + //{ + // var result = base.ToContentItemSimpleBase(content); + // result.ContentTypeAlias = content.ContentType.Alias; + // result.Icon = content.ContentType.Icon; + // result.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); + // return result; + //} - public ContentItemDisplay ToContentItemDisplay(IContent content) - { - //create the list of tabs for properties assigned to tabs. - var tabs = GetTabs(content); + //public ContentItemDisplay ToContentItemDisplay(IContent content) + //{ + // //create the list of tabs for properties assigned to tabs. + // var tabs = GetTabs(content); - var result = CreateContent(content, (display, originalContent) => - { - //fill in the rest - display.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); - display.ContentTypeAlias = content.ContentType.Alias; - display.Icon = content.ContentType.Icon; + // var result = CreateContent(content, (display, originalContent) => + // { + // //fill in the rest + // display.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); + // display.ContentTypeAlias = content.ContentType.Alias; + // display.Icon = content.ContentType.Icon; - //set display props after the normal properties are alraedy mapped - display.Name = originalContent.Name; - display.Tabs = tabs; - //look up the published version of this item if it is not published - if (content.Published) - { - display.PublishDate = content.UpdateDate; - } - else if (content.HasPublishedVersion()) - { - var published = ApplicationContext.Services.ContentService.GetPublishedVersion(content.Id); - display.PublishDate = published.UpdateDate; - } - else - { - display.PublishDate = null; - } + // //set display props after the normal properties are alraedy mapped + // display.Name = originalContent.Name; + // display.Tabs = tabs; + // //look up the published version of this item if it is not published + // if (content.Published) + // { + // display.PublishDate = content.UpdateDate; + // } + // else if (content.HasPublishedVersion()) + // { + // var published = ApplicationContext.Services.ContentService.GetPublishedVersion(content.Id); + // display.PublishDate = published.UpdateDate; + // } + // else + // { + // display.PublishDate = null; + // } - }, null, false); + // }, null, false); - return result; - } + // return result; + //} } } diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs index 30fcb50e32..168217b473 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs @@ -25,26 +25,4 @@ namespace Umbraco.Web.Models.Mapping }; } } - - internal class MediaTypeModelMapper - { - private readonly ApplicationContext _applicationContext; - - public MediaTypeModelMapper(ApplicationContext applicationContext) - { - _applicationContext = applicationContext; - } - - public ContentTypeBasic ToMediaTypeBasic(IMediaType contentType) - { - return new ContentTypeBasic - { - Alias = contentType.Alias, - Id = contentType.Id, - Description = contentType.Description, - Icon = contentType.Icon, - Name = contentType.Name - }; - } - } } \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs index 7b079664fd..55926afa6d 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs @@ -17,16 +17,6 @@ namespace Umbraco.Web.Models.Mapping { } - public ContentItemDto ToMediaItemDto(IMedia content) - { - var result = base.ToContentItemDtoBase(content); - //NOTE: we don't need this for the dto and it's an extra lookup - //result.ContentTypeAlias = content.ContentType.Alias; - //result.Icon = content.ContentType.Icon; - //result.Updator = userMapper.ToUserBasic(content.GetWriterProfile()); - return result; - } - public ContentItemBasic ToMediaItemSimple(IMedia content) { var result = base.ToContentItemSimpleBase(content); diff --git a/src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs new file mode 100644 index 0000000000..c54c700adf --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs @@ -0,0 +1,28 @@ +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + internal class MediaTypeModelMapper + { + private readonly ApplicationContext _applicationContext; + + public MediaTypeModelMapper(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + public ContentTypeBasic ToMediaTypeBasic(IMediaType contentType) + { + return new ContentTypeBasic + { + Alias = contentType.Alias, + Id = contentType.Id, + Description = contentType.Description, + Icon = contentType.Icon, + Name = contentType.Name + }; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs b/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs new file mode 100644 index 0000000000..443da7b913 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs @@ -0,0 +1,314 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Mapping; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Models.ContentEditing; +using System.Linq; + +namespace Umbraco.Web.Models.Mapping +{ + internal class NewContentMapper : MapperConfiguration + { + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) + { + //FROM Property TO ContentPropertyBasic + config.CreateMap>() + .ForMember(tab => tab.Label, expression => expression.MapFrom(@group => @group.Name)) + .ForMember(tab => tab.IsActive, expression => expression.UseValue(true)) + .ForMember(tab => tab.Properties, expression => expression.Ignore()); + + //FROM Property TO ContentPropertyBasic + config.CreateMap() + .ConvertUsing>(); + + //FROM Property TO ContentPropertyDto + config.CreateMap() + .ConvertUsing(new ContentPropertyDtoConverter(applicationContext)); + + //FROM Property TO ContentPropertyDisplay + config.CreateMap() + .ConvertUsing(new ContentPropertyDisplayConverter(applicationContext)); + + //FROM IContent TO ContentItemDisplay + config.CreateMap() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Updator, + expression => expression.ResolveUsing()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)) + .ForMember( + dto => dto.PublishDate, + expression => expression.MapFrom(content => GetPublishedDate(content, applicationContext))) + .ForMember(display => display.Properties, expression => expression.Ignore()) + .ForMember(display => display.Tabs, expression => expression.Ignore()) + .AfterMap((content, display) => MapTabsAndProperties(content, display)); + + //FROM IContent TO ContentItemBasic + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Updator, + expression => expression.ResolveUsing()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)); + + //FROM IMedia TO ContentItemBasic + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)); + + //FROM IContent TO ContentItemDto + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()); + + //FROM IMedia TO ContentItemDto + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()); + } + + /// + /// Gets the published date value for the IContent object + /// + /// + /// + /// + private static DateTime? GetPublishedDate(IContent content, ApplicationContext applicationContext) + { + if (content.Published) + { + return content.UpdateDate; + } + if (content.HasPublishedVersion()) + { + var published = applicationContext.Services.ContentService.GetPublishedVersion(content.Id); + return published.UpdateDate; + } + return null; + } + + private static void MapTabsAndProperties(IContentBase content, TabbedContentItem display) + { + var aggregateTabs = new List>(); + + //now we need to aggregate the tabs and properties since we might have duplicate tabs (based on aliases) because + // of how content composition works. + foreach (var propertyGroups in content.PropertyGroups.GroupBy(x => x.Name)) + { + var aggregateProperties = new List(); + + //there will always be one group with a null parent id (the top-most) + //then we'll iterate over all of the groups and ensure the properties are + //added in order so that when they render they are rendered with highest leve + //parent properties first. + int? currentParentId = null; + for (var i = 0; i < propertyGroups.Count(); i++) + { + var current = propertyGroups.Single(x => x.ParentId == currentParentId); + aggregateProperties.AddRange( + Mapper.Map, IEnumerable>( + content.GetPropertiesForGroup(current))); + currentParentId = current.Id; + } + + //then we'll just use the root group's data to make the composite tab + var rootGroup = propertyGroups.Single(x => x.ParentId == null); + aggregateTabs.Add(new Tab + { + Id = rootGroup.Id, + Alias = rootGroup.Name, + Label = rootGroup.Name, + Properties = aggregateProperties, + IsActive = false + }); + } + + //now add the generic properties tab for any properties that don't belong to a tab + var orphanProperties = content.GetNonGroupedProperties(); + + //now add the generic properties tab + aggregateTabs.Add(new Tab + { + Id = 0, + Label = "Generic properties", + Alias = "Generic properties", + Properties = Mapper.Map, IEnumerable>(orphanProperties) + }); + + //set the first tab to active + aggregateTabs.First().IsActive = true; + + display.Tabs = aggregateTabs; + } + + } + + + + internal class ContentDisplayConverter : TypeConverter + { + protected override ContentItemDisplay ConvertCore(IContent source) + { + throw new NotImplementedException(); + } + } + + /// + /// Maps the Creator for content + /// + internal class CreatorResolver : ValueResolver + { + protected override UserBasic ResolveCore(IContent source) + { + return Mapper.Map(source.GetWriterProfile()); + } + } + + /// + /// Maps the Owner for IContentBase + /// + /// + internal class OwnerResolver : ValueResolver + where TPersisted : IContentBase + { + protected override UserBasic ResolveCore(TPersisted source) + { + return Mapper.Map(source.GetCreatorProfile()); + } + } + + /// + /// Creates a ContentPropertyDto from a Property + /// + internal class ContentPropertyDisplayConverter : ContentPropertyBasicConverter + { + private readonly ApplicationContext _applicationContext; + + public ContentPropertyDisplayConverter(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + protected override ContentPropertyDisplay ConvertCore(Property originalProp) + { + var display = base.ConvertCore(originalProp); + + //set the display properties after mapping + display.Alias = originalProp.Alias; + display.Description = originalProp.PropertyType.Description; + display.Label = originalProp.PropertyType.Name; + display.Config = _applicationContext.Services.DataTypeService.GetPreValuesByDataTypeId(originalProp.PropertyType.DataTypeDefinitionId); + if (display.PropertyEditor == null) + { + //if there is no property editor it means that it is a legacy data type + // we cannot support editing with that so we'll just render the readonly value view. + display.View = GlobalSettings.Path.EnsureEndsWith('/') + + "views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html"; + } + else + { + display.View = display.PropertyEditor.ValueEditor.View; + } + + return display; + } + } + + /// + /// Creates a ContentPropertyDto from a Property + /// + internal class ContentPropertyDtoConverter : ContentPropertyBasicConverter + { + private readonly ApplicationContext _applicationContext; + + public ContentPropertyDtoConverter(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + protected override ContentPropertyDto ConvertCore(Property originalProperty) + { + var propertyDto = base.ConvertCore(originalProperty); + + propertyDto.IsRequired = originalProperty.PropertyType.Mandatory; + propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp; + propertyDto.Alias = originalProperty.Alias; + propertyDto.Description = originalProperty.PropertyType.Description; + propertyDto.Label = originalProperty.PropertyType.Name; + propertyDto.DataType = _applicationContext.Services.DataTypeService.GetDataTypeDefinitionById(originalProperty.PropertyType.DataTypeDefinitionId); + propertyDto.PropertyEditor = PropertyEditorResolver.Current.GetById(originalProperty.PropertyType.DataTypeId); + + return propertyDto; + } + } + + /// + /// Creates a base generic ContentPropertyBasic from a Property + /// + /// + internal class ContentPropertyBasicConverter : TypeConverter + where T : ContentPropertyBasic, new() + { + protected override T ConvertCore(Property property) + { + var editor = PropertyEditorResolver.Current.GetById(property.PropertyType.DataTypeId); + if (editor == null) + { + //TODO: Remove this check as we shouldn't support this at all! + var legacyEditor = DataTypesResolver.Current.GetById(property.PropertyType.DataTypeId); + if (legacyEditor == null) + { + throw new NullReferenceException("The property editor with id " + property.PropertyType.DataTypeId + " does not exist"); + } + + var legacyResult = new T + { + Id = property.Id, + Value = property.Value == null ? "" : property.Value.ToString(), + Alias = property.Alias + }; + return legacyResult; + } + var result = new T + { + Id = property.Id, + Value = editor.ValueEditor.SerializeValue(property.Value), + Alias = property.Alias + }; + + result.PropertyEditor = editor; + + return result; + } + } + +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/SectionModelMapper.cs b/src/Umbraco.Web/Models/Mapping/SectionModelMapper.cs index 3363d817fe..3e7ad602fd 100644 --- a/src/Umbraco.Web/Models/Mapping/SectionModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/SectionModelMapper.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Umbraco.Core; using Umbraco.Core.Models.Mapping; using Umbraco.Web.Models.ContentEditing; @@ -6,7 +7,7 @@ namespace Umbraco.Web.Models.Mapping { internal class SectionModelMapper : MapperConfiguration { - public override void ConfigureMappings(IConfiguration config) + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { config.CreateMap() .ReverseMap(); //backwards too! diff --git a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs index 9ea7f082f4..8ad785348c 100644 --- a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs @@ -11,7 +11,7 @@ namespace Umbraco.Web.Models.Mapping { #region Mapper config - public override void ConfigureMappings(IConfiguration config) + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { config.CreateMap() .ForMember(detail => detail.UserId, opt => opt.MapFrom(user => GetIntId(user.Id))) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index fd44567e6f..cb33192d9f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -325,6 +325,8 @@ + + diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs index d50c1849f1..c3c3e2bf84 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs @@ -1,4 +1,5 @@ using System; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; @@ -8,19 +9,17 @@ namespace Umbraco.Web.WebApi.Binders { internal class ContentItemBinder : ContentItemBaseBinder { - private readonly ContentModelMapper _contentModelMapper; - public ContentItemBinder(ApplicationContext applicationContext, ContentModelMapper contentModelMapper) + public ContentItemBinder(ApplicationContext applicationContext) : base(applicationContext) - { - _contentModelMapper = contentModelMapper; + { } /// /// Constructor /// public ContentItemBinder() - : this(ApplicationContext.Current, new ContentModelMapper(ApplicationContext.Current, new UserModelMapper())) + : this(ApplicationContext.Current) { } @@ -41,7 +40,7 @@ namespace Umbraco.Web.WebApi.Binders protected override ContentItemDto MapFromPersisted(ContentItemSave model) { - return _contentModelMapper.ToContentItemDto(model.PersistedContent); + return Mapper.Map>(model.PersistedContent); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs index 02d12ba8b0..4281a31fe7 100644 --- a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs @@ -1,4 +1,5 @@ using System; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; @@ -41,7 +42,7 @@ namespace Umbraco.Web.WebApi.Binders protected override ContentItemDto MapFromPersisted(ContentItemSave model) { - return _mediaModelMapper.ToMediaItemDto(model.PersistedContent); + return Mapper.Map>(model.PersistedContent); } } } \ No newline at end of file diff --git a/src/umbraco.businesslogic/ApplicationRegistrar.cs b/src/umbraco.businesslogic/ApplicationRegistrar.cs index be1e9db85d..313ccb93ef 100644 --- a/src/umbraco.businesslogic/ApplicationRegistrar.cs +++ b/src/umbraco.businesslogic/ApplicationRegistrar.cs @@ -45,7 +45,7 @@ namespace umbraco.BusinessLogic }, true); } - public void ConfigureMappings(IConfiguration config) + public void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { config.CreateMap() .ForMember(x => x.alias, expression => expression.MapFrom(x => x.Alias)) diff --git a/src/umbraco.businesslogic/ApplicationTreeRegistrar.cs b/src/umbraco.businesslogic/ApplicationTreeRegistrar.cs index 2414702709..ace259bd57 100644 --- a/src/umbraco.businesslogic/ApplicationTreeRegistrar.cs +++ b/src/umbraco.businesslogic/ApplicationTreeRegistrar.cs @@ -30,7 +30,7 @@ namespace umbraco.BusinessLogic /// /// Configures automapper model mappings /// - public void ConfigureMappings(IConfiguration config) + public void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { config.CreateMap() .ReverseMap(); //two way From bf1f78e3aa7447ba6ce3006d98d29f0793cc0a21 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 25 Jul 2013 16:08:18 +1000 Subject: [PATCH 85/85] Finished content and media model mapping using AutoMapper and now the tabs display composite properties correctly. --- .../Mapping/ContentWebModelMappingTests.cs | 143 ++++---- src/Umbraco.Web/Editors/ContentController.cs | 12 +- src/Umbraco.Web/Editors/MediaController.cs | 21 +- .../Models/Mapping/ContentModelMapper.cs | 123 ++++--- .../Mapping/ContentPropertyBasicConverter.cs | 49 +++ .../ContentPropertyDisplayConverter.cs | 44 +++ .../Mapping/ContentPropertyDtoConverter.cs | 35 ++ .../Mapping/ContentPropertyModelMapper.cs | 36 ++ .../Models/Mapping/CreatorResolver.cs | 18 + .../Models/Mapping/MediaModelMapper.cs | 64 ++-- .../Models/Mapping/NewContentMapper.cs | 314 ------------------ .../Models/Mapping/OwnerResolver.cs | 20 ++ .../Mapping/TabsAndPropertiesResolver.cs | 68 ++++ src/Umbraco.Web/Umbraco.Web.csproj | 10 +- .../WebApi/Binders/MediaItemBinder.cs | 9 +- 15 files changed, 481 insertions(+), 485 deletions(-) create mode 100644 src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs create mode 100644 src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayConverter.cs create mode 100644 src/Umbraco.Web/Models/Mapping/ContentPropertyDtoConverter.cs create mode 100644 src/Umbraco.Web/Models/Mapping/ContentPropertyModelMapper.cs create mode 100644 src/Umbraco.Web/Models/Mapping/CreatorResolver.cs delete mode 100644 src/Umbraco.Web/Models/Mapping/NewContentMapper.cs create mode 100644 src/Umbraco.Web/Models/Mapping/OwnerResolver.cs create mode 100644 src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index e9e8121860..b951380698 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -91,72 +91,19 @@ namespace Umbraco.Tests.Models.Mapping AssertContentItem(result, content); } - #region Assertions - private void AssertBasics(ContentItemBasic result, TPersisted content) - where T : ContentPropertyBasic - where TPersisted : IContentBase - { - Assert.AreEqual(content.Id, result.Id); - Assert.AreEqual(0, result.Owner.UserId); - Assert.AreEqual("admin", result.Owner.Name); - Assert.AreEqual(content.ParentId, result.ParentId); - Assert.AreEqual(content.UpdateDate, result.UpdateDate); - Assert.AreEqual(content.CreateDate, result.CreateDate); - Assert.AreEqual(content.Name, result.Name); - Assert.AreEqual(content.Properties.Count(), result.Properties.Count()); - } - - private void AssertBasicProperty(ContentItemBasic result, Property p) - where T : ContentPropertyBasic - where TPersisted : IContentBase - { - var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); - Assert.IsNotNull(pDto); - Assert.AreEqual(p.Alias, pDto.Alias); - Assert.AreEqual(p.Id, pDto.Id); - Assert.AreEqual(p.Value, pDto.Value); - } - - private void AssertProperty(ContentItemBasic result, Property p) - where TPersisted : IContentBase - { - AssertBasicProperty(result, p); - - var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); - Assert.IsNotNull(pDto); - Assert.AreEqual(p.PropertyType.Mandatory, pDto.IsRequired); - Assert.AreEqual(p.PropertyType.ValidationRegExp, pDto.ValidationRegExp); - Assert.AreEqual(p.PropertyType.Description, pDto.Description); - Assert.AreEqual(p.PropertyType.Name, pDto.Label); - Assert.AreEqual(ApplicationContext.Services.DataTypeService.GetDataTypeDefinitionById(p.PropertyType.DataTypeDefinitionId), pDto.DataType); - Assert.AreEqual(PropertyEditorResolver.Current.GetById(p.PropertyType.DataTypeId), pDto.PropertyEditor); - } - - private void AssertContentItem(ContentItemBasic result, T content) - where T : IContentBase - { - AssertBasics(result, content); - - foreach (var p in content.Properties) - { - AssertProperty(result, p); - } - } - #endregion - [Test] public void To_Display_Model() { var contentType = MockedContentTypes.CreateSimpleContentType(); var content = MockedContent.CreateSimpleContent(contentType); - var mapper = new ContentModelMapper(ApplicationContext, new UserModelMapper()); - var result = Mapper.Map(content); - Assert.AreEqual(content.Name, result.Name); - Assert.AreEqual(content.Id, result.Id); - Assert.AreEqual(content.Properties.Count(), result.Properties.Count()); + AssertBasics(result, content); + foreach (var p in content.Properties) + { + AssertDisplayProperty(result, p, ApplicationContext); + } Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count() - 1); Assert.IsTrue(result.Tabs.Any(x => x.Label == "Generic properties")); Assert.IsTrue(result.Tabs.First().IsActive); @@ -189,16 +136,86 @@ namespace Umbraco.Tests.Models.Mapping //ensure that nothing is marked as dirty content.ResetDirtyProperties(false); - var mapper = new ContentModelMapper(ApplicationContext, new UserModelMapper()); - var result = Mapper.Map(content); - Assert.AreEqual(content.Name, result.Name); - Assert.AreEqual(content.Id, result.Id); - Assert.AreEqual(content.Properties.Count(), result.Properties.Count()); + AssertBasics(result, content); + foreach (var p in content.Properties) + { + AssertDisplayProperty(result, p, ApplicationContext); + } Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count() - 1); Assert.IsTrue(result.Tabs.Any(x => x.Label == "Generic properties")); Assert.AreEqual(2, result.Tabs.Where(x => x.Label == "Generic properties").SelectMany(x => x.Properties).Count()); } + + #region Assertions + + private void AssertDisplayProperty(ContentItemBasic result, Property p, ApplicationContext applicationContext) + where T : ContentPropertyDisplay + where TPersisted : IContentBase + { + AssertBasicProperty(result, p); + + var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); + Assert.IsNotNull(pDto); + pDto.Alias = p.Alias; + pDto.Description = p.PropertyType.Description; + pDto.Label = p.PropertyType.Name; + pDto.Config = applicationContext.Services.DataTypeService.GetPreValuesByDataTypeId(p.PropertyType.DataTypeDefinitionId); + + } + + private void AssertBasics(ContentItemBasic result, TPersisted content) + where T : ContentPropertyBasic + where TPersisted : IContentBase + { + Assert.AreEqual(content.Id, result.Id); + Assert.AreEqual(0, result.Owner.UserId); + Assert.AreEqual("admin", result.Owner.Name); + Assert.AreEqual(content.ParentId, result.ParentId); + Assert.AreEqual(content.UpdateDate, result.UpdateDate); + Assert.AreEqual(content.CreateDate, result.CreateDate); + Assert.AreEqual(content.Name, result.Name); + Assert.AreEqual(content.Properties.Count(), result.Properties.Count()); + } + + private void AssertBasicProperty(ContentItemBasic result, Property p) + where T : ContentPropertyBasic + where TPersisted : IContentBase + { + var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); + Assert.IsNotNull(pDto); + Assert.AreEqual(p.Alias, pDto.Alias); + Assert.AreEqual(p.Id, pDto.Id); + + Assert.IsTrue(p.Value == null ? pDto.Value == string.Empty : pDto.Value == p.Value); + } + + private void AssertProperty(ContentItemBasic result, Property p) + where TPersisted : IContentBase + { + AssertBasicProperty(result, p); + + var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); + Assert.IsNotNull(pDto); + Assert.AreEqual(p.PropertyType.Mandatory, pDto.IsRequired); + Assert.AreEqual(p.PropertyType.ValidationRegExp, pDto.ValidationRegExp); + Assert.AreEqual(p.PropertyType.Description, pDto.Description); + Assert.AreEqual(p.PropertyType.Name, pDto.Label); + Assert.AreEqual(ApplicationContext.Services.DataTypeService.GetDataTypeDefinitionById(p.PropertyType.DataTypeDefinitionId), pDto.DataType); + Assert.AreEqual(PropertyEditorResolver.Current.GetById(p.PropertyType.DataTypeId), pDto.PropertyEditor); + } + + private void AssertContentItem(ContentItemBasic result, T content) + where T : IContentBase + { + AssertBasics(result, content); + + foreach (var p in content.Properties) + { + AssertProperty(result, p); + } + } + #endregion } } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 900fab5090..735f5b47d4 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -27,14 +27,12 @@ namespace Umbraco.Web.Editors /// [PluginController("UmbracoApi")] public class ContentController : ContentControllerBase - { - private readonly ContentModelMapper _contentModelMapper; - + { /// /// Constructor /// public ContentController() - : this(UmbracoContext.Current, new ContentModelMapper(UmbracoContext.Current.Application, new UserModelMapper())) + : this(UmbracoContext.Current) { } @@ -42,11 +40,9 @@ namespace Umbraco.Web.Editors /// Constructor /// /// - /// - internal ContentController(UmbracoContext umbracoContext, ContentModelMapper contentModelMapper) + internal ContentController(UmbracoContext umbracoContext) : base(umbracoContext) - { - _contentModelMapper = contentModelMapper; + { } public IEnumerable GetByIds([FromUri]int[] ids) diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 7ea0df7f7e..430867451a 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -4,6 +4,7 @@ using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.ModelBinding; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -34,13 +35,11 @@ namespace Umbraco.Web.Editors [PluginController("UmbracoApi")] public class MediaController : ContentControllerBase { - private readonly MediaModelMapper _mediaModelMapper; - /// /// Constructor /// public MediaController() - : this(UmbracoContext.Current, new MediaModelMapper(UmbracoContext.Current.Application, new UserModelMapper())) + : this(UmbracoContext.Current) { } @@ -48,11 +47,9 @@ namespace Umbraco.Web.Editors /// Constructor /// /// - /// - internal MediaController(UmbracoContext umbracoContext, MediaModelMapper mediaModelMapper) + internal MediaController(UmbracoContext umbracoContext) : base(umbracoContext) { - _mediaModelMapper = mediaModelMapper; } /// @@ -70,7 +67,7 @@ namespace Umbraco.Web.Editors } var emptyContent = new Core.Models.Media("Empty", parentId, contentType); - return _mediaModelMapper.ToMediaItemDisplay(emptyContent); + return Mapper.Map(emptyContent); } /// @@ -85,7 +82,7 @@ namespace Umbraco.Web.Editors { HandleContentNotFound(id); } - return _mediaModelMapper.ToMediaItemDisplay(foundContent); + return Mapper.Map(foundContent); } /// @@ -94,7 +91,7 @@ namespace Umbraco.Web.Editors public IEnumerable> GetRootMedia() { return Services.MediaService.GetRootMedia() - .Select(x => _mediaModelMapper.ToMediaItemSimple(x)); + .Select(Mapper.Map>); } /// @@ -103,7 +100,7 @@ namespace Umbraco.Web.Editors public IEnumerable> GetChildren(int parentId) { return Services.MediaService.GetChildren(parentId) - .Select(x => _mediaModelMapper.ToMediaItemSimple(x)); + .Select(Mapper.Map>); } /// @@ -138,7 +135,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw a 403 - var forDisplay = _mediaModelMapper.ToMediaItemDisplay(contentItem.PersistedContent); + var forDisplay = Mapper.Map(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden, forDisplay)); } @@ -148,7 +145,7 @@ namespace Umbraco.Web.Editors Services.MediaService.Save(contentItem.PersistedContent); //return the updated model - var display = _mediaModelMapper.ToMediaItemDisplay(contentItem.PersistedContent); + var display = Mapper.Map(contentItem.PersistedContent); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); diff --git a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs index efd7dd2c22..d9fab62343 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs @@ -1,64 +1,83 @@ -using System.Text; -using System.Threading.Tasks; +using System; +using System.Linq.Expressions; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Models.Mapping; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { - internal class ContentModelMapper : BaseContentModelMapper + /// + /// Declares how model mappings for content + /// + internal class ContentModelMapper : MapperConfiguration { - - public ContentModelMapper(ApplicationContext applicationContext, UserModelMapper userMapper) - : base(applicationContext, userMapper) + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { + //FROM IContent TO ContentItemDisplay + config.CreateMap() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Updator, + expression => expression.ResolveUsing()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)) + .ForMember( + dto => dto.PublishDate, + expression => expression.MapFrom(content => GetPublishedDate(content, applicationContext))) + .ForMember(display => display.Properties, expression => expression.Ignore()) + .ForMember(display => display.Tabs, expression => expression.ResolveUsing()); + + //FROM IContent TO ContentItemBasic + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Updator, + expression => expression.ResolveUsing()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)); + + //FROM IContent TO ContentItemDto + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()); + + } + /// + /// Gets the published date value for the IContent object + /// + /// + /// + /// + private static DateTime? GetPublishedDate(IContent content, ApplicationContext applicationContext) + { + if (content.Published) + { + return content.UpdateDate; + } + if (content.HasPublishedVersion()) + { + var published = applicationContext.Services.ContentService.GetPublishedVersion(content.Id); + return published.UpdateDate; + } + return null; + } - //public ContentItemBasic ToContentItemSimple(IContent content) - //{ - // var result = base.ToContentItemSimpleBase(content); - // result.ContentTypeAlias = content.ContentType.Alias; - // result.Icon = content.ContentType.Icon; - // result.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); - // return result; - //} - - //public ContentItemDisplay ToContentItemDisplay(IContent content) - //{ - // //create the list of tabs for properties assigned to tabs. - // var tabs = GetTabs(content); - - // var result = CreateContent(content, (display, originalContent) => - // { - // //fill in the rest - // display.Updator = UserMapper.ToUserBasic(content.GetWriterProfile()); - // display.ContentTypeAlias = content.ContentType.Alias; - // display.Icon = content.ContentType.Icon; - - // //set display props after the normal properties are alraedy mapped - // display.Name = originalContent.Name; - // display.Tabs = tabs; - // //look up the published version of this item if it is not published - // if (content.Published) - // { - // display.PublishDate = content.UpdateDate; - // } - // else if (content.HasPublishedVersion()) - // { - // var published = ApplicationContext.Services.ContentService.GetPublishedVersion(content.Id); - // display.PublishDate = published.UpdateDate; - // } - // else - // { - // display.PublishDate = null; - // } - - // }, null, false); - - // return result; - //} - } -} +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs new file mode 100644 index 0000000000..145cd4bd30 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs @@ -0,0 +1,49 @@ +using System; +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Creates a base generic ContentPropertyBasic from a Property + /// + /// + internal class ContentPropertyBasicConverter : TypeConverter + where T : ContentPropertyBasic, new() + { + protected override T ConvertCore(Property property) + { + var editor = PropertyEditorResolver.Current.GetById(property.PropertyType.DataTypeId); + if (editor == null) + { + //TODO: Remove this check as we shouldn't support this at all! + var legacyEditor = DataTypesResolver.Current.GetById(property.PropertyType.DataTypeId); + if (legacyEditor == null) + { + throw new NullReferenceException("The property editor with id " + property.PropertyType.DataTypeId + " does not exist"); + } + + var legacyResult = new T + { + Id = property.Id, + Value = property.Value == null ? "" : property.Value.ToString(), + Alias = property.Alias + }; + return legacyResult; + } + var result = new T + { + Id = property.Id, + Value = editor.ValueEditor.SerializeValue(property.Value), + Alias = property.Alias + }; + + result.PropertyEditor = editor; + + return result; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayConverter.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayConverter.cs new file mode 100644 index 0000000000..2371bdc4f6 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayConverter.cs @@ -0,0 +1,44 @@ +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Creates a ContentPropertyDto from a Property + /// + internal class ContentPropertyDisplayConverter : ContentPropertyBasicConverter + { + private readonly ApplicationContext _applicationContext; + + public ContentPropertyDisplayConverter(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + protected override ContentPropertyDisplay ConvertCore(Property originalProp) + { + var display = base.ConvertCore(originalProp); + + //set the display properties after mapping + display.Alias = originalProp.Alias; + display.Description = originalProp.PropertyType.Description; + display.Label = originalProp.PropertyType.Name; + display.Config = _applicationContext.Services.DataTypeService.GetPreValuesByDataTypeId(originalProp.PropertyType.DataTypeDefinitionId); + if (display.PropertyEditor == null) + { + //if there is no property editor it means that it is a legacy data type + // we cannot support editing with that so we'll just render the readonly value view. + display.View = GlobalSettings.Path.EnsureEndsWith('/') + + "views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html"; + } + else + { + display.View = display.PropertyEditor.ValueEditor.View; + } + + return display; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyDtoConverter.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyDtoConverter.cs new file mode 100644 index 0000000000..c89c0e7a18 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyDtoConverter.cs @@ -0,0 +1,35 @@ +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Creates a ContentPropertyDto from a Property + /// + internal class ContentPropertyDtoConverter : ContentPropertyBasicConverter + { + private readonly ApplicationContext _applicationContext; + + public ContentPropertyDtoConverter(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + protected override ContentPropertyDto ConvertCore(Property originalProperty) + { + var propertyDto = base.ConvertCore(originalProperty); + + propertyDto.IsRequired = originalProperty.PropertyType.Mandatory; + propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp; + propertyDto.Alias = originalProperty.Alias; + propertyDto.Description = originalProperty.PropertyType.Description; + propertyDto.Label = originalProperty.PropertyType.Name; + propertyDto.DataType = _applicationContext.Services.DataTypeService.GetDataTypeDefinitionById(originalProperty.PropertyType.DataTypeDefinitionId); + propertyDto.PropertyEditor = PropertyEditorResolver.Current.GetById(originalProperty.PropertyType.DataTypeId); + + return propertyDto; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyModelMapper.cs new file mode 100644 index 0000000000..7138b3b703 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyModelMapper.cs @@ -0,0 +1,36 @@ +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Mapping; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// A mapper which declares how to map content properties. These mappings are shared among media (and probably members) which is + /// why they are in their own mapper + /// + internal class ContentPropertyModelMapper : MapperConfiguration + { + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) + { + //FROM Property TO ContentPropertyBasic + config.CreateMap>() + .ForMember(tab => tab.Label, expression => expression.MapFrom(@group => @group.Name)) + .ForMember(tab => tab.IsActive, expression => expression.UseValue(true)) + .ForMember(tab => tab.Properties, expression => expression.Ignore()); + + //FROM Property TO ContentPropertyBasic + config.CreateMap() + .ConvertUsing>(); + + //FROM Property TO ContentPropertyDto + config.CreateMap() + .ConvertUsing(new ContentPropertyDtoConverter(applicationContext)); + + //FROM Property TO ContentPropertyDisplay + config.CreateMap() + .ConvertUsing(new ContentPropertyDisplayConverter(applicationContext)); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/CreatorResolver.cs b/src/Umbraco.Web/Models/Mapping/CreatorResolver.cs new file mode 100644 index 0000000000..0dc182ec79 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/CreatorResolver.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Maps the Creator for content + /// + internal class CreatorResolver : ValueResolver + { + protected override UserBasic ResolveCore(IContent source) + { + return Mapper.Map(source.GetWriterProfile()); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs index 55926afa6d..f610c08926 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs @@ -3,45 +3,53 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Mapping; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { - internal class MediaModelMapper : BaseContentModelMapper + /// + /// Declares model mappings for media. + /// + internal class NewMediaModelMapper : MapperConfiguration { - public MediaModelMapper(ApplicationContext applicationContext, UserModelMapper userMapper) - : base(applicationContext, userMapper) + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { - } + //FROM IMedia TO MediaItemDisplay + config.CreateMap() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)) + .ForMember(display => display.Properties, expression => expression.Ignore()) + .ForMember(display => display.Tabs, expression => expression.ResolveUsing()); - public ContentItemBasic ToMediaItemSimple(IMedia content) - { - var result = base.ToContentItemSimpleBase(content); - result.ContentTypeAlias = content.ContentType.Alias; - result.Icon = content.ContentType.Icon; - return result; - } + //FROM IMedia TO ContentItemBasic + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .ForMember( + dto => dto.Icon, + expression => expression.MapFrom(content => content.ContentType.Icon)) + .ForMember( + dto => dto.ContentTypeAlias, + expression => expression.MapFrom(content => content.ContentType.Alias)); - public MediaItemDisplay ToMediaItemDisplay(IMedia media) - { - //create the list of tabs for properties assigned to tabs. - var tabs = GetTabs(media); - - var result = CreateContent(media, (display, originalContent) => - { - //fill in the rest - display.ContentTypeAlias = media.ContentType.Alias; - display.Icon = media.ContentType.Icon; - - //set display props after the normal properties are alraedy mapped - display.Name = originalContent.Name; - display.Tabs = tabs; - }, null, false); - - return result; + //FROM IMedia TO ContentItemDto + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()); } } diff --git a/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs b/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs deleted file mode 100644 index 443da7b913..0000000000 --- a/src/Umbraco.Web/Models/Mapping/NewContentMapper.cs +++ /dev/null @@ -1,314 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using AutoMapper; -using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Mapping; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.PropertyEditors; -using Umbraco.Web.Models.ContentEditing; -using System.Linq; - -namespace Umbraco.Web.Models.Mapping -{ - internal class NewContentMapper : MapperConfiguration - { - public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) - { - //FROM Property TO ContentPropertyBasic - config.CreateMap>() - .ForMember(tab => tab.Label, expression => expression.MapFrom(@group => @group.Name)) - .ForMember(tab => tab.IsActive, expression => expression.UseValue(true)) - .ForMember(tab => tab.Properties, expression => expression.Ignore()); - - //FROM Property TO ContentPropertyBasic - config.CreateMap() - .ConvertUsing>(); - - //FROM Property TO ContentPropertyDto - config.CreateMap() - .ConvertUsing(new ContentPropertyDtoConverter(applicationContext)); - - //FROM Property TO ContentPropertyDisplay - config.CreateMap() - .ConvertUsing(new ContentPropertyDisplayConverter(applicationContext)); - - //FROM IContent TO ContentItemDisplay - config.CreateMap() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()) - .ForMember( - dto => dto.Updator, - expression => expression.ResolveUsing()) - .ForMember( - dto => dto.Icon, - expression => expression.MapFrom(content => content.ContentType.Icon)) - .ForMember( - dto => dto.ContentTypeAlias, - expression => expression.MapFrom(content => content.ContentType.Alias)) - .ForMember( - dto => dto.PublishDate, - expression => expression.MapFrom(content => GetPublishedDate(content, applicationContext))) - .ForMember(display => display.Properties, expression => expression.Ignore()) - .ForMember(display => display.Tabs, expression => expression.Ignore()) - .AfterMap((content, display) => MapTabsAndProperties(content, display)); - - //FROM IContent TO ContentItemBasic - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()) - .ForMember( - dto => dto.Updator, - expression => expression.ResolveUsing()) - .ForMember( - dto => dto.Icon, - expression => expression.MapFrom(content => content.ContentType.Icon)) - .ForMember( - dto => dto.ContentTypeAlias, - expression => expression.MapFrom(content => content.ContentType.Alias)); - - //FROM IMedia TO ContentItemBasic - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()) - .ForMember( - dto => dto.Icon, - expression => expression.MapFrom(content => content.ContentType.Icon)) - .ForMember( - dto => dto.ContentTypeAlias, - expression => expression.MapFrom(content => content.ContentType.Alias)); - - //FROM IContent TO ContentItemDto - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()); - - //FROM IMedia TO ContentItemDto - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()); - } - - /// - /// Gets the published date value for the IContent object - /// - /// - /// - /// - private static DateTime? GetPublishedDate(IContent content, ApplicationContext applicationContext) - { - if (content.Published) - { - return content.UpdateDate; - } - if (content.HasPublishedVersion()) - { - var published = applicationContext.Services.ContentService.GetPublishedVersion(content.Id); - return published.UpdateDate; - } - return null; - } - - private static void MapTabsAndProperties(IContentBase content, TabbedContentItem display) - { - var aggregateTabs = new List>(); - - //now we need to aggregate the tabs and properties since we might have duplicate tabs (based on aliases) because - // of how content composition works. - foreach (var propertyGroups in content.PropertyGroups.GroupBy(x => x.Name)) - { - var aggregateProperties = new List(); - - //there will always be one group with a null parent id (the top-most) - //then we'll iterate over all of the groups and ensure the properties are - //added in order so that when they render they are rendered with highest leve - //parent properties first. - int? currentParentId = null; - for (var i = 0; i < propertyGroups.Count(); i++) - { - var current = propertyGroups.Single(x => x.ParentId == currentParentId); - aggregateProperties.AddRange( - Mapper.Map, IEnumerable>( - content.GetPropertiesForGroup(current))); - currentParentId = current.Id; - } - - //then we'll just use the root group's data to make the composite tab - var rootGroup = propertyGroups.Single(x => x.ParentId == null); - aggregateTabs.Add(new Tab - { - Id = rootGroup.Id, - Alias = rootGroup.Name, - Label = rootGroup.Name, - Properties = aggregateProperties, - IsActive = false - }); - } - - //now add the generic properties tab for any properties that don't belong to a tab - var orphanProperties = content.GetNonGroupedProperties(); - - //now add the generic properties tab - aggregateTabs.Add(new Tab - { - Id = 0, - Label = "Generic properties", - Alias = "Generic properties", - Properties = Mapper.Map, IEnumerable>(orphanProperties) - }); - - //set the first tab to active - aggregateTabs.First().IsActive = true; - - display.Tabs = aggregateTabs; - } - - } - - - - internal class ContentDisplayConverter : TypeConverter - { - protected override ContentItemDisplay ConvertCore(IContent source) - { - throw new NotImplementedException(); - } - } - - /// - /// Maps the Creator for content - /// - internal class CreatorResolver : ValueResolver - { - protected override UserBasic ResolveCore(IContent source) - { - return Mapper.Map(source.GetWriterProfile()); - } - } - - /// - /// Maps the Owner for IContentBase - /// - /// - internal class OwnerResolver : ValueResolver - where TPersisted : IContentBase - { - protected override UserBasic ResolveCore(TPersisted source) - { - return Mapper.Map(source.GetCreatorProfile()); - } - } - - /// - /// Creates a ContentPropertyDto from a Property - /// - internal class ContentPropertyDisplayConverter : ContentPropertyBasicConverter - { - private readonly ApplicationContext _applicationContext; - - public ContentPropertyDisplayConverter(ApplicationContext applicationContext) - { - _applicationContext = applicationContext; - } - - protected override ContentPropertyDisplay ConvertCore(Property originalProp) - { - var display = base.ConvertCore(originalProp); - - //set the display properties after mapping - display.Alias = originalProp.Alias; - display.Description = originalProp.PropertyType.Description; - display.Label = originalProp.PropertyType.Name; - display.Config = _applicationContext.Services.DataTypeService.GetPreValuesByDataTypeId(originalProp.PropertyType.DataTypeDefinitionId); - if (display.PropertyEditor == null) - { - //if there is no property editor it means that it is a legacy data type - // we cannot support editing with that so we'll just render the readonly value view. - display.View = GlobalSettings.Path.EnsureEndsWith('/') + - "views/propertyeditors/umbraco/readonlyvalue/readonlyvalue.html"; - } - else - { - display.View = display.PropertyEditor.ValueEditor.View; - } - - return display; - } - } - - /// - /// Creates a ContentPropertyDto from a Property - /// - internal class ContentPropertyDtoConverter : ContentPropertyBasicConverter - { - private readonly ApplicationContext _applicationContext; - - public ContentPropertyDtoConverter(ApplicationContext applicationContext) - { - _applicationContext = applicationContext; - } - - protected override ContentPropertyDto ConvertCore(Property originalProperty) - { - var propertyDto = base.ConvertCore(originalProperty); - - propertyDto.IsRequired = originalProperty.PropertyType.Mandatory; - propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp; - propertyDto.Alias = originalProperty.Alias; - propertyDto.Description = originalProperty.PropertyType.Description; - propertyDto.Label = originalProperty.PropertyType.Name; - propertyDto.DataType = _applicationContext.Services.DataTypeService.GetDataTypeDefinitionById(originalProperty.PropertyType.DataTypeDefinitionId); - propertyDto.PropertyEditor = PropertyEditorResolver.Current.GetById(originalProperty.PropertyType.DataTypeId); - - return propertyDto; - } - } - - /// - /// Creates a base generic ContentPropertyBasic from a Property - /// - /// - internal class ContentPropertyBasicConverter : TypeConverter - where T : ContentPropertyBasic, new() - { - protected override T ConvertCore(Property property) - { - var editor = PropertyEditorResolver.Current.GetById(property.PropertyType.DataTypeId); - if (editor == null) - { - //TODO: Remove this check as we shouldn't support this at all! - var legacyEditor = DataTypesResolver.Current.GetById(property.PropertyType.DataTypeId); - if (legacyEditor == null) - { - throw new NullReferenceException("The property editor with id " + property.PropertyType.DataTypeId + " does not exist"); - } - - var legacyResult = new T - { - Id = property.Id, - Value = property.Value == null ? "" : property.Value.ToString(), - Alias = property.Alias - }; - return legacyResult; - } - var result = new T - { - Id = property.Id, - Value = editor.ValueEditor.SerializeValue(property.Value), - Alias = property.Alias - }; - - result.PropertyEditor = editor; - - return result; - } - } - -} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs b/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs new file mode 100644 index 0000000000..0577063d36 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Maps the Owner for IContentBase + /// + /// + internal class OwnerResolver : ValueResolver + where TPersisted : IContentBase + { + protected override UserBasic ResolveCore(TPersisted source) + { + return Mapper.Map(source.GetCreatorProfile()); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs new file mode 100644 index 0000000000..c943cf8ff0 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using System.Linq; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Creates the tabs collection with properties assigned for display models + /// + internal class TabsAndPropertiesResolver : ValueResolver>> + { + protected override IEnumerable> ResolveCore(IContentBase content) + { + var aggregateTabs = new List>(); + + //now we need to aggregate the tabs and properties since we might have duplicate tabs (based on aliases) because + // of how content composition works. + foreach (var propertyGroups in content.PropertyGroups.GroupBy(x => x.Name)) + { + var aggregateProperties = new List(); + + //there will always be one group with a null parent id (the top-most) + //then we'll iterate over all of the groups and ensure the properties are + //added in order so that when they render they are rendered with highest leve + //parent properties first. + int? currentParentId = null; + for (var i = 0; i < propertyGroups.Count(); i++) + { + var current = propertyGroups.Single(x => x.ParentId == currentParentId); + aggregateProperties.AddRange( + Mapper.Map, IEnumerable>( + content.GetPropertiesForGroup(current))); + currentParentId = current.Id; + } + + //then we'll just use the root group's data to make the composite tab + var rootGroup = propertyGroups.Single(x => x.ParentId == null); + aggregateTabs.Add(new Tab + { + Id = rootGroup.Id, + Alias = rootGroup.Name, + Label = rootGroup.Name, + Properties = aggregateProperties, + IsActive = false + }); + } + + //now add the generic properties tab for any properties that don't belong to a tab + var orphanProperties = content.GetNonGroupedProperties(); + + //now add the generic properties tab + aggregateTabs.Add(new Tab + { + Id = 0, + Label = "Generic properties", + Alias = "Generic properties", + Properties = Mapper.Map, IEnumerable>(orphanProperties) + }); + + //set the first tab to active + aggregateTabs.First().IsActive = true; + + return aggregateTabs; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index cb33192d9f..927a6490de 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -321,13 +321,19 @@ - + + + + + - + + + diff --git a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs index 4281a31fe7..81f7bba8fb 100644 --- a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs @@ -8,20 +8,17 @@ using Umbraco.Web.Models.Mapping; namespace Umbraco.Web.WebApi.Binders { internal class MediaItemBinder : ContentItemBaseBinder - { - private readonly MediaModelMapper _mediaModelMapper; - - public MediaItemBinder(ApplicationContext applicationContext, MediaModelMapper mediaModelMapper) + { + public MediaItemBinder(ApplicationContext applicationContext) : base(applicationContext) { - _mediaModelMapper = mediaModelMapper; } /// /// Constructor /// public MediaItemBinder() - : this(ApplicationContext.Current, new MediaModelMapper(ApplicationContext.Current, new UserModelMapper())) + : this(ApplicationContext.Current) { }