Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7

This commit is contained in:
Shannon
2015-07-06 17:57:07 +02:00
21 changed files with 434 additions and 194 deletions

View File

@@ -10,6 +10,7 @@ using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Profiling;
using Umbraco.Core.Services;
using Umbraco.Core.Sync;
namespace Umbraco.Core
@@ -220,18 +221,46 @@ namespace Umbraco.Core
}
/// <summary>
/// The original/first url that the web application executes
/// The application url.
/// </summary>
/// <remarks>
/// we need to set the initial url in our ApplicationContext, this is so our keep alive service works and this must
/// exist on a global context because the keep alive service doesn't run in a web context.
/// we are NOT going to put a lock on this because locking will slow down the application and we don't really care
/// if two threads write to this at the exact same time during first page hit.
/// see: http://issues.umbraco.org/issue/U4-2059
/// The application url is the url that should be used by services to talk to the application,
/// eg keep alive or scheduled publishing services. It must exist on a global context because
/// some of these services may not run within a web context.
/// The format of the application url is:
/// - has a scheme (http or https)
/// - has the SystemDirectories.Umbraco path
/// - does not end with a slash
/// It is initialized on the first request made to the server, by UmbracoModule.EnsureApplicationUrl:
/// - if umbracoSettings:settings/web.routing/@appUrl is set, use the value (new setting)
/// - if umbracoSettings:settings/scheduledTasks/@baseUrl is set, use the value (backward compatibility)
/// - otherwise, use the url of the (first) request.
/// Not locking, does not matter if several threads write to this.
/// See also issues:
/// - http://issues.umbraco.org/issue/U4-2059
/// - http://issues.umbraco.org/issue/U4-6788
/// - http://issues.umbraco.org/issue/U4-5728
/// - http://issues.umbraco.org/issue/U4-5391
/// </remarks>
internal string OriginalRequestUrl { get; set; }
internal string UmbracoApplicationUrl {
get
{
// if initialized, return
if (_umbracoApplicationUrl != null) return _umbracoApplicationUrl;
// try settings
ServerEnvironmentHelper.TrySetApplicationUrlFromSettings(this, ProfilingLogger.Logger, UmbracoConfig.For.UmbracoSettings());
// and return what we have, may be null
return _umbracoApplicationUrl;
}
set
{
_umbracoApplicationUrl = value;
}
}
internal string _umbracoApplicationUrl; // internal for tests
private Lazy<bool> _configured;
private void Init()

View File

@@ -63,7 +63,7 @@ namespace Umbraco.Core
// for anonymous semaphore, use the unique releaser, else create a new one
return _semaphore != null
? _releaser // (IDisposable)new SemaphoreSlimReleaser(_semaphore)
: (IDisposable)new NamedSemaphoreReleaser(_semaphore2);
: new NamedSemaphoreReleaser(_semaphore2);
}
public Task<IDisposable> LockAsync()
@@ -79,6 +79,19 @@ namespace Umbraco.Core
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public Task<IDisposable> LockAsync(int millisecondsTimeout)
{
var wait = _semaphore != null
? _semaphore.WaitAsync(millisecondsTimeout)
: WaitOneAsync(_semaphore2, millisecondsTimeout);
return wait.IsCompleted
? _releaserTask ?? Task.FromResult(CreateReleaser()) // anonymous vs named
: wait.ContinueWith((_, state) => (((AsyncLock)state).CreateReleaser()),
this, CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public IDisposable Lock()
{
if (_semaphore != null)
@@ -174,7 +187,7 @@ namespace Umbraco.Core
// F# has a AwaitWaitHandle method that accepts a time out... and seems pretty complex...
// version below should be OK
private static Task WaitOneAsync(WaitHandle handle)
private static Task WaitOneAsync(WaitHandle handle, int millisecondsTimeout = Timeout.Infinite)
{
var tcs = new TaskCompletionSource<object>();
var callbackHandleInitLock = new object();
@@ -197,7 +210,7 @@ namespace Umbraco.Core
}
},
/*state:*/ null,
/*millisecondsTimeOutInterval:*/ Timeout.Infinite,
/*millisecondsTimeOutInterval:*/ millisecondsTimeout,
/*executeOnlyOnce:*/ true);
}

View File

@@ -11,6 +11,8 @@
bool DisableFindContentByIdPath { get; }
string UrlProviderMode { get; }
string UmbracoApplicationUrl { get; }
}
}

View File

@@ -30,8 +30,13 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
[ConfigurationProperty("urlProviderMode", DefaultValue = "AutoLegacy")]
public string UrlProviderMode
{
get { return (string)base["urlProviderMode"]; }
get { return (string) base["urlProviderMode"]; }
}
[ConfigurationProperty("umbracoApplicationUrl", DefaultValue = null)]
public string UmbracoApplicationUrl
{
get { return (string)base["umbracoApplicationUrl"]; }
}
}
}

View File

@@ -76,7 +76,9 @@ namespace Umbraco.Core
_profilingLogger = new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
_timer = _profilingLogger.TraceDuration<CoreBootManager>("Umbraco application starting", "Umbraco application startup complete");
_timer = _profilingLogger.TraceDuration<CoreBootManager>(
"Umbraco application (" + UmbracoVersion.GetSemanticVersion() + ") starting",
"Umbraco application startup complete");
CreateApplicationCache();

View File

@@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
@@ -12,7 +13,16 @@ namespace Umbraco.Core.Logging
/// Used for logging
///</summary>
public class Logger : ILogger
{
{
private static string _processAndDomain;
static Logger()
{
// these won't change and can go in a static variable
_processAndDomain = "P" + Process.GetCurrentProcess().Id
+ "/D" + AppDomain.CurrentDomain.Id;
}
public Logger(FileInfo log4NetConfigFile)
{
XmlConfigurator.Configure(log4NetConfigFile);
@@ -61,7 +71,10 @@ namespace Umbraco.Core.Logging
/// <returns></returns>
private string PrefixThreadId(string generateMessageFormat)
{
return "[Thread " + Thread.CurrentThread.ManagedThreadId + "] " + generateMessageFormat;
return "[" + _processAndDomain
+ "/T" + Thread.CurrentThread.ManagedThreadId
+ "] "
+ generateMessageFormat;
}
public void Error(Type callingType, string message, Exception exception)

View File

@@ -83,7 +83,7 @@ namespace Umbraco.Core.Persistence.Repositories
NodeId = entity.Id,
Timestamp = DateTime.Now,
VersionId = entity.Version,
Xml = entity.Xml.ToString(SaveOptions.None)
Xml = entity.Xml.ToDataString()
};
//We need to do a special InsertOrUpdate here because we know that the PreviewXmlDto table has a composite key and thus

View File

@@ -238,7 +238,7 @@ namespace Umbraco.Core.Persistence.Repositories
var xmlItems = (from descendant in descendants
let xml = serializer(descendant)
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToString(SaveOptions.None) }).ToArray();
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToDataString() }).ToArray();
//bulk insert it into the database
Database.BulkInsertRecords(xmlItems, tr);

View File

@@ -82,7 +82,7 @@ namespace Umbraco.Core.Persistence.Repositories
var poco = new ContentXmlDto
{
NodeId = entity.Id,
Xml = entity.Xml.ToString(SaveOptions.None)
Xml = entity.Xml.ToDataString()
};
//We need to do a special InsertOrUpdate here because we know that the ContentXmlDto table has a 1:1 relation

View File

@@ -236,7 +236,7 @@ namespace Umbraco.Core.Persistence.Repositories
var xmlItems = (from descendant in descendants
let xml = serializer(descendant)
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToString(SaveOptions.None) }).ToArray();
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToDataString() }).ToArray();
//bulk insert it into the database
Database.BulkInsertRecords(xmlItems, tr);

View File

@@ -451,7 +451,7 @@ namespace Umbraco.Core.Persistence.Repositories
var xmlItems = (from descendant in descendants
let xml = serializer(descendant)
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToString(SaveOptions.None) }).ToArray();
select new ContentXmlDto { NodeId = descendant.Id, Xml = xml.ToDataString() }).ToArray();
//bulk insert it into the database
Database.BulkInsertRecords(xmlItems, tr);

View File

@@ -1632,7 +1632,7 @@ namespace Umbraco.Core.Services
{
var xml = _entitySerializer.Serialize(this, _dataTypeService, _userService, content);
var poco = new ContentXmlDto { NodeId = content.Id, Xml = xml.ToString(SaveOptions.None) };
var poco = new ContentXmlDto { NodeId = content.Id, Xml = xml.ToDataString() };
var exists =
uow.Database.FirstOrDefault<ContentXmlDto>("WHERE nodeId = @Id", new { Id = content.Id }) !=
null;

View File

@@ -1160,7 +1160,7 @@ namespace Umbraco.Core.Services
//private void CreateAndSaveMediaXml(XElement xml, int id, UmbracoDatabase db)
//{
// var poco = new ContentXmlDto { NodeId = id, Xml = xml.ToString(SaveOptions.None) };
// var poco = new ContentXmlDto { NodeId = id, Xml = xml.ToDataString() };
// var exists = db.FirstOrDefault<ContentXmlDto>("WHERE nodeId = @Id", new { Id = id }) != null;
// int result = exists ? db.Update(poco) : Convert.ToInt32(db.Insert(poco));
//}

View File

@@ -1,10 +1,9 @@
using System;
using System.Linq;
using System.Web;
using System.Xml;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Sync
{
@@ -13,58 +12,73 @@ namespace Umbraco.Core.Sync
/// </summary>
internal static class ServerEnvironmentHelper
{
/// <summary>
/// Returns the current umbraco base url for the current server depending on it's environment
/// status. This will attempt to determine the internal umbraco base url that can be used by the current
/// server to send a request to itself if it is in a load balanced environment.
/// </summary>
/// <returns>The full base url including schema (i.e. http://myserver:80/umbraco ) - or <c>null</c> if the url
/// cannot be determined at the moment (usually because the first request has not properly completed yet).</returns>
public static string GetCurrentServerUmbracoBaseUrl(ApplicationContext appContext, IUmbracoSettingsSection settings)
public static void TrySetApplicationUrlFromSettings(ApplicationContext appContext, ILogger logger, IUmbracoSettingsSection settings)
{
// try umbracoSettings:settings/web.routing/@umbracoApplicationUrl
// which is assumed to:
// - end with SystemDirectories.Umbraco
// - contain a scheme
// - end or not with a slash, it will be taken care of
// eg "http://www.mysite.com/umbraco"
var url = settings.WebRouting.UmbracoApplicationUrl;
if (url.IsNullOrWhiteSpace() == false)
{
appContext.UmbracoApplicationUrl = url.TrimEnd('/');
logger.Info<ApplicationContext>("ApplicationUrl: " + appContext.UmbracoApplicationUrl + " (using web.routing/@umbracoApplicationUrl)");
return;
}
// try umbracoSettings:settings/scheduledTasks/@baseUrl
// which is assumed to:
// - end with SystemDirectories.Umbraco
// - NOT contain any scheme (because, legacy)
// - end or not with a slash, it will be taken care of
// eg "mysite.com/umbraco"
url = settings.ScheduledTasks.BaseUrl;
if (url.IsNullOrWhiteSpace() == false)
{
var ssl = GlobalSettings.UseSSL ? "s" : "";
url = "http" + ssl + "://" + url;
appContext.UmbracoApplicationUrl = url.TrimEnd('/');
logger.Info<ApplicationContext>("ApplicationUrl: " + appContext.UmbracoApplicationUrl + " (using scheduledTasks/@baseUrl)");
return;
}
// try servers
var status = GetStatus(settings);
if (status == CurrentServerEnvironmentStatus.Single)
{
// single install, return null if no config/original url, else use config/original url as base
// use http or https as appropriate
return GetBaseUrl(appContext, settings);
}
return;
// no server, nothing we can do
var servers = settings.DistributedCall.Servers.ToArray();
if (servers.Length == 0)
return;
if (servers.Any() == false)
{
// cannot be determined, return null if no config/original url, else use config/original url as base
// use http or https as appropriate
return GetBaseUrl(appContext, settings);
}
// we have servers, look for this server
foreach (var server in servers)
{
var appId = server.AppId;
var serverName = server.ServerName;
// skip if no data
if (appId.IsNullOrWhiteSpace() && serverName.IsNullOrWhiteSpace())
{
continue;
}
// if this server, build and return the url
if ((appId.IsNullOrWhiteSpace() == false && appId.Trim().InvariantEquals(HttpRuntime.AppDomainAppId))
|| (serverName.IsNullOrWhiteSpace() == false && serverName.Trim().InvariantEquals(NetworkHelper.MachineName)))
{
//match by appId or computer name! return the url configured
return string.Format("{0}://{1}:{2}/{3}",
// match by appId or computer name, return the url configured
url = string.Format("{0}://{1}:{2}/{3}",
server.ForceProtocol.IsNullOrWhiteSpace() ? "http" : server.ForceProtocol,
server.ServerAddress,
server.ForcePortnumber.IsNullOrWhiteSpace() ? "80" : server.ForcePortnumber,
IOHelper.ResolveUrl(SystemDirectories.Umbraco).TrimStart('/'));
appContext.UmbracoApplicationUrl = url.TrimEnd('/');
logger.Info<ApplicationContext>("ApplicationUrl: " + appContext.UmbracoApplicationUrl + " (using distributedCall/servers)");
}
}
// cannot be determined, return null if no config/original url, else use config/original url as base
// use http or https as appropriate
return GetBaseUrl(appContext, settings);
}
/// <summary>
@@ -113,21 +127,5 @@ namespace Umbraco.Core.Sync
return CurrentServerEnvironmentStatus.Slave;
}
private static string GetBaseUrl(ApplicationContext appContext, IUmbracoSettingsSection settings)
{
return (
// is config empty?
settings.ScheduledTasks.BaseUrl.IsNullOrWhiteSpace()
// is the orig req empty?
? appContext.OriginalRequestUrl.IsNullOrWhiteSpace()
// we've got nothing
? null
//the orig req url is not null, use that
: string.Format("http{0}://{1}", GlobalSettings.UseSSL ? "s" : "", appContext.OriginalRequestUrl)
// the config has been specified, use that
: string.Format("http{0}://{1}", GlobalSettings.UseSSL ? "s" : "", settings.ScheduledTasks.BaseUrl))
.EnsureEndsWith('/');
}
}
}

View File

@@ -317,5 +317,25 @@ namespace Umbraco.Core
}
}
// this exists because
// new XElement("root", "a\nb").Value is "a\nb" but
// .ToString(SaveOptions.*) is "a\r\nb" and cannot figure out how to get rid of "\r"
// and when saving data we want nothing to change
// this method will produce a string that respects the \r and \n in the data value
public static string ToDataString(this XElement xml)
{
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = true,
NewLineHandling = NewLineHandling.None,
Indent = false
};
var output = new StringBuilder();
using (var writer = XmlWriter.Create(output, settings))
{
xml.WriteTo(writer);
}
return output.ToString();
}
}
}

View File

@@ -1,92 +1,105 @@
using System.Configuration;
using System.IO;
using System.Linq;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.Profiling;
using Umbraco.Core.Sync;
using Umbraco.Tests.TestHelpers;
namespace Umbraco.Tests
{
[TestFixture]
public class ServerEnvironmentHelperTests
{
[Test]
public void Get_Base_Url_Single_Server_Orig_Request_Url_No_SSL()
private ILogger _logger;
// note: in tests, read appContext._umbracoApplicationUrl and not the property,
// because reading the property does run some code, as long as the field is null.
[TestFixtureSetUp]
public void InitializeFixture()
{
var appContext = new ApplicationContext(null)
{
OriginalRequestUrl = "test.com"
};
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "false");
var result = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(
appContext,
Mock.Of<IUmbracoSettingsSection>(
section =>
section.DistributedCall == Mock.Of<IDistributedCallSection>(callSection => callSection.Servers == Enumerable.Empty<IServer>())
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>()));
Assert.AreEqual("http://test.com/", result);
_logger = new Logger(new FileInfo(TestHelper.MapPathForTest("~/unit-test-log4net.config")));
}
[Test]
public void Get_Base_Url_Single_Server_Orig_Request_Url_With_SSL()
public void SetApplicationUrlWhenNoSettings()
{
var appContext = new ApplicationContext(null)
{
OriginalRequestUrl = "test.com"
UmbracoApplicationUrl = null // NOT set
};
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "true");
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "true"); // does not make a diff here
var result = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(
appContext,
ServerEnvironmentHelper.TrySetApplicationUrlFromSettings(appContext, _logger,
Mock.Of<IUmbracoSettingsSection>(
section =>
section.DistributedCall == Mock.Of<IDistributedCallSection>(callSection => callSection.Servers == Enumerable.Empty<IServer>())
&& section.WebRouting == Mock.Of<IWebRoutingSection>(wrSection => wrSection.UmbracoApplicationUrl == (string) null)
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>()));
Assert.AreEqual("https://test.com/", result);
// still NOT set
Assert.IsNull(appContext._umbracoApplicationUrl);
}
[Test]
public void Get_Base_Url_Single_Server_Via_Config_Url_No_SSL()
public void SetApplicationUrlFromDcSettingsNoSsl()
{
var appContext = new ApplicationContext(null);
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "false");
var result = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(
appContext,
ServerEnvironmentHelper.TrySetApplicationUrlFromSettings(appContext, _logger,
Mock.Of<IUmbracoSettingsSection>(
section =>
section.DistributedCall == Mock.Of<IDistributedCallSection>(callSection => callSection.Servers == Enumerable.Empty<IServer>())
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>(tasksSection => tasksSection.BaseUrl == "mycoolhost.com/hello/world")));
&& section.WebRouting == Mock.Of<IWebRoutingSection>(wrSection => wrSection.UmbracoApplicationUrl == (string) null)
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>(tasksSection => tasksSection.BaseUrl == "mycoolhost.com/hello/world/")));
Assert.AreEqual("http://mycoolhost.com/hello/world/", result);
Assert.AreEqual("http://mycoolhost.com/hello/world", appContext._umbracoApplicationUrl);
}
[Test]
public void Get_Base_Url_Single_Server_Via_Config_Url_With_SSL()
public void SetApplicationUrlFromDcSettingsSsl()
{
var appContext = new ApplicationContext(null);
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "true");
var result = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(
appContext,
ServerEnvironmentHelper.TrySetApplicationUrlFromSettings(appContext, _logger,
Mock.Of<IUmbracoSettingsSection>(
section =>
section.DistributedCall == Mock.Of<IDistributedCallSection>(callSection => callSection.Servers == Enumerable.Empty<IServer>())
&& section.WebRouting == Mock.Of<IWebRoutingSection>(wrSection => wrSection.UmbracoApplicationUrl == (string) null)
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>(tasksSection => tasksSection.BaseUrl == "mycoolhost.com/hello/world")));
Assert.AreEqual("https://mycoolhost.com/hello/world/", result);
Assert.AreEqual("https://mycoolhost.com/hello/world", appContext._umbracoApplicationUrl);
}
[Test]
public void SetApplicationUrlFromWrSettingsSsl()
{
var appContext = new ApplicationContext(null);
ConfigurationManager.AppSettings.Set("umbracoUseSSL", "true"); // does not make a diff here
ServerEnvironmentHelper.TrySetApplicationUrlFromSettings(appContext, _logger,
Mock.Of<IUmbracoSettingsSection>(
section =>
section.DistributedCall == Mock.Of<IDistributedCallSection>(callSection => callSection.Servers == Enumerable.Empty<IServer>())
&& section.WebRouting == Mock.Of<IWebRoutingSection>(wrSection => wrSection.UmbracoApplicationUrl == "httpx://whatever.com/hello/world/")
&& section.ScheduledTasks == Mock.Of<IScheduledTasksSection>(tasksSection => tasksSection.BaseUrl == "mycoolhost.com/hello/world")));
Assert.AreEqual("httpx://whatever.com/hello/world", appContext._umbracoApplicationUrl);
}
}
}

View File

@@ -8,6 +8,7 @@
<key alias="assignDomain">ドメインの割り当て</key>
<key alias="auditTrail">動作記録</key>
<key alias="browse">ノードの参照</key>
<key alias="changeDocType">ドキュメントタイプの変更</key>
<key alias="copy">コピー</key>
<key alias="create">新規作成</key>
<key alias="createPackage">パッケージの作成</key>
@@ -26,6 +27,7 @@
<key alias="unpublish">公開を止める</key>
<key alias="refreshNode">最新の情報に更新</key>
<key alias="republish">サイトのリフレッシュ</key>
<key alias="restore" version="7.3.0">復元</key>
<key alias="rights">アクセス権</key>
<key alias="rollback">以前の版に戻る</key>
<key alias="sendtopublish">公開に送る</key>
@@ -34,22 +36,35 @@
<key alias="toPublish">公開する</key>
<key alias="translate">翻訳</key>
<key alias="update">更新</key>
<key alias="defaultValue">初期値</key>
</area>
<area alias="assignDomain">
<key alias="permissionDenied">アクセスが拒否されました</key>
<key alias="addNew">ドメインの割り当て</key>
<key alias="remove">ドメインの削除</key>
<key alias="invalidNode">適当でないノード名</key>
<key alias="invalidDomain">適当でないホスト名</key>
<key alias="duplicateDomain">そのホスト名は既に利用されています</key>
<key alias="language">言語コード</key>
<key alias="domain">ドメイン</key>
<key alias="domainCreated">ドメイン '%0%' が新たに割り当てられました</key>
<key alias="domainDeleted">ドメイン '%0%' は削除されました</key>
<key alias="domainExists">ドメイン '%0%' は既に割り当てられています</key>
<key alias="domainHelp">例: yourdomain.com, www.yourdomain.com</key>
<key alias="domainUpdated">ドメイン '%0%' は更新されました</key>
<key alias="orEdit">ドメインの編集</key>
<key alias="domainHelp"><![CDATA[例: yourdomain.com, www.yourdomain.com]]></key>
<key alias="inherit">Inherit</key>
<key alias="setLanguage">カルチャの割り当て</key>
<key alias="setLanguageHelp"><![CDATA[現在のノード以下のカルチャを設定します。親ノードのカルチャを継承します。]]></key>
<key alias="setDomains">ドメインの割り当て</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">これらを表示</key>
</area>
<area alias="buttons">
<key alias="select">選択</key>
<key alias="selectCurrentFolder">現在のフォルダを選択</key>
<key alias="somethingElse">その他のアクション</key>
<key alias="bold">太字</key>
<key alias="deindent">インデント解除</key>
<key alias="formFieldInsert">フィールドから挿入</key>
@@ -67,6 +82,7 @@
<key alias="macroInsert">マクロの挿入</key>
<key alias="pictureInsert">画像の挿入</key>
<key alias="relations">関係性の編集</key>
<key alias="returnToList">リストに戻る</key>
<key alias="save">保存</key>
<key alias="saveAndPublish">保存及び公開</key>
<key alias="saveToPublish">保存して承認に送る</key>
@@ -76,20 +92,45 @@
<key alias="styleShow">スタイルの表示</key>
<key alias="tableInsert">表の挿入</key>
</area>
<area alias="changeDocType">
<key alias="changeDocTypeInstruction">ドキュメントタイプを変更するには、まず有効なドキュメントタイプのリストから選択します</key>
<key alias="changeDocTypeInstruction2">確認および現在のドキュメントタイプからのマッピングを割り当て、保存します。</key>
<key alias="contentRepublished">コンテントは再公開されています</key>
<key alias="currentProperty">現在のプロパティ</key>
<key alias="currentType">現在のドキュメントタイプ</key>
<key alias="docTypeCannotBeChanged">有効な代替タイプが存在しないため変更することができません。選択されたコンテントの親の下に許可されたドキュメントタイプへのみ変更ができます</key>
<key alias="docTypeChanged">ドキュメントタイプを変更しました</key>
<key alias="mapProperties">プロパティを割り当てる</key>
<key alias="mapToProperty">割り当てるプロパティ</key>
<key alias="newTemplate">新しいテンプレート</key>
<key alias="newType">新しいドキュメントタイプ</key>
<key alias="none">None</key>
<key alias="selectedContent">コンテント</key>
<key alias="selectNewDocType">ドキュメントタイプを変更する</key>
<key alias="successMessage">プロパティが以下のように割り当てられました</key>
<key alias="to">から</key>
<key alias="validationErrorPropertyWithMoreThanOneMapping">1つ以上のプロパティを割り当てられませんでした。プロパティが定義が重複しています</key>
<key alias="validDocTypesNote">有効なドキュメントタイプのみが表示されます</key>
</area>
<area alias="content">
<key alias="isPublished" version="7.2">公開されました</key>
<key alias="about">このページについて</key>
<key alias="alias">エイリアス</key>
<key alias="alternativeTextHelp">(画像を電話でわかるように言葉で説明)</key>
<key alias="alternativeUrls">別名のリンク</key>
<key alias="clickToEdit">クリックでアイテムを編集する</key>
<key alias="createBy">作成者</key>
<key alias="createByDesc" version="7.0">作成者</key>
<key alias="updatedBy" version="7.0">更新者</key>
<key alias="createDate">作成日時</key>
<key alias="createDateDesc" version="7.0">このドキュメントが作成された日時</key>
<key alias="documentType">ドキュメントタイプ</key>
<key alias="editing">変種中</key>
<key alias="expireDate">公開終了日時</key>
<key alias="itemChanged">このページは公開後変更されています</key>
<key alias="itemNotPublished">このページは公開されていません</key>
<key alias="lastPublished">公開日時</key>
<key alias="listViewNoItems" version="7.1.5">リストに表示するアイテムはありません</key>
<key alias="mediatype">メディアタイプ</key>
<key alias="mediaLinks">メディアの項目へのリンク</key>
<key alias="membergroup">メンバーグループ</key>
@@ -99,24 +140,38 @@
<key alias="nodeName">タイトル</key>
<key alias="otherElements">プロパティ</key>
<key alias="parentNotPublished">このページは公開されましたが、親ページの '%0%' が非公開のため閲覧できません</key>
<key alias="parentNotPublishedAnomaly">このコンテントは公開されていますがキャッシュされていません(内部エラー)</key>
<key alias="publish">公開</key>
<key alias="publishStatus">公開状態</key>
<key alias="releaseDate">公開開始日時</key>
<key alias="unpublishDate">公開停止日時</key>
<key alias="removeDate">日時の消去</key>
<key alias="sortDone">並び順が更新されました</key>
<key alias="sortHelp">ードをドラッグ、クリック、または列のヘッダーをクリックする事でードを簡単にソートできます。SHIFT、CONTROLキーを使い複数のードを選択する事もできます。</key>
<key alias="statistics">統計</key>
<key alias="titleOptional">タイトル (オプション)</key>
<key alias="altTextOptional">代替テキスト (オプション)</key>
<key alias="type"></key>
<key alias="unPublish">非公開</key>
<key alias="updateDate">最終更新日時</key>
<key alias="updateDateDesc" version="7.0">このドキュメントが最後に更新された日時</key>
<key alias="uploadClear">ファイルの消去</key>
<key alias="urls">ページへのリンク</key>
<key alias="memberof">グループのメンバー</key>
<key alias="notmemberof">グループのメンバーではありません</key>
<key alias="childItems" version="7.0">子コンテンツ</key>
<key alias="target" version="7.0">ターゲット</key>
</area>
<area alias="media">
<key alias="clickToUpload">クリックしてアップロードする</key>
<key alias="dropFilesHere">ファイルをここへドロップ..</key>
</area>
<area alias="create">
<key alias="chooseNode">どこに新しい %0% を作りますか</key>
<key alias="createUnder">ここに作成</key>
<key alias="updateData">型とタイトルを選んでください</key>
<key alias="noDocumentTypes" version="7.0"><![CDATA[利用可能なドキュメントタイプがありません。以下の設定セクションでこれらを有効にする必要があります。<strong>"document types"</strong>.]]></key>
<key alias="noMediaTypes" version="7.0"><![CDATA[利用可能なメディアタイプがありません。以下の設定セクションでこれらを有効にする必要があります。<strong>"media types"</strong>.]]></key>
</area>
<area alias="dashboard">
<key alias="browser">ウェブサイトを参照する</key>
@@ -181,14 +236,32 @@
]]></key>
<key alias="displayName">カルチャ名</key>
</area>
<area alias="placeholders">
<key alias="username">ユーザー名を入力...</key>
<key alias="password">パスワードを入力...</key>
<key alias="nameentity">%0%と命名します...</key>
<key alias="entername">ここに名称を入力してください...</key>
<key alias="search">検索する...</key>
<key alias="filter">条件で絞り込む...</key>
<key alias="enterTags">タグを追加します...</key>
</area>
<area alias="editcontenttype">
<key alias="allowAtRoot" version="7.2">ルートノードとして許可する</key>
<key alias="allowAtRootDesc" version="7.2">これを有効にするとコンテンツとメディアツリーのルートレベルに作成することができます</key>
<key alias="allowedchildnodetypes">子ノードとして許可するタイプ</key>
<key alias="contenttypecompositions">Document Type Compositions</key>
<key alias="create">新規作成</key>
<key alias="deletetab">削除</key>
<key alias="description">説明</key>
<key alias="newtab">新規見出し</key>
<key alias="tab">見出し</key>
<key alias="thumbnail">サムネイル</key>
<key alias="hasListView">リストビューを有効にする</key>
<key alias="hasListViewDesc" version="7.2">子ノードをツリーに表示せずにリストビューに表示します</key>
<key alias="currentListView" version="7.2">現在のリストビュー</key>
<key alias="currentListViewDesc" version="7.2">有効なリストビューデータタイプ</key>
<key alias="createListView" version="7.2">カスタムリストビューを作成する</key>
<key alias="removeListView" version="7.2">カスタムリストビューを削除する</key>
</area>
<area alias="editdatatype">
<key alias="addPrevalue">値の前に追加</key>
@@ -217,7 +290,8 @@
<key alias="errorRegExpWithoutTab">%0% は正しい書式ではありません</key>
</area>
<area alias="errors">
<key alias="codemirroriewarning">注意! CodeMirrorが設定で有効かされていますが、 Internet Explorerでは不安定なので無効化してください。</key>
<key alias="dissallowedMediaType">指定されたファイルタイプは管理者のみに許可されます</key>
<key alias="codemirroriewarning">注意! CodeMirrorが設定で有効化されていますが、 Internet Explorerでは不安定なので無効化してください。</key>
<key alias="contentTypeAliasAndNameNotNull">新しいプロパティ型のエイリアスと名前の両方を設定してください!</key>
<key alias="filePermissionsError">特定のファイルまたはフォルタの読み込み/書き込みアクセスに問題があります</key>
<key alias="missingTitle">タイトルを入力してください</key>
@@ -232,10 +306,12 @@
<key alias="tableSplitNotSplittable">このセルは結合されたものではないので分離する事はできません。</key>
<key alias="xsltErrorHeader">XSLTソースにエラーがあります</key>
<key alias="xsltErrorText">1つ以上のエラーがあるのでこのXSLTは保存できませんでした</key>
<key alias="missingPropertyEditorErrorMessage">このプロパティに使用されているデータタイプにエラーがあります</key>
</area>
<area alias="general">
<key alias="about">Umbracoについて</key>
<key alias="action">アクション</key>
<key alias="actions">アクション選択</key>
<key alias="add">追加</key>
<key alias="alias">エイリアス</key>
<key alias="areyousure">確かですか?</key>
@@ -285,6 +361,7 @@
<key alias="logout">ログアウト</key>
<key alias="macro">マクロ</key>
<key alias="move">移動</key>
<key alias="more">もっと</key>
<key alias="name">名前</key>
<key alias="new">新規</key>
<key alias="next">次へ</key>
@@ -304,6 +381,7 @@
<key alias="remaining">残り</key>
<key alias="rename">名前の変更</key>
<key alias="renew">更新</key>
<key alias="required" version="7.0">この項目は必須です</key>
<key alias="retry">再試行</key>
<key alias="rights">許可</key>
<key alias="search">検索</key>
@@ -313,7 +391,7 @@
<key alias="size">サイズ</key>
<key alias="sort">並べ替え</key>
<key alias="type"></key>
<key alias="typeToSearch">探す型...</key>
<key alias="typeToSearch">検索...</key>
<key alias="up"></key>
<key alias="update">更新</key>
<key alias="upgrade">アップグレード</key>
@@ -327,6 +405,7 @@
<key alias="width"></key>
<key alias="yes">はい</key>
<key alias="folder">フォルダー</key>
<key alias="searchResults">検索結果</key>
</area>
<area alias="graphicheadline">
<key alias="backgroundcolor">背景色</key>
@@ -348,10 +427,10 @@
]]></key>
<key alias="databaseInstallDone"><![CDATA[Umbraco %0% をデータベースにコピーします。<strong>次へ</strong>を押して続行してください。]]></key>
<key alias="databaseNotFound"><![CDATA[<p>データベースを見つけられません!"web.config"ファイルの中の"接続文字列"を確認してください。</p>
<p>続行するには"web.config"ファイルを編集(Visual Studioないし使い慣れたテキストエディタで)し、下の方にスクロールし、"UmbracoDbDSN"という名前のキーでデータベースの接続文字列を追加して保存します。</p>
<p>続行するには"web.config"ファイルを編集(Visual Studioないし使い慣れたテキストエディタで)し、下の方にスクロールし、"umbracoDbDSN"という名前のキーでデータベースの接続文字列を追加して保存します。</p>
<p>
<strong>再施行</strong>ボタンをクリックして
続けます。<br /><a href="http://our.umbraco.org/documentation/Using-Umbraco/Config-files/webconfig7" target="_blank">
続けます。<br /><a href="http://umbraco.org/redir/installWebConfig" target="_blank">
より詳細にはこちらの web.config を編集します。</a></p>]]></key>
<key alias="databaseText"><![CDATA[このステップを完了するには、データベースサーバー(の"接続文字列")について把握していなければなりません。<br />
必要ならISPに連絡するなどしてみてください。
@@ -380,7 +459,7 @@
</p>
]]></key>
<key alias="greatStart">始めに、ビデオによる解説を見ましょう</key>
<key alias="licenseText">次へボタンをクリック(またはweb.configのUmbracoConfigurationStatusを編集)すると、あなたはここに示されるこのソフトウェアのライセンスを承諾したと見做されます。注意として、UmbracoはMITライセンスをフレームワークへ、フリーウェアライセンスをUIへ、それぞれ異なる2つのライセンスを採用しています。</key>
<key alias="licenseText">次へボタンをクリック(またはweb.configのumbracoConfigurationStatusを編集)すると、あなたはここに示されるこのソフトウェアのライセンスを承諾したと見做されます。注意として、UmbracoはMITライセンスをフレームワークへ、フリーウェアライセンスをUIへ、それぞれ異なる2つのライセンスを採用しています。</key>
<key alias="None">まだインストールは完了していません。</key>
<key alias="permissionsAffectedFolders">影響するファイルとフォルダ</key>
<key alias="permissionsAffectedFoldersMoreInfo">Umbracoに必要なアクセス権の設定についての詳細はこちらをどうぞ</key>
@@ -408,7 +487,7 @@
<key alias="runwayFromScratch">スクラッチから始めたい</key>
<key alias="runwayFromScratchText"><![CDATA[
ウェブサイトはさしあたり完全に空っぽで、必要なドキュメント型やテンプレートを作成するところから始められます。
(<a href="http://Umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">どうしたらいいの?</a>)
(<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">どうしたらいいの?</a>)
後からRunwayをインストールする事もできます。そうしたくなった時は、Developerセクションのパッケージへどうぞ。
]]></key>
<key alias="runwayHeader">Umbracoプラットフォームのクリーンセットアップが完了しました。この後はどうしますか</key>
@@ -444,7 +523,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
我々の認めるコミュニティから手助けを得られるでしょう。どうしたら簡単なサイトを構築できるか、どうしたらパッケージを使えるかについてのビデオや文書、またUmbracoの用語のクイックガイドも見る事ができます。]]></key>
<key alias="theEndHeader">Umbraco %0% のインストールは完了、準備が整いました</key>
<key alias="theEndInstallFailed"><![CDATA[インストールを終えた後、もし必要ならば
<strong>/web.config file</strong>を手作業で編集し、<strong>'%0%'</strong>の下にある<strong>UmbracoConfigurationStatus</strong>キーを設定してください。]]></key>
<strong>/web.config file</strong>を手作業で編集し、<strong>'%0%'</strong>の下にある<strong>umbracoConfigurationStatus</strong>キーを設定してください。]]></key>
<key alias="theEndInstallSuccess"><![CDATA["Umbracoを始める"ボタンをクリックして<strong>今すぐ開始</strong>できます。<br />もし<strong>Umbracoの初心者</strong>なら、
私たちの初心者向けのたくさんの情報を参考にしてください。]]></key>
<key alias="theEndOpenUmbraco"><![CDATA[<h3>Umbracoの開始</h3>
@@ -453,7 +532,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="Version3">Umbraco Version 3</key>
<key alias="Version4">Umbraco Version 4</key>
<key alias="watch">見る</key>
<key alias="welcomeIntro"><![CDATA[このウィザードでは <strong>Umbraco %0%</strong> の新規インストールまたは3.0からの更新について設定方法を案内します。
<key alias="welcomeIntro"><![CDATA[このウィザードでは <strong>umbraco %0%</strong> の新規インストールまたは3.0からの更新について設定方法を案内します。
<br /><br />
<strong>"次へ"</strong>を押してウィザードを開始します。]]></key>
</area>
@@ -466,7 +545,16 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="renewSession">作業を保存して今すぐ更新</key>
</area>
<area alias="login">
<key alias="bottomText"><![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.com</a></p> ]]></key>
<key alias="greeting0">Happy super sunday</key>
<key alias="greeting1">Happy manic monday </key>
<key alias="greeting2">Happy tubular tuesday</key>
<key alias="greeting3">Happy wonderful wednesday</key>
<key alias="greeting4">Happy thunder thursday</key>
<key alias="greeting5">Happy funky friday</key>
<key alias="greeting6">Happy caturday</key>
<key alias="instruction">ウェブサイトにログインします。</key>
<key alias="timeout">セッションタイムアウトしました。</key>
<key alias="bottomText"><![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.org" style="text-decoration: none" target="_blank">umbraco.org</a></p> ]]></key>
<key alias="topText">Umbraco にようこそ。ユーザー名とパスワードを入力してください:</key>
</area>
<area alias="main">
@@ -549,7 +637,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="packageUninstallConfirm">本当にアンインストールしますか</key>
<key alias="packageUninstalledHeader">パッケージのアンインストールが終了しました</key>
<key alias="packageUninstalledText">パッケージが正常にアンインストールされました</key>
<key alias="packageUninstallHeader">パッケージのアンンストール</key>
<key alias="packageUninstallHeader">パッケージのアンンストール</key>
<key alias="packageUninstallText"><![CDATA[今はまだ削除したくない項目の選択を解除できます。"アンインストールの確認"をクリックすると全てのチェックの外された項目を削除します。<br />
<span style="color: Red; font-weight: bold;">注意:</span> 全ての、文書やメディアなどに依存したアイテムを削除する場合はそれらの作業を一端止めてからアンインストールしなければシステムが不安定になる恐れがあります。
疑問点などあればパッケージの作者へ連絡してください。]]></key>
@@ -558,6 +646,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="packageUpgradeInstructions">更新の手順</key>
<key alias="packageUpgradeText"> このパッケージの更新があります。Umbracoのパッケージリポジトリから直接ダウンロードできます。</key>
<key alias="packageVersion">パッケージのバージョン</key>
<key alias="packageVersionHistory">パッケージのバージョン履歴</key>
<key alias="viewPackageWebsite">パッケージのウェブサイトを見る</key>
</area>
<area alias="paste">
@@ -585,14 +674,15 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="paSimpleHelp">単一のログインとパスワードで単純に保護したい場合に適します</key>
</area>
<area alias="publish">
<key alias="contentPublishedFailedAwaitingRelease"><![CDATA[
%0% ページは公開がスケジュールされているため、公開されませんでした。
]]></key>
<key alias="contentPublishedFailedByEvent"><![CDATA[
サードパーティのエクステンションがキャンセルされたので、%0% は公開できませんでした。
]]></key>
<key alias="contentPublishedFailedByParent">
<![CDATA[
<key alias="contentPublishedFailedByParent"><![CDATA[
親ページが公開されていないので、%0% は公開できませんでした。
]]>
</key>
]]></key>
<key alias="includeUnpublished">非公開の子ページも含めます</key>
<key alias="inProgress">公開を進めています - 少々お待ちください...</key>
<key alias="inProgressCounter">%1% ページ中 %0% ページが公開されました...</key>
@@ -615,6 +705,9 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="newWindow">新規ウィンドウで開く</key>
<key alias="removeLink">リンクを削除</key>
</area>
<area alias="imagecropper">
<key alias="reset">リセット</key>
</area>
<area alias="rollback">
<key alias="currentVersion">現在の版</key>
<key alias="diffHelp"><![CDATA[現在の版と選択した以前の版との比較を表示します。<br /><del>赤</del> の文字列は以前の版にはない部分で、<ins>緑の文字列は以前の版にのみある部分です。</ins>]]></key>
@@ -640,6 +733,9 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="statistics">統計</key>
<key alias="translation">翻訳</key>
<key alias="users">ユーザー</key>
<key alias="help" version="7.0">ヘルプ</key>
<key alias="forms">フォーム</key>
<key alias="analytics">アナリティクス</key>
</area>
<area alias="settings">
<key alias="defaulttemplate">既定のテンプレート</key>
@@ -649,6 +745,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="nodetype">ノードのタイプ</key>
<key alias="objecttype">タイプ</key>
<key alias="stylesheet">スタイルシート</key>
<key alias="script">スクリプト</key>
<key alias="stylesheet editor egenskab">スタイルシートのプロパティ</key>
<key alias="tab">タブ</key>
<key alias="tabname">タブの名前</key>
@@ -656,6 +753,9 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="contentTypeEnabled">マスターコンテンツタイプが有効</key>
<key alias="contentTypeUses">このコンテンツタイプの使用</key>
<key alias="asAContentMasterType">マスターコンテンツタイプについては、マスターコンテンツタイプからのタブは表示されず、マスターコンテンツタイプでのみ編集することができます。</key>
<key alias="noPropertiesDefinedOnTab">このタブにはプロパティが定義されていません、上部のリンクから新しいプロパティを作成してください</key>
<key alias="masterDocumentType">マスタードキュメントタイプ</key>
<key alias="createMatchingTemplate">テンプレートを作成する</key>
</area>
<area alias="sort">
<key alias="sortDone">ソートが完了しました。</key>
@@ -684,6 +784,8 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="editContentSavedText">変更を適用する為に公開する事を忘れないでください</key>
<key alias="editContentSendToPublish">承認へ送りました</key>
<key alias="editContentSendToPublishText">変更は承認へと送られます</key>
<key alias="editMediaSaved">メディアを保存しました</key>
<key alias="editMediaSavedText">メディアをエラーなく保存しました</key>
<key alias="editMemberSaved">メンバーを保存しました</key>
<key alias="editStylesheetPropertySaved">スタイルシートのプロパティを保存しました</key>
<key alias="editStylesheetSaved">スタイルシートを保存しました</key>
@@ -729,15 +831,53 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="insertContentAreaPlaceHolder">コンテンツ領域プレースホルダーの挿入</key>
<key alias="insertDictionaryItem">dictionary item の挿入</key>
<key alias="insertMacro">マクロの挿入</key>
<key alias="insertPageField">Umbraco ページフィールドの挿入</key>
<key alias="insertPageField">umbraco ページフィールドの挿入</key>
<key alias="mastertemplate">マスターテンプレート</key>
<key alias="quickGuide">Umbraco テンプレートタグのクイックガイド</key>
<key alias="quickGuide">umbraco テンプレートタグのクイックガイド</key>
<key alias="template">テンプレート</key>
</area>
<area alias="grid">
<key alias="insertControl">挿入するアイテムを選択する</key>
<key alias="addRows">ここからレイアウトを選択します</key>
<key alias="addElement"><![CDATA[<i class="icon icon-add blue"></i> 最初の要素を追加します]]></key>
<key alias="clickToEmbed">クリックして埋め込む</key>
<key alias="clickToInsertImage">クリックして画像を挿入する</key>
<key alias="placeholderImageCaption">キャプション...</key>
<key alias="placeholderWriteHere">ここに記入する...</key>
<key alias="gridLayouts">レイアウト</key>
<key alias="gridLayoutsDetail">レイアウトは通常1つまたは2つの異なるレイアウトを必要とする、グリッドエディタの全体的な作業エリアです</key>
<key alias="addGridLayout">レイアウトを追加する</key>
<key alias="addGridLayoutDetail">追加のセクションの横幅を設定し、レイアウトを調整する</key>
<key alias="rowConfigurations">行の構成</key>
<key alias="rowConfigurationsDetail">定義された構成の行が水平に配置されます</key>
<key alias="addRowConfiguration">行の構成を追加</key>
<key alias="addRowConfigurationDetail">追加のセルのセル幅を設定することで調整します</key>
<key alias="columns"></key>
<key alias="columnsDetails">グリッドレイアウトの列を合計した数</key>
<key alias="settings">設定</key>
<key alias="settingsDetails">編集者が設定できる項目</key>
<key alias="styles">スタイル</key>
<key alias="stylesDetails">編集者が設定できるスタイル</key>
<key alias="settingDialogDetails">入力されたJSONが正しい場合のみ設定が保存されます</key>
<key alias="allowAllEditors">すべてのエディタを許可する</key>
<key alias="allowAllRowConfigurations">すべての行の構成を許可する</key>
</area>
<area alias="templateEditor">
<key alias="alternativeField">代替フィールド</key>
<key alias="alternativeText">代替テキスト</key>
<key alias="casing">大文字小文字変換</key>
<key alias="encoding">エンコーディング</key>
<key alias="chooseField">フィールドの選択</key>
<key alias="convertLineBreaks">改行コードの変換</key>
<key alias="convertLineBreaksHelp">改行コードをhtmlタグ &amp;lt;br&amp;gt; に変換する</key>
@@ -838,6 +978,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="stylesheets">スタイルシート</key>
<key alias="templates">テンプレート</key>
<key alias="xslt">XSLT ファイル</key>
<key alias="analytics">アナリティクス</key>
</area>
<area alias="update">
<key alias="updateAvailable">新しい更新があります</key>
@@ -864,6 +1005,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="modules">セクション</key>
<key alias="noConsole">Umbracoへのアクセスを無効にする</key>
<key alias="password">パスワード</key>
<key alias="resetPassword">パスワードのリセット</key>
<key alias="passwordChanged">パスワードが変更されました!</key>
<key alias="passwordConfirm">新しいパスワードの確認</key>
<key alias="passwordEnterNew">新しいパスワードの入力</key>
@@ -882,5 +1024,9 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="usertype">ユーザーの種類</key>
<key alias="userTypes">ユーザーの種類</key>
<key alias="writer">投稿者</key>
<key alias="translator">翻訳者</key>
<key alias="yourProfile" version="7.0">あなたのプロフィール</key>
<key alias="yourHistory" version="7.0">あなたの最新の履歴</key>
<key alias="sessionExpires" version="7.0">セッションの期限</key>
</area>
</language>

View File

@@ -1,10 +1,8 @@
using System;
using System.Net;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.Sync;
namespace Umbraco.Web.Scheduling
{
@@ -14,31 +12,27 @@ namespace Umbraco.Web.Scheduling
{
using (DisposableTimer.DebugDuration<KeepAlive>(() => "Keep alive executing", () => "Keep alive complete"))
{
var umbracoBaseUrl = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(
appContext,
settings);
if (string.IsNullOrWhiteSpace(umbracoBaseUrl))
var umbracoAppUrl = appContext.UmbracoApplicationUrl;
if (umbracoAppUrl.IsNullOrWhiteSpace())
{
LogHelper.Warn<KeepAlive>("No url for service (yet), skip.");
return;
}
else
{
var url = string.Format("{0}ping.aspx", umbracoBaseUrl.EnsureEndsWith('/'));
try
var url = umbracoAppUrl + "/ping.aspx";
try
{
using (var wc = new WebClient())
{
using (var wc = new WebClient())
{
wc.DownloadString(url);
}
wc.DownloadString(url);
}
catch (Exception ee)
{
LogHelper.Error<KeepAlive>(
string.Format("Error in ping. The base url used in the request was: {0}, see http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks documentation for details on setting a baseUrl if this is in error", umbracoBaseUrl)
}
catch (Exception ee)
{
LogHelper.Error<KeepAlive>(
string.Format("Error in ping. The base url used in the request was: {0}, see http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks documentation for details on setting a baseUrl if this is in error", umbracoAppUrl)
, ee);
}
}
}

View File

@@ -58,44 +58,41 @@ namespace Umbraco.Web.Scheduling
_isPublishingRunning = true;
var umbracoBaseUrl = ServerEnvironmentHelper.GetCurrentServerUmbracoBaseUrl(_appContext, _settings);
var umbracoAppUrl = _appContext.UmbracoApplicationUrl;
if (umbracoAppUrl.IsNullOrWhiteSpace())
{
LogHelper.Warn<ScheduledPublishing>("No url for service (yet), skip.");
return;
}
try
{
if (string.IsNullOrWhiteSpace(umbracoBaseUrl))
var url = umbracoAppUrl + "/RestServices/ScheduledPublish/Index";
using (var wc = new HttpClient())
{
LogHelper.Warn<ScheduledPublishing>("No url for service (yet), skip.");
}
else
{
var url = string.Format("{0}RestServices/ScheduledPublish/Index", umbracoBaseUrl.EnsureEndsWith('/'));
using (var wc = new HttpClient())
var request = new HttpRequestMessage()
{
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Post,
Content = new StringContent(string.Empty)
};
//pass custom the authorization header
request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext);
RequestUri = new Uri(url),
Method = HttpMethod.Post,
Content = new StringContent(string.Empty)
};
//pass custom the authorization header
request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext);
try
{
var result = await wc.SendAsync(request, token);
}
catch (Exception ex)
{
LogHelper.Error<ScheduledPublishing>("An error occurred calling scheduled publish url", ex);
}
try
{
var result = await wc.SendAsync(request, token);
}
catch (Exception ex)
{
LogHelper.Error<ScheduledPublishing>("An error occurred calling scheduled publish url", ex);
}
}
}
catch (Exception ee)
{
LogHelper.Error<ScheduledPublishing>(
string.Format("An error occurred with the scheduled publishing. The base url used in the request was: {0}, see http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks documentation for details on setting a baseUrl if this is in error", umbracoBaseUrl)
string.Format("An error occurred with the scheduled publishing. The base url used in the request was: {0}, see http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks documentation for details on setting a baseUrl if this is in error", umbracoAppUrl)
, ee);
}
finally

View File

@@ -36,37 +36,47 @@ namespace Umbraco.Web
{
#region HttpModule event handlers
private static void EnsureApplicationUrl(HttpRequestBase request)
{
var appctx = ApplicationContext.Current;
// already initialized = ok
// note that getting ApplicationUrl will ALSO try the various settings
if (appctx.UmbracoApplicationUrl.IsNullOrWhiteSpace() == false) return;
// so if we reach that point, nothing was configured
// use the current request as application url
// if (HTTP and SSL not required) or (HTTPS and SSL required),
// use ports from request
// otherwise,
// if non-standard ports used,
// user may need to set baseUrl manually per
// http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks
// TODO update the doc, prefer web.routing/@appUrl to scheduledTasks/@baseUrl
var port = (request.IsSecureConnection == false && GlobalSettings.UseSSL == false)
|| (request.IsSecureConnection && GlobalSettings.UseSSL)
? ":" + request.ServerVariables["SERVER_PORT"]
: "";
var ssl = GlobalSettings.UseSSL ? "s" : ""; // force, whatever the first request
var url = "http" + ssl + "://" + request.ServerVariables["SERVER_NAME"] + port + IOHelper.ResolveUrl(SystemDirectories.Umbraco);
appctx.UmbracoApplicationUrl = UriUtility.TrimPathEndSlash(url);
LogHelper.Info<ApplicationContext>("ApplicationUrl: " + appctx.UmbracoApplicationUrl + " (UmbracoModule request)");
}
/// <summary>
/// Begins to process a request.
/// </summary>
/// <param name="httpContext"></param>
static void BeginRequest(HttpContextBase httpContext)
{
// ensure application url is initialized
EnsureApplicationUrl(httpContext.Request);
//we need to set the initial url in our ApplicationContext, this is so our keep alive service works and this must
//exist on a global context because the keep alive service doesn't run in a web context.
//we are NOT going to put a lock on this because locking will slow down the application and we don't really care
//if two threads write to this at the exact same time during first page hit.
//see: http://issues.umbraco.org/issue/U4-2059
if (ApplicationContext.Current.OriginalRequestUrl.IsNullOrWhiteSpace())
{
// If (HTTP and SSL not required) or (HTTPS and SSL required), use ports from request to configure OriginalRequestUrl.
// Otherwise, user may need to set baseUrl manually per http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks if non-standard ports used.
if ((!httpContext.Request.IsSecureConnection && !GlobalSettings.UseSSL) || (httpContext.Request.IsSecureConnection && GlobalSettings.UseSSL))
{
// Use port from request.
ApplicationContext.Current.OriginalRequestUrl = string.Format("{0}:{1}{2}", httpContext.Request.ServerVariables["SERVER_NAME"], httpContext.Request.ServerVariables["SERVER_PORT"], IOHelper.ResolveUrl(SystemDirectories.Umbraco));
}
else
{
// Omit port entirely.
ApplicationContext.Current.OriginalRequestUrl = string.Format("{0}{1}", httpContext.Request.ServerVariables["SERVER_NAME"], IOHelper.ResolveUrl(SystemDirectories.Umbraco));
}
LogHelper.Info<UmbracoModule>("Setting OriginalRequestUrl: " + ApplicationContext.Current.OriginalRequestUrl);
}
// do not process if client-side request
// do not process if client-side request
if (httpContext.Request.Url.IsClientSideRequest())
return;

View File

@@ -18,9 +18,7 @@ namespace umbraco.presentation
var appContext = (ApplicationContext) sender;
//TODO: This won't always work, in load balanced scenarios ping will not work because
// this original request url will be public and not internal to the server.
var url = string.Format("http://{0}/ping.aspx", appContext.OriginalRequestUrl);
var url = appContext.UmbracoApplicationUrl + "/ping.aspx";
try
{
using (var wc = new WebClient())